Repository: AnalogJ/scrutiny Branch: master Commit: e4c40f7e8053 Files: 504 Total size: 4.5 MB Directory structure: gitextract_a01nueng/ ├── .devcontainer/ │ ├── docker/ │ │ └── devcontainer.json │ ├── docker-compose.yml │ ├── docker-rootless/ │ │ └── devcontainer.json │ ├── podman/ │ │ └── devcontainer.json │ └── setup.sh ├── .dockerignore ├── .gitattributes ├── .github/ │ ├── DISCUSSION_TEMPLATE/ │ │ └── issue-triage.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── config.yml │ │ └── preapproved.md │ └── workflows/ │ ├── ci.yaml │ ├── docker-build.yaml │ ├── docker-nightly.yaml │ ├── release.yaml │ └── sponsors.yaml ├── .gitignore ├── .golangci.yml ├── .vscode/ │ ├── launch.json │ └── tasks.json ├── AI_POLICY.md ├── CONTRIBUTING.md ├── LICENSE ├── Makefile ├── README.md ├── REFERENCES.md ├── collector/ │ ├── cmd/ │ │ ├── collector-metrics/ │ │ │ └── collector-metrics.go │ │ └── collector-selftest/ │ │ └── collector-selftest.go │ └── pkg/ │ ├── collector/ │ │ ├── base.go │ │ ├── metrics.go │ │ ├── metrics_test.go │ │ └── selftest.go │ ├── common/ │ │ └── shell/ │ │ ├── factory.go │ │ ├── interface.go │ │ ├── local_shell.go │ │ ├── local_shell_test.go │ │ └── mock/ │ │ └── mock_shell.go │ ├── config/ │ │ ├── config.go │ │ ├── config_test.go │ │ ├── factory.go │ │ ├── interface.go │ │ ├── mock/ │ │ │ └── mock_config.go │ │ └── testdata/ │ │ ├── allow_listed_devices_present.yaml │ │ ├── device_type_comma.yaml │ │ ├── ignore_device.yaml │ │ ├── invalid_commands_includes_device.yaml │ │ ├── invalid_commands_missing_json.yaml │ │ ├── override_commands.yaml │ │ ├── override_device_commands.yaml │ │ ├── raid_device.yaml │ │ └── simple_device.yaml │ ├── detect/ │ │ ├── detect.go │ │ ├── detect_test.go │ │ ├── devices_darwin.go │ │ ├── devices_freebsd.go │ │ ├── devices_linux.go │ │ ├── devices_linux_test.go │ │ ├── devices_windows.go │ │ ├── testdata/ │ │ │ ├── smartctl_info_nvme.json │ │ │ ├── smartctl_scan_megaraid.json │ │ │ ├── smartctl_scan_nvme.json │ │ │ └── smartctl_scan_simple.json │ │ ├── wwn.go │ │ └── wwn_test.go │ ├── errors/ │ │ ├── errors.go │ │ └── errors_test.go │ └── models/ │ ├── device.go │ ├── scan.go │ └── scan_override.go ├── docker/ │ ├── Dockerfile │ ├── Dockerfile.collector │ ├── Dockerfile.smartmontools │ ├── Dockerfile.web │ ├── README.md │ ├── entrypoint-collector.sh │ ├── example.hubspoke.docker-compose.yml │ └── example.omnibus.docker-compose.yml ├── docs/ │ ├── DOWNSAMPLING.md │ ├── INSTALL_ANSIBLE.md │ ├── INSTALL_HUB_SPOKE.md │ ├── INSTALL_MANUAL.md │ ├── INSTALL_MANUAL_WINDOWS.md │ ├── INSTALL_NAS.md │ ├── INSTALL_PFSENSE.md │ ├── INSTALL_ROOTLESS_PODMAN.md │ ├── INSTALL_SYNOLOGY_COLLECTOR.md │ ├── INSTALL_UNRAID.md │ ├── SUPPORTED_NAS_OS.md │ ├── TESTERS.md │ ├── TROUBLESHOOTING_DEVICE_COLLECTOR.md │ ├── TROUBLESHOOTING_DOCKER.md │ ├── TROUBLESHOOTING_INFLUXDB.md │ ├── TROUBLESHOOTING_NOTIFICATIONS.md │ ├── TROUBLESHOOTING_REVERSE_PROXY.md │ ├── TROUBLESHOOTING_UDEV.md │ └── dbdiagram.io.txt ├── example.collector.yaml ├── example.scrutiny.yaml ├── go.mod ├── go.sum ├── packagr.yml ├── rootfs/ │ └── etc/ │ ├── cont-init.d/ │ │ ├── 01-timezone │ │ └── 50-cron-config │ ├── cron.d/ │ │ └── scrutiny │ └── services.d/ │ ├── collector-once/ │ │ └── run │ ├── cron/ │ │ ├── finish │ │ └── run │ ├── influxdb/ │ │ └── run │ └── scrutiny/ │ └── run └── webapp/ ├── backend/ │ ├── cmd/ │ │ └── scrutiny/ │ │ └── scrutiny.go │ └── pkg/ │ ├── config/ │ │ ├── config.go │ │ ├── config_test.go │ │ ├── factory.go │ │ ├── interface.go │ │ └── mock/ │ │ └── mock_config.go │ ├── constants.go │ ├── database/ │ │ ├── interface.go │ │ ├── migrations/ │ │ │ ├── m20201107210306/ │ │ │ │ ├── device.go │ │ │ │ ├── smart.go │ │ │ │ ├── smart_ata_attribute.go │ │ │ │ ├── smart_nvme_attribute.go │ │ │ │ └── smart_scsci_attribute.go │ │ │ ├── m20220503120000/ │ │ │ │ └── device.go │ │ │ ├── m20220509170100/ │ │ │ │ └── device.go │ │ │ ├── m20220716214900/ │ │ │ │ └── setting.go │ │ │ └── m20250221084400/ │ │ │ └── device.go │ │ ├── mock/ │ │ │ └── mock_database.go │ │ ├── scrutiny_repository.go │ │ ├── scrutiny_repository_device.go │ │ ├── scrutiny_repository_device_smart_attributes.go │ │ ├── scrutiny_repository_migrations.go │ │ ├── scrutiny_repository_settings.go │ │ ├── scrutiny_repository_tasks.go │ │ ├── scrutiny_repository_tasks_test.go │ │ ├── scrutiny_repository_temperature.go │ │ └── scrutiny_repository_temperature_test.go │ ├── errors/ │ │ ├── errors.go │ │ └── errors_test.go │ ├── models/ │ │ ├── collector/ │ │ │ ├── smart.go │ │ │ └── smart_test.go │ │ ├── device.go │ │ ├── device_summary.go │ │ ├── measurements/ │ │ │ ├── smart.go │ │ │ ├── smart_ata_attribute.go │ │ │ ├── smart_attribute.go │ │ │ ├── smart_nvme_attribute.go │ │ │ ├── smart_scsci_attribute.go │ │ │ ├── smart_temperature.go │ │ │ └── smart_test.go │ │ ├── setting_entry.go │ │ ├── settings.go │ │ └── testdata/ │ │ ├── helper.go │ │ ├── smart-ata-date.json │ │ ├── smart-ata-date2.json │ │ ├── smart-ata-failed-scrutiny.json │ │ ├── smart-ata-full.json │ │ ├── smart-ata.json │ │ ├── smart-ata2.json │ │ ├── smart-fail.json │ │ ├── smart-fail2.json │ │ ├── smart-megaraid0.json │ │ ├── smart-megaraid1.json │ │ ├── smart-nvme-failed.json │ │ ├── smart-nvme.json │ │ ├── smart-nvme2.json │ │ ├── smart-pass.json │ │ ├── smart-raid.json │ │ ├── smart-sat.json │ │ ├── smart-scsi.json │ │ └── smart-scsi2.json │ ├── notify/ │ │ ├── notify.go │ │ └── notify_test.go │ ├── thresholds/ │ │ ├── ata_attribute_metadata.go │ │ ├── nvme_attribute_metadata.go │ │ └── scsi_attribute_metadata.go │ ├── version/ │ │ └── version.go │ └── web/ │ ├── handler/ │ │ ├── archive_device.go │ │ ├── delete_device.go │ │ ├── get_device_details.go │ │ ├── get_devices_summary.go │ │ ├── get_devices_summary_temp_history.go │ │ ├── get_settings.go │ │ ├── health_check.go │ │ ├── register_devices.go │ │ ├── save_settings.go │ │ ├── send_test_notification.go │ │ ├── unarchive_device.go │ │ ├── upload_device_metrics.go │ │ └── upload_device_self_tests.go │ ├── middleware/ │ │ ├── config.go │ │ ├── logger.go │ │ └── repository.go │ ├── server.go │ ├── server_test.go │ └── testdata/ │ ├── register-devices-req-2.json │ ├── register-devices-req.json │ ├── register-devices-single-req.json │ └── upload-device-metrics-req.json └── frontend/ ├── .editorconfig ├── .gitignore ├── CREDITS ├── LICENSE.md ├── README.md ├── angular.json ├── browserslist ├── e2e/ │ ├── protractor.conf.js │ ├── src/ │ │ ├── app.e2e-spec.ts │ │ └── app.po.ts │ └── tsconfig.json ├── git.version.sh ├── karma.conf.js ├── package.json ├── src/ │ ├── @treo/ │ │ ├── animations/ │ │ │ ├── defaults.ts │ │ │ ├── expand-collapse.ts │ │ │ ├── fade.ts │ │ │ ├── index.ts │ │ │ ├── public-api.ts │ │ │ ├── shake.ts │ │ │ ├── slide.ts │ │ │ └── zoom.ts │ │ ├── components/ │ │ │ ├── card/ │ │ │ │ ├── card.component.html │ │ │ │ ├── card.component.scss │ │ │ │ ├── card.component.ts │ │ │ │ ├── card.module.ts │ │ │ │ ├── index.ts │ │ │ │ └── public-api.ts │ │ │ ├── date-range/ │ │ │ │ ├── date-range.component.html │ │ │ │ ├── date-range.component.scss │ │ │ │ ├── date-range.component.ts │ │ │ │ ├── date-range.module.ts │ │ │ │ ├── index.ts │ │ │ │ └── public-api.ts │ │ │ ├── drawer/ │ │ │ │ ├── drawer.component.html │ │ │ │ ├── drawer.component.scss │ │ │ │ ├── drawer.component.ts │ │ │ │ ├── drawer.module.ts │ │ │ │ ├── drawer.service.ts │ │ │ │ ├── drawer.types.ts │ │ │ │ ├── index.ts │ │ │ │ └── public-api.ts │ │ │ ├── highlight/ │ │ │ │ ├── highlight.component.html │ │ │ │ ├── highlight.component.scss │ │ │ │ ├── highlight.component.ts │ │ │ │ ├── highlight.module.ts │ │ │ │ ├── highlight.service.ts │ │ │ │ ├── index.ts │ │ │ │ └── public-api.ts │ │ │ ├── message/ │ │ │ │ ├── index.ts │ │ │ │ ├── message.component.html │ │ │ │ ├── message.component.scss │ │ │ │ ├── message.component.ts │ │ │ │ ├── message.module.ts │ │ │ │ ├── message.service.ts │ │ │ │ ├── message.types.ts │ │ │ │ └── public-api.ts │ │ │ └── navigation/ │ │ │ ├── horizontal/ │ │ │ │ ├── components/ │ │ │ │ │ ├── basic/ │ │ │ │ │ │ ├── basic.component.html │ │ │ │ │ │ └── basic.component.ts │ │ │ │ │ ├── branch/ │ │ │ │ │ │ ├── branch.component.html │ │ │ │ │ │ └── branch.component.ts │ │ │ │ │ ├── divider/ │ │ │ │ │ │ ├── divider.component.html │ │ │ │ │ │ └── divider.component.ts │ │ │ │ │ └── spacer/ │ │ │ │ │ ├── spacer.component.html │ │ │ │ │ └── spacer.component.ts │ │ │ │ ├── horizontal.component.html │ │ │ │ ├── horizontal.component.scss │ │ │ │ └── horizontal.component.ts │ │ │ ├── index.ts │ │ │ ├── navigation.module.ts │ │ │ ├── navigation.service.ts │ │ │ ├── navigation.types.ts │ │ │ ├── public-api.ts │ │ │ └── vertical/ │ │ │ ├── components/ │ │ │ │ ├── aside/ │ │ │ │ │ ├── aside.component.html │ │ │ │ │ └── aside.component.ts │ │ │ │ ├── basic/ │ │ │ │ │ ├── basic.component.html │ │ │ │ │ └── basic.component.ts │ │ │ │ ├── collapsable/ │ │ │ │ │ ├── collapsable.component.html │ │ │ │ │ └── collapsable.component.ts │ │ │ │ ├── divider/ │ │ │ │ │ ├── divider.component.html │ │ │ │ │ └── divider.component.ts │ │ │ │ ├── group/ │ │ │ │ │ ├── group.component.html │ │ │ │ │ └── group.component.ts │ │ │ │ └── spacer/ │ │ │ │ ├── spacer.component.html │ │ │ │ └── spacer.component.ts │ │ │ ├── vertical.component.html │ │ │ ├── vertical.component.scss │ │ │ └── vertical.component.ts │ │ ├── directives/ │ │ │ ├── autogrow/ │ │ │ │ ├── autogrow.directive.ts │ │ │ │ ├── autogrow.module.ts │ │ │ │ ├── index.ts │ │ │ │ └── public-api.ts │ │ │ └── scrollbar/ │ │ │ ├── index.ts │ │ │ ├── public-api.ts │ │ │ ├── scrollbar.directive.ts │ │ │ ├── scrollbar.interfaces.ts │ │ │ └── scrollbar.module.ts │ │ ├── index.ts │ │ ├── lib/ │ │ │ └── mock-api/ │ │ │ ├── index.ts │ │ │ ├── mock-api.interceptor.ts │ │ │ ├── mock-api.interfaces.ts │ │ │ ├── mock-api.module.ts │ │ │ ├── mock-api.request-handler.ts │ │ │ ├── mock-api.service.ts │ │ │ └── mock-api.utils.ts │ │ ├── pipes/ │ │ │ └── find-by-key/ │ │ │ ├── find-by-key.module.ts │ │ │ ├── find-by-key.pipe.ts │ │ │ ├── index.ts │ │ │ └── public-api.ts │ │ ├── services/ │ │ │ ├── config/ │ │ │ │ ├── config.constants.ts │ │ │ │ ├── config.module.ts │ │ │ │ ├── config.service.ts │ │ │ │ ├── index.ts │ │ │ │ └── public-api.ts │ │ │ ├── media-watcher/ │ │ │ │ ├── index.ts │ │ │ │ ├── media-watcher.module.ts │ │ │ │ ├── media-watcher.service.ts │ │ │ │ └── public-api.ts │ │ │ └── splash-screen/ │ │ │ ├── index.ts │ │ │ ├── public-api.ts │ │ │ ├── splash-screen.module.ts │ │ │ └── splash-screen.service.ts │ │ ├── styles/ │ │ │ ├── base/ │ │ │ │ ├── _colors.scss │ │ │ │ ├── _preflight.scss │ │ │ │ ├── _theming.scss │ │ │ │ └── _typography.scss │ │ │ ├── components/ │ │ │ │ ├── _card.scss │ │ │ │ ├── _input.scss │ │ │ │ └── _table.scss │ │ │ ├── layout/ │ │ │ │ └── _content.scss │ │ │ ├── main.scss │ │ │ ├── overrides/ │ │ │ │ ├── _angular-material.scss │ │ │ │ ├── _highlightjs.scss │ │ │ │ ├── _perfect-scrollbar.scss │ │ │ │ └── _quill.scss │ │ │ ├── treo.scss │ │ │ ├── utilities/ │ │ │ │ ├── _breakpoints.scss │ │ │ │ ├── _colors.scss │ │ │ │ ├── _elevations.scss │ │ │ │ ├── _icons.scss │ │ │ │ ├── _keyframes.scss │ │ │ │ └── _theming.scss │ │ │ └── vendors/ │ │ │ ├── _angular-material.scss │ │ │ └── _normalize.scss │ │ ├── tailwind/ │ │ │ ├── export.css │ │ │ ├── export.js │ │ │ ├── exported/ │ │ │ │ ├── _variables.scss │ │ │ │ └── variables.ts │ │ │ └── plugins/ │ │ │ ├── index.js │ │ │ ├── utilities/ │ │ │ │ ├── color-combinations.js │ │ │ │ ├── color-contrasts.js │ │ │ │ ├── icon-color.js │ │ │ │ ├── icon-size.js │ │ │ │ └── mirror.js │ │ │ └── variants/ │ │ │ ├── dark-light.js │ │ │ ├── export-box-shadow.js │ │ │ ├── export-colors.js │ │ │ ├── export-font-family.js │ │ │ └── export-screens.js │ │ ├── treo.module.ts │ │ └── validators/ │ │ ├── index.ts │ │ ├── public-api.ts │ │ └── validators.ts │ ├── app/ │ │ ├── app.component.html │ │ ├── app.component.scss │ │ ├── app.component.ts │ │ ├── app.module.ts │ │ ├── app.routing.ts │ │ ├── core/ │ │ │ ├── config/ │ │ │ │ ├── app.config.ts │ │ │ │ ├── scrutiny-config.module.ts │ │ │ │ └── scrutiny-config.service.ts │ │ │ ├── core.module.ts │ │ │ └── models/ │ │ │ ├── device-details-response-wrapper.ts │ │ │ ├── device-model.ts │ │ │ ├── device-summary-model.ts │ │ │ ├── device-summary-response-wrapper.ts │ │ │ ├── device-summary-temp-response-wrapper.ts │ │ │ ├── measurements/ │ │ │ │ ├── smart-attribute-model.ts │ │ │ │ ├── smart-model.ts │ │ │ │ └── smart-temperature-model.ts │ │ │ └── thresholds/ │ │ │ └── attribute-metadata-model.ts │ │ ├── data/ │ │ │ └── mock/ │ │ │ ├── device/ │ │ │ │ └── details/ │ │ │ │ ├── index.ts │ │ │ │ ├── sda.ts │ │ │ │ ├── sdb.ts │ │ │ │ ├── sdc.ts │ │ │ │ ├── sdd.ts │ │ │ │ ├── sde.ts │ │ │ │ └── sdf.ts │ │ │ ├── index.ts │ │ │ └── summary/ │ │ │ ├── data.ts │ │ │ ├── index.ts │ │ │ └── temp_history.ts │ │ ├── layout/ │ │ │ ├── common/ │ │ │ │ ├── dashboard-device/ │ │ │ │ │ ├── dashboard-device.component.html │ │ │ │ │ ├── dashboard-device.component.scss │ │ │ │ │ ├── dashboard-device.component.spec.ts │ │ │ │ │ ├── dashboard-device.component.ts │ │ │ │ │ └── dashboard-device.module.ts │ │ │ │ ├── dashboard-device-archive-dialog/ │ │ │ │ │ ├── dashboard-device-archive-dialog.component.html │ │ │ │ │ ├── dashboard-device-archive-dialog.component.scss │ │ │ │ │ ├── dashboard-device-archive-dialog.component.spec.ts │ │ │ │ │ ├── dashboard-device-archive-dialog.component.ts │ │ │ │ │ ├── dashboard-device-archive-dialog.module.ts │ │ │ │ │ └── dashboard-device-archive-dialog.service.ts │ │ │ │ ├── dashboard-device-delete-dialog/ │ │ │ │ │ ├── dashboard-device-delete-dialog.component.html │ │ │ │ │ ├── dashboard-device-delete-dialog.component.scss │ │ │ │ │ ├── dashboard-device-delete-dialog.component.spec.ts │ │ │ │ │ ├── dashboard-device-delete-dialog.component.ts │ │ │ │ │ ├── dashboard-device-delete-dialog.module.ts │ │ │ │ │ └── dashboard-device-delete-dialog.service.ts │ │ │ │ ├── dashboard-settings/ │ │ │ │ │ ├── dashboard-settings.component.html │ │ │ │ │ ├── dashboard-settings.component.scss │ │ │ │ │ ├── dashboard-settings.component.ts │ │ │ │ │ └── dashboard-settings.module.ts │ │ │ │ ├── detail-settings/ │ │ │ │ │ ├── detail-settings.component.html │ │ │ │ │ ├── detail-settings.component.scss │ │ │ │ │ ├── detail-settings.component.spec.ts │ │ │ │ │ ├── detail-settings.component.ts │ │ │ │ │ └── detail-settings.module.ts │ │ │ │ └── search/ │ │ │ │ ├── search.component.html │ │ │ │ ├── search.component.scss │ │ │ │ ├── search.component.ts │ │ │ │ └── search.module.ts │ │ │ ├── layout.component.html │ │ │ ├── layout.component.scss │ │ │ ├── layout.component.ts │ │ │ ├── layout.module.ts │ │ │ ├── layout.types.ts │ │ │ └── layouts/ │ │ │ ├── empty/ │ │ │ │ ├── empty.component.html │ │ │ │ ├── empty.component.scss │ │ │ │ ├── empty.component.ts │ │ │ │ └── empty.module.ts │ │ │ └── horizontal/ │ │ │ └── material/ │ │ │ ├── material.component.html │ │ │ ├── material.component.scss │ │ │ ├── material.component.ts │ │ │ └── material.module.ts │ │ ├── modules/ │ │ │ ├── dashboard/ │ │ │ │ ├── dashboard.component.html │ │ │ │ ├── dashboard.component.scss │ │ │ │ ├── dashboard.component.ts │ │ │ │ ├── dashboard.module.ts │ │ │ │ ├── dashboard.resolvers.ts │ │ │ │ ├── dashboard.routing.ts │ │ │ │ ├── dashboard.service.spec.ts │ │ │ │ └── dashboard.service.ts │ │ │ ├── detail/ │ │ │ │ ├── detail.component.html │ │ │ │ ├── detail.component.scss │ │ │ │ ├── detail.component.ts │ │ │ │ ├── detail.module.ts │ │ │ │ ├── detail.resolvers.ts │ │ │ │ ├── detail.routing.ts │ │ │ │ ├── detail.service.spec.ts │ │ │ │ └── detail.service.ts │ │ │ └── landing/ │ │ │ └── home/ │ │ │ ├── home.component.html │ │ │ ├── home.component.scss │ │ │ ├── home.component.ts │ │ │ ├── home.module.ts │ │ │ └── home.routing.ts │ │ └── shared/ │ │ ├── device-hours.pipe.spec.ts │ │ ├── device-hours.pipe.ts │ │ ├── device-sort.pipe.spec.ts │ │ ├── device-sort.pipe.ts │ │ ├── device-status.pipe.spec.ts │ │ ├── device-status.pipe.ts │ │ ├── device-title.pipe.spec.ts │ │ ├── device-title.pipe.ts │ │ ├── file-size.pipe.spec.ts │ │ ├── file-size.pipe.ts │ │ ├── shared.module.ts │ │ ├── temperature.pipe.spec.ts │ │ └── temperature.pipe.ts │ ├── assets/ │ │ ├── .gitkeep │ │ ├── fonts/ │ │ │ ├── ibm-plex-mono/ │ │ │ │ └── ibm-plex-mono.css │ │ │ ├── inter/ │ │ │ │ └── inter.css │ │ │ ├── material-icons/ │ │ │ │ ├── MaterialIcons-Regular.codepoints │ │ │ │ ├── MaterialIconsOutlined-Regular.codepoints │ │ │ │ ├── MaterialIconsOutlined-Regular.otf │ │ │ │ ├── MaterialIconsRound-Regular.codepoints │ │ │ │ ├── MaterialIconsRound-Regular.otf │ │ │ │ ├── MaterialIconsSharp-Regular.codepoints │ │ │ │ ├── MaterialIconsSharp-Regular.otf │ │ │ │ ├── MaterialIconsTwoTone-Regular.codepoints │ │ │ │ ├── MaterialIconsTwoTone-Regular.otf │ │ │ │ ├── README.md │ │ │ │ └── material-icons.css │ │ │ └── roboto/ │ │ │ └── roboto.css │ │ └── images/ │ │ └── logo/ │ │ ├── scrutiny-logo-dark-social.psd │ │ ├── scrutiny-logo-dark-text.psd │ │ ├── scrutiny-logo-white-text.psd │ │ └── scrutiny-logo-white.psd │ ├── browserconfig.xml │ ├── environments/ │ │ ├── environment.prod.ts │ │ ├── environment.ts │ │ └── versions.ts │ ├── index.html │ ├── main.ts │ ├── manifest.json │ ├── polyfills.ts │ ├── styles/ │ │ ├── styles.scss │ │ ├── tailwind.scss │ │ ├── themes.scss │ │ └── vendors.scss │ ├── tailwind/ │ │ ├── config.js │ │ └── main.css │ └── test.ts ├── tsconfig.app.json ├── tsconfig.json ├── tsconfig.spec.json └── tslint.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .devcontainer/docker/devcontainer.json ================================================ { "name": "Scrutiny Dev (docker)", "dockerComposeFile": "../docker-compose.yml", "service": "app", "workspaceFolder": "/workspaces/scrutiny", "features": { "ghcr.io/devcontainers/features/go:1": "1.25", "ghcr.io/devcontainers/features/node:1": "lts" }, "onCreateCommand": "sudo apt-get update && sudo apt-get install -y smartmontools iputils-ping chromium-browser", "customizations": { "vscode": { "extensions": [ "golang.go", "dbaeumer.vscode-eslint", "esbenp.prettier-vscode" ] } }, "forwardPorts": [8080, 8086], "postCreateCommand": "bash .devcontainer/setup.sh", "remoteUser": "vscode" } ================================================ FILE: .devcontainer/docker-compose.yml ================================================ services: app: image: mcr.microsoft.com/devcontainers/base:ubuntu-22.04 volumes: - ..:/workspaces/scrutiny:cached command: sleep infinity network_mode: service:influxdb influxdb: image: influxdb:2.8 restart: unless-stopped ports: - "8086:8086" environment: - DOCKER_INFLUXDB_INIT_MODE=setup - DOCKER_INFLUXDB_INIT_USERNAME=admin - DOCKER_INFLUXDB_INIT_PASSWORD=password12345 - DOCKER_INFLUXDB_INIT_ORG=scrutiny - DOCKER_INFLUXDB_INIT_BUCKET=metrics - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my-super-secret-auth-token volumes: - scrutiny-influxdb-data:/var/lib/influxdb2 volumes: scrutiny-influxdb-data: ================================================ FILE: .devcontainer/docker-rootless/devcontainer.json ================================================ { "name": "Scrutiny Dev (rootless docker)", "dockerComposeFile": "../docker-compose.yml", "service": "app", "workspaceFolder": "/workspaces/scrutiny", "features": { "ghcr.io/devcontainers/features/go:1": "1.25", "ghcr.io/devcontainers/features/node:1": "lts" }, "onCreateCommand": "sudo apt-get update && sudo apt-get install -y smartmontools iputils-ping chromium-browser", "customizations": { "vscode": { "extensions": [ "golang.go", "dbaeumer.vscode-eslint", "esbenp.prettier-vscode" ] } }, "forwardPorts": [8080, 8086], "postCreateCommand": "bash .devcontainer/setup.sh", "remoteUser": "root", "containerUser": "root", "updateRemoteUserUID": false } ================================================ FILE: .devcontainer/podman/devcontainer.json ================================================ { "name": "Scrutiny Dev (podman)", "dockerComposeFile": "../docker-compose.yml", "service": "app", "workspaceFolder": "/workspaces/scrutiny", "features": { "ghcr.io/devcontainers/features/go:1": "1.25", "ghcr.io/devcontainers/features/node:1": "lts" }, "onCreateCommand": "sudo apt-get update && sudo apt-get install -y smartmontools iputils-ping chromium-browser", "customizations": { "vscode": { "extensions": [ "golang.go", "dbaeumer.vscode-eslint", "esbenp.prettier-vscode" ] } }, "forwardPorts": [8080, 8086], "postCreateCommand": "bash .devcontainer/setup.sh", "remoteEnv": { "PODMAN_USERNS": "keep-id" }, "containerUser": "vscode", "updateRemoteUserUID": true } ================================================ FILE: .devcontainer/setup.sh ================================================ #!/bin/bash echo "Starting Scrutiny Setup..." if [ ! -f "scrutiny.yaml" ]; then echo "Creating scrutiny.yaml from template..." cat < scrutiny.yaml version: 1 web: listen: port: 8080 host: 0.0.0.0 database: location: ./scrutiny.db src: frontend: path: ./dist influxdb: retention_policy: false token: "my-super-secret-auth-token" org: "scrutiny" bucket: "metrics" host: "localhost" port: 8086 log: file: 'web.log' level: DEBUG EOF else echo "scrutiny.yaml already exists." fi echo "Vendoring Go modules..." go mod vendor echo "Installing Node modules..." cd webapp/frontend npm install echo "Setup Complete! Ready to code." ================================================ FILE: .dockerignore ================================================ /vendor /.idea /.github /.git /webapp/frontend/node_modules ================================================ FILE: .gitattributes ================================================ *.css linguist-detectable=false *.scss linguist-detectable=false *.js linguist-detectable=false *.ts linguist-detectable=false ================================================ FILE: .github/DISCUSSION_TEMPLATE/issue-triage.yml ================================================ labels: ["needs-confirmation"] body: - type: markdown attributes: value: | > [!IMPORTANT] > Please read through [the Discussion rules](https://github.com/AnalogJ/scrutiny/discussions/876), review [the docs](https://github.com/AnalogJ/scrutiny/tree/master/docs), and check for both existing [Discussions](https://github.com/AnalogJ/scrutiny/discussions?discussions_q=) and [Issues](https://github.com/AnalogJ/scrutiny/issues?q=sort%3Areactions-desc) prior to opening a new Discussion. - type: markdown attributes: value: "# Issue Details" - type: textarea attributes: label: Issue Description description: | Provide a detailed description of the issue. Include relevant information, such as: - The feature or configuration option you encounter the issue with. - Screenshots, screen recordings, or other supporting media (as needed). - If this is a regression of an existing issue that was closed or resolved, please include the previous item reference (Discussion, Issue, PR, commit) in your description. placeholder: | Temperature data is missing from the plots. validations: required: true - type: textarea attributes: label: Expected Behavior description: | Describe how you expect scrutiny to behave in this situation. Include any relevant documentation links. placeholder: | All temperature data uploaded by collectors should make it into the plots. validations: required: true - type: textarea attributes: label: Actual Behavior description: | Describe how scrutiny actually behaves in this situation. If it is not immediately obvious how the actual behavior differs from the expected behavior described above, please be sure to mention the deviation specifically. placeholder: | Only half the points appear. validations: required: true - type: textarea attributes: label: Reproduction Steps description: | Provide a detailed set of step-by-step instructions for reproducing this issue. If you can't, describe what you were doing when the issue occurred. placeholder: | 1. Set up the omnibus docker image 2. Launch the web dashboard validations: required: true - type: textarea attributes: label: scrutiny debug logs description: | Provide any captured scrutiny logs or panic dumps during your issue reproduction in this field. Make sure to turn on debug logging with the environment variable DEBUG=true render: text - type: input attributes: label: Scrutiny Version description: The version of scrutiny you are using placeholder: v0.8.2 validations: required: true - type: input attributes: label: Smartmontools Version description: The version of smartmontools you are using (or "docker", if you're using the docker image) placeholder: "7.2" validations: required: true - type: input attributes: label: OS Version Information description: | Please tell us what operating system (name and version) you are using. placeholder: Ubuntu 24.04.1 (Noble Numbat) validations: required: true - type: dropdown attributes: label: Component description: Which component of scrutiny has a problem? options: - web - collector - omnibus (docker only) validations: required: true - type: checkboxes attributes: label: Deployment Method description: How are you running scrutiny? options: - label: docker - label: binaries - label: systemd validations: required: true - type: input attributes: label: Hard Drive Information description: | If the problem is related to a specific hard drive, what are the make and model? placeholder: Seagate ST8000DM004-2CX188 validations: required: false - type: textarea attributes: label: smartctl output description: | What is the output of smartctl --xall --json ? render: json validations: required: false - type: textarea attributes: label: docker-compose.yml description: | If using docker, please provide your full docker-compose.yml file. render: yaml validations: required: false - type: textarea attributes: label: scrutiny.yaml description: | Please provide your full scrutiny.yaml file. render: yaml validations: required: false - type: textarea attributes: label: collector.yaml description: | Please provide your full collector.yaml file. render: yaml validations: required: false - type: textarea attributes: label: Additional relevant configuration description: | Please any additional relevant configuration (e.g. systemd service definitions, OS configuration) render: text validations: required: false - type: markdown attributes: value: | # User Acknowledgements > [!TIP] > Use these links to review the existing scrutiny [Discussions](https://github.com/AnalogJ/scrutiny/discussions?discussions_q=) and [Issues](https://github.com/AnalogJ/scrutiny/issues?q=sort%3Areactions-desc). - type: checkboxes attributes: label: "I acknowledge that:" options: - label: I have reviewed the FAQ and confirm that my issue is NOT among them. required: true - label: I have searched the scrutiny repository (both open and closed Discussions and Issues) and confirm this is not a duplicate of an existing issue or discussion. required: true - label: I have checked the "Preview" tab on all text fields to ensure that everything looks right, and have wrapped all configuration and code in code blocks with a group of three backticks (` ``` `) on separate lines. required: true ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: false contact_links: - name: Features, Bug Reports, Questions url: https://github.com/AnalogJ/scrutiny/discussions/new/choose about: Our preferred starting point if you have any questions or suggestions about configuration, features or behavior. ================================================ FILE: .github/ISSUE_TEMPLATE/preapproved.md ================================================ --- name: Pre-Discussed and Approved Topics about: |- Only for topics already discussed and approved in the GitHub Discussions section. --- **DO NOT OPEN A NEW ISSUE. PLEASE USE THE DISCUSSIONS SECTION.** **I DIDN'T READ THE ABOVE LINE. PLEASE CLOSE THIS ISSUE.** ================================================ FILE: .github/workflows/ci.yaml ================================================ name: CI # This workflow is triggered on pushes & pull requests on: push: branches: - master pull_request: permissions: contents: read jobs: test-frontend: name: Test Frontend runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Test Frontend run: | make binary-frontend-test-coverage - name: Upload coverage uses: actions/upload-artifact@v4 with: name: coverage path: ${{ github.workspace }}/webapp/frontend/coverage/lcov.info retention-days: 1 test-backend: name: Test Backend runs-on: ubuntu-latest # Service containers to run with `build` (Required for end-to-end testing) services: influxdb: image: influxdb:2.8 env: DOCKER_INFLUXDB_INIT_MODE: setup DOCKER_INFLUXDB_INIT_USERNAME: admin DOCKER_INFLUXDB_INIT_PASSWORD: password12345 DOCKER_INFLUXDB_INIT_ORG: scrutiny DOCKER_INFLUXDB_INIT_BUCKET: metrics DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: my-super-secret-auth-token ports: - 8086:8086 env: STATIC: true steps: - name: Add influxdb to hosts run: echo "127.0.0.1 influxdb" | sudo tee -a /etc/hosts - name: Checkout uses: actions/checkout@v6 - name: Test Backend run: | make binary-clean binary-test-coverage - name: Upload coverage uses: actions/upload-artifact@v4 with: name: coverage path: ${{ github.workspace }}/coverage.txt retention-days: 1 test-coverage: name: Test Coverage Upload needs: - test-backend - test-frontend runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Download coverage reports uses: actions/download-artifact@v4 with: name: coverage - name: Upload coverage reports uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} files: ${{ github.workspace }}/coverage.txt,${{ github.workspace }}/lcov.info flags: unittests fail_ci_if_error: true verbose: true golangci: name: lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/setup-go@v6 with: go-version: 1.25 - name: golangci-lint uses: golangci/golangci-lint-action@v9 with: args: --issues-exit-code=0 build: name: Build ${{ matrix.cfg.goos }}/${{ matrix.cfg.goarch }} runs-on: ${{ matrix.cfg.on }} env: GOOS: ${{ matrix.cfg.goos }} GOARCH: ${{ matrix.cfg.goarch }} GOARM: ${{ matrix.cfg.goarm }} STATIC: true strategy: matrix: cfg: - { on: ubuntu-latest, goos: linux, goarch: amd64 } - { on: ubuntu-latest, goos: linux, goarch: arm, goarm: 5 } - { on: ubuntu-latest, goos: linux, goarch: arm, goarm: 6 } - { on: ubuntu-latest, goos: linux, goarch: arm, goarm: 7 } - { on: ubuntu-latest, goos: linux, goarch: arm64 } - { on: macos-latest, goos: darwin, goarch: amd64 } - { on: macos-latest, goos: darwin, goarch: arm64 } - { on: macos-latest, goos: freebsd, goarch: amd64 } - { on: windows-latest, goos: windows, goarch: amd64 } - { on: windows-latest, goos: windows, goarch: arm64 } steps: - name: Checkout uses: actions/checkout@v2 - uses: actions/setup-go@v3 with: go-version: '^1.25' - name: Build Binaries run: | make binary-clean binary-all - name: Archive uses: actions/upload-artifact@v4 with: name: binaries-${{ matrix.cfg.on }}-${{ matrix.cfg.goos }}-${{ matrix.cfg.goarch }}-${{ matrix.cfg.goarm || 'na' }}.zip path: | scrutiny-web-* scrutiny-collector-metrics-* makefile-docker-omnibus: name: Build Docker Omnibus From Makefile runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 - name: Build run: make docker-omnibus makefile-docker-web: name: Build Docker Web From Makefile runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 - name: Build run: make docker-web makefile-docker-collector: name: Build Docker Collector From Makefile runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 - name: Build run: make docker-collector ================================================ FILE: .github/workflows/docker-build.yaml ================================================ name: Docker on: push: # Publish semver tags as releases. tags: [ 'v*.*.*' ] env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} jobs: collector: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout repository uses: actions/checkout@v6 - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: platforms: 'arm64,arm' - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 # Login against a Docker registry except on PR # https://github.com/docker/login-action - name: Log into registry ${{ env.REGISTRY }} uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} # Extract metadata (tags, labels) for Docker # https://github.com/docker/metadata-action - name: Extract Docker metadata id: meta uses: docker/metadata-action@v5 with: flavor: | latest=true suffix=-collector,onlatest=true tags: | type=semver,pattern=v{{major}}.{{minor}}.{{patch}} type=semver,pattern=v{{major}}.{{minor}} type=semver,pattern=v{{major}} images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} # Build and push Docker image with Buildx # https://github.com/docker/build-push-action - name: Build and push Docker image uses: docker/build-push-action@v6 with: platforms: linux/amd64,linux/arm64,linux/arm/v7 context: . file: docker/Dockerfile.collector push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max web: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout repository uses: actions/checkout@v6 - name: "Populate frontend version information" run: "cd webapp/frontend && ./git.version.sh" - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: platforms: 'arm64,arm' - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 # Login against a Docker registry except on PR # https://github.com/docker/login-action - name: Log into registry ${{ env.REGISTRY }} uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} # Extract metadata (tags, labels) for Docker # https://github.com/docker/metadata-action - name: Extract Docker metadata id: meta uses: docker/metadata-action@v5 with: flavor: | latest=true suffix=-web,onlatest=true tags: | type=semver,pattern=v{{major}}.{{minor}}.{{patch}} type=semver,pattern=v{{major}}.{{minor}} type=semver,pattern=v{{major}} images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} # Build and push Docker image with Buildx # https://github.com/docker/build-push-action - name: Build and push Docker image uses: docker/build-push-action@v6 with: platforms: linux/amd64,linux/arm64,linux/arm/v7 context: . file: docker/Dockerfile.web push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max omnibus: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout repository uses: actions/checkout@v6 - name: "Populate frontend version information" run: "cd webapp/frontend && ./git.version.sh" - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: platforms: 'arm64,arm' - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 # Login against a Docker registry except on PR # https://github.com/docker/login-action - name: Log into registry ${{ env.REGISTRY }} uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} # Extract metadata (tags, labels) for Docker # https://github.com/docker/metadata-action - name: Extract Docker metadata id: meta uses: docker/metadata-action@v5 # tag latest and latest-omnibus with: flavor: | latest=true suffix=-omnibus,onlatest=false tags: | type=raw,value=latest type=semver,pattern=v{{major}}.{{minor}}.{{patch}} type=semver,pattern=v{{major}}.{{minor}} type=semver,pattern=v{{major}} images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} # Build and push Docker image with Buildx # https://github.com/docker/build-push-action - name: Build and push Docker image uses: docker/build-push-action@v6 with: platforms: linux/amd64,linux/arm64 context: . file: docker/Dockerfile push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max ================================================ FILE: .github/workflows/docker-nightly.yaml ================================================ name: Docker - Nightly on: workflow_dispatch: # Note: this only runs on the default branch schedule: - cron: '36 12 * * *' env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} jobs: build_nightlies: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout repository uses: actions/checkout@v6 - name: "Populate frontend version information" run: "cd webapp/frontend && ./git.version.sh" - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: platforms: 'arm64' - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 # Login against a Docker registry except on PR # https://github.com/docker/login-action - name: Log into registry ${{ env.REGISTRY }} uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} # Extract metadata (tags, labels) for Docker # https://github.com/docker/metadata-action - name: Extract Docker metadata for omnibus id: meta_omnibus uses: docker/metadata-action@v5 with: tags: | type=raw,enable=true,value=nightly,suffix=-omnibus images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} # Build and push Docker image with Buildx (don't push on PR) # https://github.com/docker/build-push-action - name: Build and push omnibus Docker image uses: docker/build-push-action@v6 with: platforms: linux/amd64,linux/arm64 context: . file: docker/Dockerfile push: true tags: ${{ steps.meta_omnibus.outputs.tags }} labels: ${{ steps.meta_omnibus.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max # Extract metadata (tags, labels) for Docker # https://github.com/docker/metadata-action - name: Extract Docker metadata for collector id: meta_collector uses: docker/metadata-action@v5 with: tags: | type=raw,enable=true,value=nightly,suffix=-collector images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} # Build and push Docker image with Buildx (don't push on PR) # https://github.com/docker/build-push-action - name: Build and push collector Docker image uses: docker/build-push-action@v6 with: platforms: linux/amd64,linux/arm64 context: . file: docker/Dockerfile.collector push: true tags: ${{ steps.meta_collector.outputs.tags }} labels: ${{ steps.meta_collector.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max # Extract metadata (tags, labels) for Docker # https://github.com/docker/metadata-action - name: Extract Docker metadata for web id: meta_web uses: docker/metadata-action@v5 with: tags: | type=raw,enable=true,value=nightly,suffix=-web images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} # Build and push Docker image with Buildx (don't push on PR) # https://github.com/docker/build-push-action - name: Build and push web Docker image uses: docker/build-push-action@v6 with: platforms: linux/amd64,linux/arm64 context: . file: docker/Dockerfile.web push: true tags: ${{ steps.meta_web.outputs.tags }} labels: ${{ steps.meta_web.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max ================================================ FILE: .github/workflows/release.yaml ================================================ name: Release # This workflow is triggered manually on: workflow_dispatch: inputs: version_bump_type: description: 'Version Bump Type (major, minor, patch)' required: true default: 'patch' version_metadata_path: description: 'Path to file containing Version string' required: true default: 'webapp/backend/pkg/version/version.go' jobs: release: name: Create Release Commit runs-on: ubuntu-latest container: ghcr.io/packagrio/packagr:latest-golang # Service containers to run with `build` (Required for end-to-end testing) services: influxdb: image: influxdb:2.8 env: DOCKER_INFLUXDB_INIT_MODE: setup DOCKER_INFLUXDB_INIT_USERNAME: admin DOCKER_INFLUXDB_INIT_PASSWORD: password12345 DOCKER_INFLUXDB_INIT_ORG: scrutiny DOCKER_INFLUXDB_INIT_BUCKET: metrics DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: my-super-secret-auth-token ports: - 8086:8086 env: STATIC: true steps: - name: Git run: | apt-get update && apt-get install -y software-properties-common add-apt-repository ppa:git-core/ppa && apt-get update && apt-get install -y git git --version - name: Checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Bump version id: bump_version uses: packagrio/action-bumpr-go@master with: version_bump_type: ${{ github.event.inputs.version_bump_type }} version_metadata_path: ${{ github.event.inputs.version_metadata_path }} env: GITHUB_TOKEN: ${{ secrets.SCRUTINY_GITHUB_TOKEN }} # Leave this line unchanged - name: Test run: | make binary-clean binary-test-coverage - name: Commit Changes Locally id: commit uses: packagrio/action-releasr-go@master env: GITHUB_TOKEN: ${{ secrets.SCRUTINY_GITHUB_TOKEN }} # Leave this line unchanged with: version_metadata_path: ${{ github.event.inputs.version_metadata_path }} - name: Upload workspace uses: actions/upload-artifact@v4 with: name: workspace include-hidden-files: true path: ${{ github.workspace }}/**/* retention-days: 1 build: name: Build ${{ matrix.cfg.goos }}/${{ matrix.cfg.goarch }}${{ matrix.cfg.goarm }} needs: release runs-on: ${{ matrix.cfg.on }} env: GOOS: ${{ matrix.cfg.goos }} GOARCH: ${{ matrix.cfg.goarch }} GOARM: ${{ matrix.cfg.goarm }} STATIC: true strategy: matrix: cfg: - { on: ubuntu-latest, goos: linux, goarch: amd64 } - { on: ubuntu-latest, goos: linux, goarch: arm, goarm: 5 } - { on: ubuntu-latest, goos: linux, goarch: arm, goarm: 6 } - { on: ubuntu-latest, goos: linux, goarch: arm, goarm: 7 } - { on: ubuntu-latest, goos: linux, goarch: arm64 } - { on: macos-latest, goos: darwin, goarch: amd64 } - { on: macos-latest, goos: darwin, goarch: arm64 } - { on: macos-latest, goos: freebsd, goarch: amd64 } - { on: windows-latest, goos: windows, goarch: amd64 } - { on: windows-latest, goos: windows, goarch: arm64 } steps: - name: Download workspace uses: actions/download-artifact@v7 with: name: workspace - uses: actions/setup-go@v6 with: go-version: '1.25' # The Go version to download (if necessary) and use. - name: Build Binaries run: | make binary-clean binary-all - name: Upload artifacts uses: actions/upload-artifact@v6 with: name: scrutiny-${{ matrix.cfg.goos }}-${{ matrix.cfg.goarch }}${{ case(matrix.cfg.goarm != '', format('-{0}', matrix.cfg.goarm), '') }}.zip path: | scrutiny-web-${{ matrix.cfg.goos }}-${{ matrix.cfg.goarch }}${{ case(matrix.cfg.goarm != '', format('-{0}', matrix.cfg.goarm), '') }}${{ case(matrix.cfg.goos == 'windows', '.exe', '') }} scrutiny-collector-metrics-${{ matrix.cfg.goos }}-${{ matrix.cfg.goarch }}${{ case(matrix.cfg.goarm != '', format('-{0}', matrix.cfg.goarm), '') }}${{ case(matrix.cfg.goos == 'windows', '.exe', '') }} build_frontend: name: Build Frontend needs: release runs-on: ubuntu-latest container: node:lts-slim steps: - name: Download workspace uses: actions/download-artifact@v7 with: name: workspace - name: "Generate frontend version information" run: "cd webapp/frontend && chmod +x git.version.sh && ./git.version.sh" - name: Build Frontend run: | apt-get update && apt-get install -y make make binary-frontend tar -czf scrutiny-web-frontend.tar.gz dist - name: Upload artifacts uses: actions/upload-artifact@v6 with: name: scrutiny-web-frontend.zip path: scrutiny-web-frontend.tar.gz release-publish: name: Publish Release needs: - build - build_frontend runs-on: ubuntu-latest steps: - name: Download workspace uses: actions/download-artifact@v7 with: name: workspace - name: Download binaries uses: actions/download-artifact@v7 with: merge-multiple: true pattern: scrutiny-*.zip - name: Download frontend uses: actions/download-artifact@v7 with: name: scrutiny-web-frontend.zip - name: List shell: bash run: | ls -alt - name: Publish Release & Assets id: publish uses: packagrio/action-publishr-go@master env: # This is necessary in order to push a commit to the repo GITHUB_TOKEN: ${{ secrets.SCRUTINY_GITHUB_TOKEN }} # Leave this line unchanged with: version_metadata_path: ${{ github.event.inputs.version_metadata_path }} upload_assets: scrutiny-collector-metrics-darwin-amd64 scrutiny-collector-metrics-darwin-arm64 scrutiny-collector-metrics-freebsd-amd64 scrutiny-collector-metrics-linux-amd64 scrutiny-collector-metrics-linux-arm-5 scrutiny-collector-metrics-linux-arm-6 scrutiny-collector-metrics-linux-arm-7 scrutiny-collector-metrics-linux-arm64 scrutiny-collector-metrics-windows-amd64.exe scrutiny-collector-metrics-windows-arm64.exe scrutiny-web-frontend.tar.gz scrutiny-web-darwin-amd64 scrutiny-web-darwin-arm64 scrutiny-web-freebsd-amd64 scrutiny-web-linux-amd64 scrutiny-web-linux-arm-5 scrutiny-web-linux-arm-6 scrutiny-web-linux-arm-7 scrutiny-web-linux-arm64 scrutiny-web-windows-amd64.exe scrutiny-web-windows-arm64.exe ================================================ FILE: .github/workflows/sponsors.yaml ================================================ name: Label sponsors on: pull_request: types: [opened] issues: types: [opened] jobs: build: name: is-sponsor-label runs-on: ubuntu-latest if: ${{ false }} steps: - uses: JasonEtco/is-sponsor-label-action@v1.2.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .gitignore ================================================ # Created by .ignore support plugin (hsz.mobi) ### JetBrains template # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff .idea/**/workspace.xml .idea/**/tasks.xml .idea/**/dictionaries .idea/**/shelf # Sensitive or high-churn files .idea/**/dataSources/ .idea/**/dataSources.ids .idea/**/dataSources.local.xml .idea/**/sqlDataSources.xml .idea/**/dynamic.xml .idea/**/uiDesigner.xml .idea/**/dbnavigator.xml # Gradle .idea/**/gradle.xml .idea/**/libraries # CMake cmake-build-debug/ cmake-build-release/ # Mongo Explorer plugin .idea/**/mongoSettings.xml # File-based project format *.iws # IntelliJ out/ # mpeltonen/sbt-idea plugin .idea_modules/ # JIRA plugin atlassian-ide-plugin.xml # Cursive Clojure plugin .idea/replstate.xml # Crashlytics plugin (for Android Studio and IntelliJ) com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties # Editor-based Rest Client .idea/httpRequests scrutiny.db /dist/ vendor /scrutiny /scrutiny-collector-metrics-* /scrutiny-web-* scrutiny-*.db scrutiny_test.db scrutiny.yaml coverage.txt /config /influxdb .angular web.log ================================================ FILE: .golangci.yml ================================================ version: "2" formatters: enable: - gofmt - goimports linters: enable: - bodyclose settings: errcheck: check-blank: true ================================================ FILE: .vscode/launch.json ================================================ { "version": "0.2.0", "configurations": [ { "name": "Run Scrutiny", "type": "go", "request": "launch", "mode": "auto", "program": "${workspaceFolder}/webapp/backend/cmd/scrutiny/scrutiny.go", "args": ["start", "--config", "./scrutiny.yaml"], "cwd": "${workspaceFolder}", "env": { "DEBUG": "true" }, "console": "integratedTerminal", "preLaunchTask": "Build Frontend", "serverReadyAction": { "action": "openExternally", "pattern": "Listening and serving HTTP on", "uriFormat": "http://localhost:8080/web/" } }, { "name": "Run Collector", "type": "go", "request": "launch", "mode": "auto", "program": "${workspaceFolder}/collector/cmd/collector-metrics/collector-metrics.go", "args": ["run", "--debug"], "cwd": "${workspaceFolder}", "env": { "COLLECTOR_DEBUG": "true" }, "console": "integratedTerminal" } ] } ================================================ FILE: .vscode/tasks.json ================================================ { "version": "2.0.0", "tasks": [ { "label": "Build Frontend", "type": "shell", "command": "cd webapp/frontend && npm run build:prod -- --output-path=../../dist" } ] } ================================================ FILE: AI_POLICY.md ================================================ # AI Usage Policy scrutiny has strict rules for AI usage: - **All AI usage in any form must be disclosed.** You must state the tool you used (e.g. Claude Code, Cursor, Amp) along with the extent that the work was AI-assisted. - **Pull requests created in any way by AI can only be for accepted issues.** Drive-by pull requests that do not reference an accepted issue will be closed. If AI isn't disclosed but a maintainer suspects its use, the PR will be closed. If you want to share code for a non-accepted issue, open a discussion or attach it to an existing discussion. - **Pull requests created by AI must have been fully verified with human use.** AI must not create hypothetically correct code that hasn't been tested. Importantly, you must not allow AI to write code for platforms or environments you don't have access to manually test on. - **Issues and discussions can use AI assistance but must have a full human-in-the-loop.** This means that any content generated with AI must have been reviewed _and edited_ by a human before submission. AI is very good at being overly verbose and including noise that distracts from the main point. Humans must do their research and trim this down. - **No AI-generated media is allowed (art, images, videos, audio, etc.).** Text and code are the only acceptable AI-generated content, per the other rules in this policy. - **Bad AI drivers will be banned and ridiculed in public.** You've been warned. We love to help junior developers learn and grow, but if you're interested in that then don't use AI, and we'll help you. I'm sorry that bad AI drivers have ruined this for you. These rules apply only to outside contributions to scrutiny. Maintainers and repeat contributors (with explicit permission) are exempt from these rules and may use AI tools at their discretion; they've proven themselves trustworthy to apply good judgment. ## There are Humans Here Please remember that scrutiny is maintained by humans. Every discussion, issue, and pull request is read and reviewed by humans (and sometimes machines, too). It is a boundary point at which people interact with each other and the work done. It is rude and disrespectful to approach this boundary with low-effort, unqualified work, since it puts the burden of validation on the maintainer. In a perfect world, AI would produce high-quality, accurate work every time. But today, that reality depends on the driver of the AI. And today, most drivers of AI are just not good enough. So, until either the people get better, the AI gets better, or both, we have to have strict rules to protect maintainers. ## AI is Welcome Here Many maintainers embrace AI tools as a productive tool in their workflow. As a project, scrutiny welcomes AI as a tool! **Our reason for the strict AI policy is not due to an anti-AI stance**, but instead due to the number of highly unqualified people using AI. It's the people, not the tools, that are the problem. This section is included to be transparent about the project's usage about AI for people who may disagree with it, and to address the misconception that this policy is anti-AI in nature. # Credit Adopted from [ghostty's AI policy](https://github.com/ghostty-org/ghostty/blob/1b7a15899ad40fba4ce020f537055d30eaf99ee8/AI_POLICY.md) ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing to scrutiny This document describes the process of contributing to scrutiny. It is intended for anyone considering opening an **issue**, **discussion** or **pull request**. > [!NOTE] > > The intention of these policies is not to be difficult, and > contributions are greatly appreciated. The goal is to streamline > and simplify the efforts of both contributers and maintainers. ## AI Usage scrutiny has strict rules for AI usage. Please see the [AI Usage Policy](AI_POLICY.md). **This is very important.** ## Quick Guide ### I'd like to contribute [All issues are actionable](#issues-are-actionable). Pick one and start working on it. Thank you. If you need help or guidance, comment on the issue. Issues that are extra friendly to new contributors are tagged with ["contributor friendly"]. ["contributor friendly"]: https://github.com/AnalogJ/scrutiny/issues?q=is%3Aissue%20is%3Aopen%20label%3A%22contributor%20friendly%22 ### I have a bug! / Something isn't working First, search the issue tracker and discussions for similar issues. Tip: also search for [closed issues] and [discussions] — your issue might have already been fixed! > [!NOTE] > > If there is an _open_ issue or discussion that matches your problem, > **please do not comment on it unless you have valuable insight to add**. > > GitHub has a very _noisy_ set of default notification settings which > sends an email to _every participant_ in an issue/discussion every time > someone adds a comment. Instead, use the handy upvote button for discussions, > and/or emoji reactions on both discussions and issues, which are a visible > yet non-disruptive way to show your support. If your issue hasn't been reported already, open an ["Issue Triage"] discussion and make sure to fill in the template **completely**. They are vital for maintainers to figure out important details about your setup. > [!WARNING] > > A _very_ common mistake is to file a bug report either as a Q&A or a Feature > Request. **Please don't do this.** Otherwise, maintainers would have to ask > for your system information again manually, and sometimes they will even ask > you to create a new discussion because of how few detailed information is > required for other discussion types compared to Issue Triage. > > Because of this, please make sure that you _only_ use the "Issue Triage" > category for reporting bugs — thank you! [closed issues]: https://github.com/AnalogJ/scrutiny/issues?q=is%3Aissue%20state%3Aclosed [discussions]: https://github.com/AnalogJ/scrutiny/discussions?discussions_q=is%3Aclosed ["Issue Triage"]: https://github.com/AnalogJ/scrutiny/discussions/new?category=issue-triage ### I have an idea for a feature Like bug reports, first search through both issues and discussions and try to find if your feature has already been requested. Otherwise, open a discussion in the ["Feature Requests, Ideas"] category. ["Feature Requests, Ideas"]: https://github.com/AnalogJ/scrutiny/discussions/new?category=feature-requests-ideas ### I've implemented a feature 1. If there is an issue for the feature, open a pull request straight away. 2. If there is no issue, open a discussion and link to your branch. 3. If you want to live dangerously, open a pull request and [hope for the best](#pull-requests-implement-an-issue). ### I have a question which is neither a bug report nor a feature request Open a [Q&A discussion]. > [!NOTE] > If your question is about a missing feature, please open a discussion under > the ["Feature Requests, Ideas"] category. If scrutiny is behaving > unexpectedly, use the ["Issue Triage"] category. > > The "Q&A" category is strictly for other kinds of discussions and do not > require detailed information unlike the two other categories, meaning that > maintainers would have to spend the extra effort to ask for basic information > if you submit a bug report under this category. > > Therefore, please **pay attention to the category** before opening > discussions to save us all some time and energy. Thank you! [Q&A discussion]: https://github.com/AnalogJ/scrutiny/discussions/new?category=q-a ## General Patterns ### Issues are Actionable The scrutiny [issue tracker](https://github.com/AnalogJ/scrutiny/issues) is for _actionable items_. Unlike some other projects, scrutiny **does not use the issue tracker for discussion or feature requests**. Instead, we use GitHub [discussions](https://github.com/AnalogJ/scrutiny/discussions) for that. Once a discussion reaches a point where a well-understood, actionable item is identified, it is moved to the issue tracker. **This pattern makes it easier for maintainers or contributors to find issues to work on since _every issue_ is ready to be worked on.** If you are experiencing a bug and have clear steps to reproduce it, please open an issue. If you are experiencing a bug but you are not sure how to reproduce it or aren't sure if it's a bug, please open a discussion. If you have an idea for a feature, please open a discussion. ### Pull Requests Implement an Issue Pull requests should be associated with a previously accepted issue. **If you open a pull request for something that wasn't previously discussed,** it may be closed or remain stale for an indefinite period of time. I'm not saying it will never be accepted, but the odds are stacked against you. Issues tagged with "feature" represent accepted, well-scoped feature requests. If you implement an issue tagged with feature as described in the issue, your pull request will be accepted with a high degree of certainty. > [!NOTE] > > **Pull requests are NOT a place to discuss feature design.** Please do > not open a WIP pull request to discuss a feature. Instead, use a discussion > and link to your branch. # Developer Guide > [!NOTE] > > **The remainder of this file is dedicated to developers actively > working on scrutiny.** If you're a user reporting an issue, you can > ignore the rest of this document. The Scrutiny repository is a [monorepo](https://en.wikipedia.org/wiki/Monorepo) containing source code for: - Scrutiny Backend Server (API) - Scrutiny Frontend Angular SPA - S.M.A.R.T Collector Depending on the functionality you are adding, you may need to setup a development environment for 1 or more projects. # Devcontainer Devcontainer configurations are available to build and run Scrutiny (WebUI and Collector) in a fully isolated environment. When opening the project with vscode, choose "Reopen in Container". Three configurations are available depending on your container runtime and setup: docker, docker-rootless, and podman. # Modifying the Scrutiny Backend Server (API) 1. install the [Go runtime](https://go.dev/doc/install) (v1.25) 2. download the `scrutiny-web-frontend.tar.gz` for the [latest release](https://github.com/AnalogJ/scrutiny/releases/latest). Extract to a folder named `dist` 3. create a `scrutiny.yaml` config file ```yaml # config file for local development. store as scrutiny.yaml version: 1 web: listen: port: 8080 host: 0.0.0.0 database: # can also set absolute path here location: ./scrutiny.db src: frontend: path: ./dist influxdb: retention_policy: false log: file: 'web.log' #absolute or relative paths allowed, eg. web.log level: DEBUG ``` 4. start a InfluxDB docker container. ```bash docker run -p 8086:8086 --rm influxdb:2.8 ``` 5. start the scrutiny web server ```bash go mod vendor go run webapp/backend/cmd/scrutiny/scrutiny.go start --config ./scrutiny.yaml ``` 6. open your browser to [http://localhost:8080/web](http://localhost:8080/web) # Modifying the Scrutiny Frontend Angular SPA The frontend is written in Angular. If you're working on the frontend and can use mocked data rather than a real backend, you can follow the instructions below: 1. install [NodeJS](https://nodejs.org/en/download/) 2. start the Angular Frontend Application ```bash cd webapp/frontend npm install npm run start -- --serve-path="/web/" --port 4200 ``` 3. open your browser and visit [http://localhost:4200/web](http://localhost:4200/web) # Modifying both Scrutiny Backend and Frontend Applications If you're developing a feature that requires changes to the backend and the frontend, or a frontend feature that requires real data, you'll need to follow the steps below: 1. install the [Go runtime](https://go.dev/doc/install) (v1.20+) 2. install [NodeJS](https://nodejs.org/en/download/) 3. create a `scrutiny.yaml` config file ```yaml # config file for local development. store as scrutiny.yaml version: 1 web: listen: port: 8080 host: 0.0.0.0 database: # can also set absolute path here location: ./scrutiny.db src: frontend: path: ./dist influxdb: retention_policy: false log: file: 'web.log' #absolute or relative paths allowed, eg. web.log level: DEBUG ``` 4. start a InfluxDB docker container. ```bash docker run -p 8086:8086 --rm influxdb:2.8 ``` 5. build the Angular Frontend Application ```bash cd webapp/frontend npm install npm run build:prod -- --watch --output-path=../../dist # Note: if you do not add `--prod` flag, app will display mocked data for api calls. ``` 6. start the scrutiny web server ```bash go mod vendor go run webapp/backend/cmd/scrutiny/scrutiny.go start --config ./scrutiny.yaml ``` 7. open your browser to [http://localhost:8080/web](http://localhost:8080/web) If you'd like to populate the database with some test data, you can run the following commands: > NOTE: you may need to update the `local_time` key within the JSON file, any timestamps older than ~3 weeks will be automatically ignored > (since the downsampling & retention policy takes effect at 2 weeks) > This is done automatically by the `webapp/backend/pkg/models/testdata/helper.go` script ``` docker run -p 8086:8086 --rm influxdb:2.8 # curl -X POST -H "Content-Type: application/json" -d @webapp/backend/pkg/web/testdata/register-devices-req.json localhost:8080/api/devices/register # curl -X POST -H "Content-Type: application/json" -d @webapp/backend/pkg/models/testdata/smart-ata.json localhost:8080/api/device/0x5000cca264eb01d7/smart # curl -X POST -H "Content-Type: application/json" -d @webapp/backend/pkg/models/testdata/smart-ata-date.json localhost:8080/api/device/0x5000cca264eb01d7/smart # curl -X POST -H "Content-Type: application/json" -d @webapp/backend/pkg/models/testdata/smart-ata-date2.json localhost:8080/api/device/0x5000cca264eb01d7/smart # curl -X POST -H "Content-Type: application/json" -d @webapp/backend/pkg/models/testdata/smart-fail2.json localhost:8080/api/device/0x5000cca264ec3183/smart # curl -X POST -H "Content-Type: application/json" -d @webapp/backend/pkg/models/testdata/smart-nvme.json localhost:8080/api/device/0x5002538e40a22954/smart # curl -X POST -H "Content-Type: application/json" -d @webapp/backend/pkg/models/testdata/smart-scsi.json localhost:8080/api/device/0x5000cca252c859cc/smart # curl -X POST -H "Content-Type: application/json" -d @webapp/backend/pkg/models/testdata/smart-scsi2.json localhost:8080/api/device/0x5000cca264ebc248/smart go run webapp/backend/pkg/models/testdata/helper.go curl localhost:8080/api/summary ``` # Modifying the Collector ``` brew install smartmontools go run collector/cmd/collector-metrics/collector-metrics.go run --debug ``` # Debugging If you need more verbose logs for debugging, you can use the following environmental variables: - `DEBUG=true` - enables debug level logging on both the `collector` and `webapp` - `COLLECTOR_DEBUG=true` - enables debug level logging on the `collector` - `SCRUTINY_DEBUG=true` - enables debug level logging on the `webapp` In addition, you can instruct scrutiny to write its logs to a file using the following environmental variables: - `COLLECTOR_LOG_FILE=/tmp/collector.log` - write the `collector` logs to a file - `SCRUTINY_LOG_FILE=/tmp/web.log` - write the `webapp` logs to a file Finally, you can copy the files from the scrutiny container to your host using the following command(s) ``` docker cp scrutiny:/tmp/collector.log collector.log docker cp scrutiny:/tmp/web.log web.log ``` # Docker Development ``` docker build -f docker/Dockerfile . -t ghcr.io/analogj/scrutiny:master-omnibus docker run -it --rm -p 8080:8080 \ -v /run/udev:/run/udev:ro \ --cap-add SYS_RAWIO \ --device=/dev/sda \ --device=/dev/sdb \ ghcr.io/analogj/scrutiny:master-omnibus /opt/scrutiny/bin/scrutiny-collector-metrics run ``` # Running Tests ```bash docker run -p 8086:8086 -d --rm \ -e DOCKER_INFLUXDB_INIT_MODE=setup \ -e DOCKER_INFLUXDB_INIT_USERNAME=admin \ -e DOCKER_INFLUXDB_INIT_PASSWORD=password12345 \ -e DOCKER_INFLUXDB_INIT_ORG=scrutiny \ -e DOCKER_INFLUXDB_INIT_BUCKET=metrics \ -e DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my-super-secret-auth-token \ influxdb:2.8 go test ./... ``` ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2020 Jason Kulatunga Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: Makefile ================================================ .ONESHELL: # Applies to every targets in the file! .ONESHELL instructs make to invoke a single instance of the shell and provide it with the entire recipe, regardless of how many lines it contains. .SHELLFLAGS = -ec export GOTOOLCHAIN=go1.25.5 ######################################################################################################################## # Global Env Settings ######################################################################################################################## GO_WORKSPACE ?= /go/src/github.com/analogj/scrutiny COLLECTOR_BINARY_NAME = scrutiny-collector-metrics WEB_BINARY_NAME = scrutiny-web LD_FLAGS = STATIC_TAGS = # enable multiarch docker image builds DOCKER_TARGETARCH_BUILD_ARG = ifdef TARGETARCH DOCKER_TARGETARCH_BUILD_ARG := $(DOCKER_TARGETARCH_BUILD_ARG) --build-arg TARGETARCH=$(TARGETARCH) endif # enable to build static binaries. ifdef STATIC export CGO_ENABLED = 0 LD_FLAGS := $(LD_FLAGS) -extldflags=-static STATIC_TAGS := $(STATIC_TAGS) -tags "static netgo" endif ifdef GOOS COLLECTOR_BINARY_NAME := $(COLLECTOR_BINARY_NAME)-$(GOOS) WEB_BINARY_NAME := $(WEB_BINARY_NAME)-$(GOOS) LD_FLAGS := $(LD_FLAGS) -X main.goos=$(GOOS) endif ifdef GOARCH COLLECTOR_BINARY_NAME := $(COLLECTOR_BINARY_NAME)-$(GOARCH) WEB_BINARY_NAME := $(WEB_BINARY_NAME)-$(GOARCH) LD_FLAGS := $(LD_FLAGS) -X main.goarch=$(GOARCH) endif ifdef GOARM COLLECTOR_BINARY_NAME := $(COLLECTOR_BINARY_NAME)-$(GOARM) WEB_BINARY_NAME := $(WEB_BINARY_NAME)-$(GOARM) endif ifeq ($(OS),Windows_NT) COLLECTOR_BINARY_NAME := $(COLLECTOR_BINARY_NAME).exe WEB_BINARY_NAME := $(WEB_BINARY_NAME).exe endif ######################################################################################################################## # Binary ######################################################################################################################## .PHONY: all all: binary-all .PHONY: binary-all binary-all: binary-collector binary-web @echo "built binary-collector and binary-web targets" .PHONY: binary-clean binary-clean: go clean .PHONY: binary-dep binary-dep: go mod vendor .PHONY: binary-test binary-test: binary-dep go test -v $(STATIC_TAGS) ./... .PHONY: lint lint: GOTOOLCHAIN=go1.25.5 go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.8.0 golangci-lint run ./... .PHONY: binary-test-coverage binary-test-coverage: binary-dep go test -coverprofile=coverage.txt -covermode=atomic -v $(STATIC_TAGS) ./... .PHONY: binary-collector binary-collector: binary-dep go build -ldflags "$(LD_FLAGS)" -o $(COLLECTOR_BINARY_NAME) $(STATIC_TAGS) ./collector/cmd/collector-metrics/ ifneq ($(OS),Windows_NT) chmod +x $(COLLECTOR_BINARY_NAME) file $(COLLECTOR_BINARY_NAME) || true ldd $(COLLECTOR_BINARY_NAME) || true ./$(COLLECTOR_BINARY_NAME) || true endif .PHONY: binary-web binary-web: binary-dep go build -ldflags "$(LD_FLAGS)" -o $(WEB_BINARY_NAME) $(STATIC_TAGS) ./webapp/backend/cmd/scrutiny/ ifneq ($(OS),Windows_NT) chmod +x $(WEB_BINARY_NAME) file $(WEB_BINARY_NAME) || true ldd $(WEB_BINARY_NAME) || true ./$(WEB_BINARY_NAME) || true endif ######################################################################################################################## # Binary ######################################################################################################################## .PHONY: binary-frontend # reduce logging, disable angular-cli analytics for ci environment binary-frontend: export NPM_CONFIG_LOGLEVEL = warn binary-frontend: export NG_CLI_ANALYTICS = false binary-frontend: cd webapp/frontend npm install -g @angular/cli@v13-lts mkdir -p $(CURDIR)/dist npm ci npm run build:prod -- --output-path=$(CURDIR)/dist .PHONY: binary-frontend-test-coverage # reduce logging, disable angular-cli analytics for ci environment binary-frontend-test-coverage: cd webapp/frontend npm ci npx ng test --watch=false --browsers=ChromeHeadless --code-coverage ######################################################################################################################## # Docker # NOTE: these docker make targets are only used for local development (not used by Github Actions/CI) ######################################################################################################################## .PHONY: docker-collector docker-collector: @echo "building collector docker image" docker build $(DOCKER_TARGETARCH_BUILD_ARG) -f docker/Dockerfile.collector -t ghcr.io/analogj/scrutiny-dev:collector . .PHONY: docker-web docker-web: @echo "building web docker image" docker build $(DOCKER_TARGETARCH_BUILD_ARG) -f docker/Dockerfile.web -t ghcr.io/analogj/scrutiny-dev:web . .PHONY: docker-omnibus docker-omnibus: @echo "building omnibus docker image" docker build $(DOCKER_TARGETARCH_BUILD_ARG) -f docker/Dockerfile -t ghcr.io/analogj/scrutiny-dev:omnibus . ================================================ FILE: README.md ================================================

scrutiny_view

# scrutiny [![CI](https://github.com/AnalogJ/scrutiny/actions/workflows/ci.yaml/badge.svg)](https://github.com/AnalogJ/scrutiny/actions/workflows/ci.yaml) [![codecov](https://codecov.io/gh/AnalogJ/scrutiny/branch/master/graph/badge.svg)](https://codecov.io/gh/AnalogJ/scrutiny) [![GitHub license](https://img.shields.io/github/license/AnalogJ/scrutiny.svg?style=flat-square)](https://github.com/AnalogJ/scrutiny/blob/master/LICENSE) [![Godoc](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat-square)](https://godoc.org/github.com/analogj/scrutiny) [![Go Report Card](https://goreportcard.com/badge/github.com/AnalogJ/scrutiny?style=flat-square)](https://goreportcard.com/report/github.com/AnalogJ/scrutiny) [![GitHub release](http://img.shields.io/github/release/AnalogJ/scrutiny.svg?style=flat-square)](https://github.com/AnalogJ/scrutiny/releases) WebUI for smartd S.M.A.R.T monitoring > NOTE: Scrutiny is a Work-in-Progress and still has some rough edges. [![](docs/dashboard.png)](https://imgur.com/a/5k8qMzS) # Introduction If you run a server with more than a couple of hard drives, you're probably already familiar with S.M.A.R.T and the `smartd` daemon. If not, it's an incredible open source project described as the following: > smartd is a daemon that monitors the Self-Monitoring, Analysis and Reporting Technology (SMART) system built into many ATA, IDE and SCSI-3 hard drives. The purpose of SMART is to monitor the reliability of the hard drive and predict drive failures, and to carry out different types of drive self-tests. These S.M.A.R.T hard drive self-tests can help you detect and replace failing hard drives before they cause permanent data loss. However, there's a couple issues with `smartd`: - There are more than a hundred S.M.A.R.T attributes, however `smartd` does not differentiate between critical and informational metrics - `smartd` does not record S.M.A.R.T attribute history, so it can be hard to determine if an attribute is degrading slowly over time. - S.M.A.R.T attribute thresholds are set by the manufacturer. In some cases these thresholds are unset, or are so high that they can only be used to confirm a failed drive, rather than detecting a drive about to fail. - `smartd` is a command line only tool. For head-less servers a web UI would be more valuable. **Scrutiny is a Hard Drive Health Dashboard & Monitoring solution, merging manufacturer provided S.M.A.R.T metrics with real-world failure rates.** # Features Scrutiny is a simple but focused application, with a couple of core features: - Web UI Dashboard - focused on Critical metrics - `smartd` integration (no re-inventing the wheel) - Auto-detection of all connected hard-drives - S.M.A.R.T metric tracking for historical trends - Customized thresholds using real world failure rates - Temperature tracking - Provided as an all-in-one Docker image (but can be installed manually) - Configurable Alerting/Notifications via Webhooks - (Future) Hard Drive performance testing & tracking # Getting Started ## RAID/Virtual Drives Scrutiny uses `smartctl --scan` to detect devices/drives. - All RAID controllers supported by `smartctl` are automatically supported by Scrutiny. - While some RAID controllers support passing through the underlying SMART data to `smartctl` others do not. - In some cases `--scan` does not correctly detect the device type, returning [incomplete SMART data](https://github.com/AnalogJ/scrutiny/issues/45). Scrutiny supports overriding detected device type via the config file: see [example.collector.yaml](https://github.com/AnalogJ/scrutiny/blob/master/example.collector.yaml) - If you use docker, you **must** pass though the RAID virtual disk to the container using `--device` (see below) - This device may be in `/dev/*` or `/dev/bus/*`. - If you're unsure, run `smartctl --scan` on your host, and pass all listed devices to the container. See [docs/TROUBLESHOOTING_DEVICE_COLLECTOR.md](./docs/TROUBLESHOOTING_DEVICE_COLLECTOR.md) for help ## Docker > [!IMPORTANT] > Using `latest-` tags is dangerous as it can update your image without warning. It is a best practice to pin a specific version. scrutiny pushes releases with semver tags, > so you can use tags like `v0.8.2-omnibus`, `v0.8-web`, `v0-collector`, etc. For a list of all image tags see > [scrutiny package versions](https://github.com/AnalogJ/scrutiny/pkgs/container/scrutiny/versions?filters%5Bversion_type%5D=tagged) If you're using Docker, getting started is as simple as running the following command: > See [docker/example.omnibus.docker-compose.yml](https://github.com/AnalogJ/scrutiny/blob/master/docker/example.omnibus.docker-compose.yml) for a docker-compose file. ```bash docker run -p 8080:8080 -p 8086:8086 --restart unless-stopped \ -v `pwd`/scrutiny:/opt/scrutiny/config \ -v `pwd`/influxdb2:/opt/scrutiny/influxdb \ -v /run/udev:/run/udev:ro \ --cap-add SYS_RAWIO \ --device=/dev/sda \ --device=/dev/sdb \ --name scrutiny \ ghcr.io/analogj/scrutiny:latest-omnibus ``` - `/run/udev` is necessary to provide the Scrutiny collector with access to your device metadata - `--cap-add SYS_RAWIO` is necessary to allow `smartctl` permission to query your device SMART data - NOTE: If you have **NVMe** drives, you must add `--cap-add SYS_ADMIN` as well. See issue [#26](https://github.com/AnalogJ/scrutiny/issues/26#issuecomment-696817130) - `--device` entries are required to ensure that your hard disk devices are accessible within the container. - `ghcr.io/analogj/scrutiny:latest-omnibus` is a omnibus image, containing both the webapp server (frontend & api) as well as the S.M.A.R.T metric collector. (see below) ### Hub/Spoke Deployment In addition to the Omnibus image (available under the `latest` tag) you can deploy in Hub/Spoke mode, which requires 3 other Docker images: - `ghcr.io/analogj/scrutiny:latest-collector` - Contains the Scrutiny data collector, `smartctl` binary and cron-like scheduler. You can run one collector on each server. - `ghcr.io/analogj/scrutiny:latest-web` - Contains the Web UI and API. Only one container necessary - `influxdb:2.8` - InfluxDB image, used by the Web container to persist SMART data. Only one container necessary See [docs/TROUBLESHOOTING_INFLUXDB.md](./docs/TROUBLESHOOTING_INFLUXDB.md) > See [docker/example.hubspoke.docker-compose.yml](https://github.com/AnalogJ/scrutiny/blob/master/docker/example.hubspoke.docker-compose.yml) for a docker-compose file. ```bash docker run -p 8086:8086 --restart unless-stopped \ -v `pwd`/influxdb2:/var/lib/influxdb2 \ --name scrutiny-influxdb \ influxdb:2.8 docker run -p 8080:8080 --restart unless-stopped \ -v `pwd`/scrutiny:/opt/scrutiny/config \ --name scrutiny-web \ ghcr.io/analogj/scrutiny:latest-web docker run --restart unless-stopped \ -v /run/udev:/run/udev:ro \ --cap-add SYS_RAWIO \ --device=/dev/sda \ --device=/dev/sdb \ -e COLLECTOR_API_ENDPOINT=http://SCRUTINY_WEB_IPADDRESS:8080 \ --name scrutiny-collector \ ghcr.io/analogj/scrutiny:latest-collector ``` ### Hub rootless installation using Podman Quadlets See [docs/INSTALL_ROOTLESS_PODMAN.md](docs/INSTALL_ROOTLESS_PODMAN.md) for instructions. ## Manual Installation (without-Docker) While the easiest way to get started with [Scrutiny is using Docker](https://github.com/AnalogJ/scrutiny#docker), it is possible to run it manually without much work. You can even mix and match, using Docker for one component and a manual installation for the other. See [docs/INSTALL_MANUAL.md](docs/INSTALL_MANUAL.md) for instructions. ## Usage Once scrutiny is running, you can open your browser to `http://localhost:8080` and take a look at the dashboard. If you're using the omnibus image, the collector should already have run, and your dashboard should be populate with every drive that Scrutiny detected. The collector is configured to run once a day, but you can trigger it manually by running the command below. For users of the docker Hub/Spoke deployment or manual install: initially the dashboard will be empty. After the first collector run, you'll be greeted with a list of all your hard drives and their current smart status. ```bash docker exec scrutiny /opt/scrutiny/bin/scrutiny-collector-metrics run ``` # Configuration By default Scrutiny looks for its YAML configuration files in `/opt/scrutiny/config` There are two configuration files available: - Webapp/API config via `scrutiny.yaml` - [example.scrutiny.yaml](example.scrutiny.yaml). - Collector config via `collector.yaml` - [example.collector.yaml](example.collector.yaml). Neither file is required, however if provided, it allows you to configure how Scrutiny functions. ## Cron Schedule Unfortunately the Cron schedule cannot be configured via the `collector.yaml` (as the collector binary needs to be trigged by a scheduler/cron). However, if you are using the official `ghcr.io/analogj/scrutiny:latest-collector` or `ghcr.io/analogj/scrutiny:latest-omnibus` docker images, you can use the `COLLECTOR_CRON_SCHEDULE` environmental variable to override the default cron schedule (daily @ midnight - `0 0 * * *`). `docker run -e COLLECTOR_CRON_SCHEDULE="0 0 * * *" ...` ## Notifications Scrutiny supports sending SMART device failure notifications via the following services: - Custom Script (data provided via environmental variables) - Email - Webhooks - Discord - Gotify - Hangouts - IFTTT - Join - Mattermost - ntfy - Pushbullet - Pushover - Slack - Teams - Telegram - Tulip Check the `notify.urls` section of [example.scrutiny.yml](example.scrutiny.yaml) for examples. For more information and troubleshooting, see the [TROUBLESHOOTING_NOTIFICATIONS.md](./docs/TROUBLESHOOTING_NOTIFICATIONS.md) file ### Testing Notifications You can test that your notifications are configured correctly by posting an empty payload to the notifications health check API. ```bash curl -X POST http://localhost:8080/api/health/notify ``` # Debug mode & Log Files Scrutiny provides various methods to change the log level to debug and generate log files. ## Web Server/API You can use environmental variables to enable debug logging and/or log files for the web server: ```bash DEBUG=true SCRUTINY_LOG_FILE=/tmp/web.log ``` You can configure the log level and log file in the config file: ```yml log: file: '/tmp/web.log' level: DEBUG ``` Or if you're not using docker, you can pass CLI arguments to the web server during startup: ```bash scrutiny start --debug --log-file /tmp/web.log ``` ## Collector You can use environmental variables to enable debug logging and/or log files for the collector: ```bash DEBUG=true COLLECTOR_LOG_FILE=/tmp/collector.log ``` Or if you're not using docker, you can pass CLI arguments to the collector during startup: ```bash scrutiny-collector-metrics run --debug --log-file /tmp/collector.log ``` # Supported Architectures | Architecture Name | Binaries | Docker | | --- | --- | --- | | linux-amd64 | :white_check_mark: | :white_check_mark: | | linux-arm-5 | :white_check_mark: | | | linux-arm-6 | :white_check_mark: | | | linux-arm-7 | :white_check_mark: | web/collector only. see [#236](https://github.com/AnalogJ/scrutiny/issues/236) | | linux-arm64 | :white_check_mark: | :white_check_mark: | | freebsd-amd64 | :white_check_mark: | | | macos-amd64 | :white_check_mark: | :white_check_mark: | | macos-arm64 | :white_check_mark: | :white_check_mark: | | windows-amd64 | :white_check_mark: | WIP, see [#15](https://github.com/AnalogJ/scrutiny/issues/15) | | windows-arm64 | :white_check_mark: | | # Contributing Please see the [CONTRIBUTING.md](CONTRIBUTING.md) for instructions for how to develop and contribute to the scrutiny codebase. Work your magic and then submit a pull request. We love pull requests! If you find the documentation lacking, help us out and update this README.md. If you don't have the time to work on Scrutiny, but found something we should know about, please submit an issue. # Versioning We use SemVer for versioning. For the versions available, see the tags on this repository. # Authors * Jason Kulatunga - Initial Development - [@AnalogJ](https://github.com/AnalogJ/) * Aram Akhavan - Maintenence - [@kaysond](https://github.com/kaysond/) # Licenses - MIT - Logo: [Glasses by matias porta lezcano](https://thenounproject.com/term/glasses/775232) # Sponsors Scrutiny is only possible with the help of my [Github Sponsors](https://github.com/sponsors/AnalogJ/). [![](docs/sponsors.png)](https://github.com/sponsors/AnalogJ/) They read a simple [reddit announcement post](https://github.com/sponsors/AnalogJ/) and decided to trust & finance a developer they've never met. It's an exciting and incredibly humbling experience. If you found Scrutiny valuable, please consider [supporting my work](https://github.com/sponsors/AnalogJ/) ================================================ FILE: REFERENCES.md ================================================ # Gorm - https://www.reddit.com/r/golang/comments/exmwos/golang_gorm_preload_with_last/ - https://blog.depado.eu/post/gorm-gotchas - # Smart Data - https://kb.acronis.com/content/9123 ================================================ FILE: collector/cmd/collector-metrics/collector-metrics.go ================================================ package main import ( "encoding/json" "fmt" "io" "log" "os" "strings" "time" "github.com/analogj/scrutiny/collector/pkg/collector" "github.com/analogj/scrutiny/collector/pkg/config" "github.com/analogj/scrutiny/collector/pkg/errors" "github.com/analogj/scrutiny/webapp/backend/pkg/version" "github.com/sirupsen/logrus" utils "github.com/analogj/go-util/utils" "github.com/fatih/color" "github.com/urfave/cli/v2" ) var goos string var goarch string func main() { config, err := config.Create() if err != nil { fmt.Printf("FATAL: %+v\n", err) os.Exit(1) } configFilePath := "/opt/scrutiny/config/collector.yaml" configFilePathAlternative := "/opt/scrutiny/config/collector.yml" if !utils.FileExists(configFilePath) && utils.FileExists(configFilePathAlternative) { configFilePath = configFilePathAlternative } //we're going to load the config file manually, since we need to validate it. err = config.ReadConfig(configFilePath) // Find and read the config file if _, ok := err.(errors.ConfigFileMissingError); ok { // Handle errors reading the config file //ignore "could not find config file" } else if err != nil { os.Exit(1) } cli.CommandHelpTemplate = `NAME: {{.HelpName}} - {{.Usage}} USAGE: {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}} CATEGORY: {{.Category}}{{end}}{{if .Description}} DESCRIPTION: {{.Description}}{{end}}{{if .VisibleFlags}} OPTIONS: {{range .VisibleFlags}}{{.}} {{end}}{{end}} ` app := &cli.App{ Name: "scrutiny-collector-metrics", Usage: "smartctl data collector for scrutiny", Version: version.VERSION, Compiled: time.Now(), Authors: []*cli.Author{ { Name: "Jason Kulatunga", Email: "jason@thesparktree.com", }, }, Before: func(c *cli.Context) error { collectorMetrics := "AnalogJ/scrutiny/metrics" var versionInfo string if len(goos) > 0 && len(goarch) > 0 { versionInfo = fmt.Sprintf("%s.%s-%s", goos, goarch, version.VERSION) } else { versionInfo = fmt.Sprintf("dev-%s", version.VERSION) } subtitle := collectorMetrics + utils.LeftPad2Len(versionInfo, " ", 65-len(collectorMetrics)) color.New(color.FgGreen).Fprintf(c.App.Writer, utils.StripIndent( ` ___ ___ ____ __ __ ____ ____ _ _ _ _ / __) / __)( _ \( )( )(_ _)(_ _)( \( )( \/ ) \__ \( (__ ) / )(__)( )( _)(_ ) ( \ / (___/ \___)(_)\_)(______) (__) (____)(_)\_) (__) %s `), subtitle) return nil }, Commands: []*cli.Command{ { Name: "run", Usage: "Run the scrutiny smartctl metrics collector", Action: func(c *cli.Context) error { if c.IsSet("config") { err = config.ReadConfig(c.String("config")) // Find and read the config file if err != nil { // Handle errors reading the config file //ignore "could not find config file" fmt.Printf("Could not find config file at specified path: %s", c.String("config")) return err } } //override config with flags if set if c.IsSet("host-id") { config.Set("host.id", c.String("host-id")) // set/override the host-id using CLI. } if c.Bool("debug") { config.Set("log.level", "DEBUG") } if c.IsSet("log-file") { config.Set("log.file", c.String("log-file")) } if c.IsSet("api-endpoint") { //if the user is providing an api-endpoint with a basepath (eg. http://localhost:8080/scrutiny), //we need to ensure the basepath has a trailing slash, otherwise the url.Parse() path concatenation doesnt work. apiEndpoint := strings.TrimSuffix(c.String("api-endpoint"), "/") + "/" config.Set("api.endpoint", apiEndpoint) } collectorLogger, logFile, err := CreateLogger(config) if logFile != nil { defer logFile.Close() } if err != nil { return err } settingsData, err := json.MarshalIndent(config.AllSettings(), "", "\t") collectorLogger.Debug(string(settingsData), err) metricCollector, err := collector.CreateMetricsCollector( config, collectorLogger, config.GetString("api.endpoint"), ) if err != nil { return err } return metricCollector.Run() }, Flags: []cli.Flag{ &cli.StringFlag{ Name: "config", Usage: "Specify the path to the devices file", }, &cli.StringFlag{ Name: "api-endpoint", Usage: "The api server endpoint", EnvVars: []string{"COLLECTOR_API_ENDPOINT", "SCRUTINY_API_ENDPOINT"}, //SCRUTINY_API_ENDPOINT is deprecated, but kept for backwards compatibility }, &cli.StringFlag{ Name: "log-file", Usage: "Path to file for logging. Leave empty to use STDOUT", EnvVars: []string{"COLLECTOR_LOG_FILE"}, }, &cli.BoolFlag{ Name: "debug", Usage: "Enable debug logging", EnvVars: []string{"COLLECTOR_DEBUG", "DEBUG"}, }, &cli.StringFlag{ Name: "host-id", Usage: "Host identifier/label, used for grouping devices", Value: "", EnvVars: []string{"COLLECTOR_HOST_ID"}, }, }, }, }, } err = app.Run(os.Args) if err != nil { log.Fatal(color.HiRedString("ERROR: %v", err)) } } func CreateLogger(appConfig config.Interface) (*logrus.Entry, *os.File, error) { logger := logrus.WithFields(logrus.Fields{ "type": "metrics", }) if level, err := logrus.ParseLevel(appConfig.GetString("log.level")); err == nil { logger.Logger.SetLevel(level) } else { logger.Logger.SetLevel(logrus.InfoLevel) } var logFile *os.File var err error if appConfig.IsSet("log.file") && len(appConfig.GetString("log.file")) > 0 { logFile, err = os.OpenFile(appConfig.GetString("log.file"), os.O_CREATE|os.O_WRONLY, 0644) if err != nil { logger.Logger.Errorf("Failed to open log file %s for output: %s", appConfig.GetString("log.file"), err) return nil, logFile, err } logger.Logger.SetOutput(io.MultiWriter(os.Stderr, logFile)) } return logger, logFile, nil } ================================================ FILE: collector/cmd/collector-selftest/collector-selftest.go ================================================ package main import ( "fmt" "io" "log" "os" "time" "github.com/analogj/scrutiny/collector/pkg/collector" "github.com/analogj/scrutiny/webapp/backend/pkg/version" "github.com/sirupsen/logrus" utils "github.com/analogj/go-util/utils" "github.com/fatih/color" "github.com/urfave/cli/v2" ) var goos string var goarch string func main() { cli.CommandHelpTemplate = `NAME: {{.HelpName}} - {{.Usage}} USAGE: {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}} CATEGORY: {{.Category}}{{end}}{{if .Description}} DESCRIPTION: {{.Description}}{{end}}{{if .VisibleFlags}} OPTIONS: {{range .VisibleFlags}}{{.}} {{end}}{{end}} ` app := &cli.App{ Name: "scrutiny-collector-selftest", Usage: "smartctl self-test data collector for scrutiny", Version: version.VERSION, Compiled: time.Now(), Authors: []*cli.Author{ { Name: "Jason Kulatunga", Email: "jason@thesparktree.com", }, }, Before: func(c *cli.Context) error { collectorSelfTest := "AnalogJ/scrutiny/selftest" var versionInfo string if len(goos) > 0 && len(goarch) > 0 { versionInfo = fmt.Sprintf("%s.%s-%s", goos, goarch, version.VERSION) } else { versionInfo = fmt.Sprintf("dev-%s", version.VERSION) } subtitle := collectorSelfTest + utils.LeftPad2Len(versionInfo, " ", 65-len(collectorSelfTest)) color.New(color.FgGreen).Fprintf(c.App.Writer, utils.StripIndent( ` ___ ___ ____ __ __ ____ ____ _ _ _ _ / __) / __)( _ \( )( )(_ _)(_ _)( \( )( \/ ) \__ \( (__ ) / )(__)( )( _)(_ ) ( \ / (___/ \___)(_)\_)(______) (__) (____)(_)\_) (__) %s `), subtitle) return nil }, Commands: []*cli.Command{ { Name: "run", Usage: "Run the scrutiny self-test data collector", Action: func(c *cli.Context) error { collectorLogger := logrus.WithFields(logrus.Fields{ "type": "selftest", }) if c.Bool("debug") { logrus.SetLevel(logrus.DebugLevel) } else { logrus.SetLevel(logrus.InfoLevel) } if c.IsSet("log-file") { logFile, err := os.OpenFile(c.String("log-file"), os.O_CREATE|os.O_WRONLY, 0644) if err != nil { logrus.Errorf("Failed to open log file %s for output: %s", c.String("log-file"), err) return err } defer logFile.Close() logrus.SetOutput(io.MultiWriter(os.Stderr, logFile)) } //TODO: pass in the collector, use configuration from collector-metrics stCollector, err := collector.CreateSelfTestCollector( collectorLogger, c.String("api-endpoint"), ) if err != nil { return err } return stCollector.Run() }, Flags: []cli.Flag{ &cli.StringFlag{ Name: "api-endpoint", Usage: "The api server endpoint", Value: "http://localhost:8080", EnvVars: []string{"COLLECTOR_API_ENDPOINT"}, }, &cli.StringFlag{ Name: "log-file", Usage: "Path to file for logging. Leave empty to use STDOUT", Value: "", EnvVars: []string{"COLLECTOR_LOG_FILE"}, }, &cli.BoolFlag{ Name: "debug", Usage: "Enable debug logging", EnvVars: []string{"COLLECTOR_DEBUG", "DEBUG"}, }, }, }, }, } err := app.Run(os.Args) if err != nil { log.Fatal(color.HiRedString("ERROR: %v", err)) } } ================================================ FILE: collector/pkg/collector/base.go ================================================ package collector import ( "bytes" "encoding/json" "net/http" "time" "github.com/sirupsen/logrus" ) var httpClient = &http.Client{Timeout: 60 * time.Second} type BaseCollector struct { logger *logrus.Entry } func (c *BaseCollector) postJson(url string, body interface{}, target interface{}) error { requestBody, err := json.Marshal(body) if err != nil { return err } r, err := httpClient.Post(url, "application/json", bytes.NewBuffer(requestBody)) if err != nil { return err } defer r.Body.Close() return json.NewDecoder(r.Body).Decode(target) } // http://www.linuxguide.it/command_line/linux-manpage/do.php?file=smartctl#sect7 func (c *BaseCollector) LogSmartctlExitCode(exitCode int) { if exitCode&0x01 != 0 { c.logger.Errorln("smartctl could not parse commandline") } else if exitCode&0x02 != 0 { c.logger.Errorln("smartctl could not open device") } else if exitCode&0x04 != 0 { c.logger.Errorln("smartctl detected a checksum error") } else if exitCode&0x08 != 0 { c.logger.Errorln("smartctl detected a failing disk ") } else if exitCode&0x10 != 0 { c.logger.Errorln("smartctl detected a disk in pre-fail") } else if exitCode&0x20 != 0 { c.logger.Errorln("smartctl detected a disk close to failure") } else if exitCode&0x40 != 0 { c.logger.Errorln("smartctl detected a error log with errors") } else if exitCode&0x80 != 0 { c.logger.Errorln("smartctl detected a self test log with errors") } } ================================================ FILE: collector/pkg/collector/metrics.go ================================================ package collector import ( "bytes" "encoding/json" "fmt" "net/url" "os" "os/exec" "strings" "time" "github.com/analogj/scrutiny/collector/pkg/common/shell" "github.com/analogj/scrutiny/collector/pkg/config" "github.com/analogj/scrutiny/collector/pkg/detect" "github.com/analogj/scrutiny/collector/pkg/errors" "github.com/analogj/scrutiny/collector/pkg/models" "github.com/samber/lo" "github.com/sirupsen/logrus" ) type MetricsCollector struct { config config.Interface BaseCollector apiEndpoint *url.URL shell shell.Interface } func CreateMetricsCollector(appConfig config.Interface, logger *logrus.Entry, apiEndpoint string) (MetricsCollector, error) { apiEndpointUrl, err := url.Parse(apiEndpoint) if err != nil { return MetricsCollector{}, err } sc := MetricsCollector{ config: appConfig, apiEndpoint: apiEndpointUrl, BaseCollector: BaseCollector{ logger: logger, }, shell: shell.Create(), } return sc, nil } func (mc *MetricsCollector) Run() error { err := mc.Validate() if err != nil { return err } apiEndpoint, _ := url.Parse(mc.apiEndpoint.String()) apiEndpoint, _ = apiEndpoint.Parse("api/devices/register") //this acts like filepath.Join() deviceRespWrapper := new(models.DeviceWrapper) deviceDetector := detect.Detect{ Logger: mc.logger, Config: mc.config, } rawDetectedStorageDevices, err := deviceDetector.Start() if err != nil { return err } //filter any device with empty wwn (they are invalid) detectedStorageDevices := lo.Filter[models.Device](rawDetectedStorageDevices, func(dev models.Device, _ int) bool { return len(dev.WWN) > 0 }) mc.logger.Infoln("Sending detected devices to API, for filtering & validation") jsonObj, _ := json.Marshal(detectedStorageDevices) mc.logger.Debugf("Detected devices: %v", string(jsonObj)) err = mc.postJson(apiEndpoint.String(), models.DeviceWrapper{ Data: detectedStorageDevices, }, &deviceRespWrapper) if err != nil { return err } if !deviceRespWrapper.Success { mc.logger.Errorln("An error occurred while retrieving filtered devices") mc.logger.Debugln(deviceRespWrapper) return errors.ApiServerCommunicationError("An error occurred while retrieving filtered devices") } else { mc.logger.Debugln(deviceRespWrapper) //var wg sync.WaitGroup for _, device := range deviceRespWrapper.Data { // execute collection in parallel go-routines //wg.Add(1) //go mc.Collect(&wg, device.WWN, device.DeviceName, device.DeviceType) mc.Collect(device.WWN, device.DeviceName, device.DeviceType) if mc.config.GetInt("commands.metrics_smartctl_wait") > 0 { time.Sleep(time.Duration(mc.config.GetInt("commands.metrics_smartctl_wait")) * time.Second) } } //mc.logger.Infoln("Main: Waiting for workers to finish") //wg.Wait() mc.logger.Infoln("Main: Completed") } return nil } func (mc *MetricsCollector) Validate() error { mc.logger.Infoln("Verifying required tools") _, lookErr := exec.LookPath(mc.config.GetString("commands.metrics_smartctl_bin")) if lookErr != nil { return errors.DependencyMissingError(fmt.Sprintf("%s binary is missing", mc.config.GetString("commands.metrics_smartctl_bin"))) } return nil } // func (mc *MetricsCollector) Collect(wg *sync.WaitGroup, deviceWWN string, deviceName string, deviceType string) { func (mc *MetricsCollector) Collect(deviceWWN string, deviceName string, deviceType string) { //defer wg.Done() if len(deviceWWN) == 0 { mc.logger.Errorf("no device WWN detected for %s. Skipping collection for this device (no data association possible).\n", deviceName) return } mc.logger.Infof("Collecting smartctl results for %s\n", deviceName) fullDeviceName := fmt.Sprintf("%s%s", detect.DevicePrefix(), deviceName) args := strings.Split(mc.config.GetCommandMetricsSmartArgs(fullDeviceName), " ") //only include the device type if its a non-standard one. In some cases ata drives are detected as scsi in docker, and metadata is lost. if len(deviceType) > 0 && deviceType != "scsi" && deviceType != "ata" { args = append(args, "--device", deviceType) } args = append(args, fullDeviceName) result, err := mc.shell.Command(mc.logger, mc.config.GetString("commands.metrics_smartctl_bin"), args, "", os.Environ()) resultBytes := []byte(result) if err != nil { if exitError, ok := err.(*exec.ExitError); ok { // smartctl command exited with an error, we should still push the data to the API server mc.logger.Errorf("smartctl returned an error code (%d) while processing %s\n", exitError.ExitCode(), deviceName) mc.LogSmartctlExitCode(exitError.ExitCode()) mc.Publish(deviceWWN, resultBytes) } else { mc.logger.Errorf("error while attempting to execute smartctl: %s\n", deviceName) mc.logger.Errorf("ERROR MESSAGE: %v", err) mc.logger.Errorf("IGNORING RESULT: %v", result) } return } else { //successful run, pass the results directly to webapp backend for parsing and processing. mc.Publish(deviceWWN, resultBytes) } } func (mc *MetricsCollector) Publish(deviceWWN string, payload []byte) error { mc.logger.Infof("Publishing smartctl results for %s\n", deviceWWN) apiEndpoint, _ := url.Parse(mc.apiEndpoint.String()) apiEndpoint, _ = apiEndpoint.Parse(fmt.Sprintf("api/device/%s/smart", strings.ToLower(deviceWWN))) resp, err := httpClient.Post(apiEndpoint.String(), "application/json", bytes.NewBuffer(payload)) if err != nil { mc.logger.Errorf("An error occurred while publishing SMART data for device (%s): %v", deviceWWN, err) return err } defer resp.Body.Close() return nil } ================================================ FILE: collector/pkg/collector/metrics_test.go ================================================ package collector import ( "github.com/stretchr/testify/require" "net/url" "testing" ) func TestApiEndpointParse(t *testing.T) { baseURL, _ := url.Parse("http://localhost:8080/") url1, _ := baseURL.Parse("d/e") require.Equal(t, "http://localhost:8080/d/e", url1.String()) url2, _ := baseURL.Parse("/d/e") require.Equal(t, "http://localhost:8080/d/e", url2.String()) } func TestApiEndpointParse_WithBasepathWithoutTrailingSlash(t *testing.T) { baseURL, _ := url.Parse("http://localhost:8080/scrutiny") //This testcase is unexpected and can cause issues. We need to ensure the apiEndpoint always has a trailing slash. url1, _ := baseURL.Parse("d/e") require.Equal(t, "http://localhost:8080/d/e", url1.String()) url2, _ := baseURL.Parse("/d/e") require.Equal(t, "http://localhost:8080/d/e", url2.String()) } func TestApiEndpointParse_WithBasepathWithTrailingSlash(t *testing.T) { baseURL, _ := url.Parse("http://localhost:8080/scrutiny/") url1, _ := baseURL.Parse("d/e") require.Equal(t, "http://localhost:8080/scrutiny/d/e", url1.String()) url2, _ := baseURL.Parse("/d/e") require.Equal(t, "http://localhost:8080/d/e", url2.String()) } ================================================ FILE: collector/pkg/collector/selftest.go ================================================ package collector import ( "github.com/sirupsen/logrus" "net/url" ) type SelfTestCollector struct { BaseCollector apiEndpoint *url.URL logger *logrus.Entry } func CreateSelfTestCollector(logger *logrus.Entry, apiEndpoint string) (SelfTestCollector, error) { apiEndpointUrl, err := url.Parse(apiEndpoint) if err != nil { return SelfTestCollector{}, err } stc := SelfTestCollector{ apiEndpoint: apiEndpointUrl, logger: logger, } return stc, nil } func (sc *SelfTestCollector) Run() error { return nil } ================================================ FILE: collector/pkg/common/shell/factory.go ================================================ package shell func Create() Interface { return new(localShell) } ================================================ FILE: collector/pkg/common/shell/interface.go ================================================ package shell import ( "github.com/sirupsen/logrus" ) // Create mock using: // mockgen -source=collector/pkg/common/shell/interface.go -destination=collector/pkg/common/shell/mock/mock_shell.go type Interface interface { Command(logger *logrus.Entry, cmdName string, cmdArgs []string, workingDir string, environ []string) (string, error) } ================================================ FILE: collector/pkg/common/shell/local_shell.go ================================================ package shell import ( "bytes" "errors" "io" "os/exec" "path" "strings" "github.com/sirupsen/logrus" ) type localShell struct{} func (s *localShell) Command(logger *logrus.Entry, cmdName string, cmdArgs []string, workingDir string, environ []string) (string, error) { logger.Infof("Executing command: %s %s", cmdName, strings.Join(cmdArgs, " ")) cmd := exec.Command(cmdName, cmdArgs...) var stdBuffer bytes.Buffer logWriters := []io.Writer{ &stdBuffer, } if logger.Logger.Level == logrus.DebugLevel { logWriters = append(logWriters, logger.Logger.Out) } mw := io.MultiWriter(logWriters...) cmd.Stdout = mw cmd.Stderr = mw if environ != nil { cmd.Env = environ } if workingDir != "" && path.IsAbs(workingDir) { cmd.Dir = workingDir } else if workingDir != "" { return "", errors.New("working directory must be an absolute path") } err := cmd.Run() return stdBuffer.String(), err } ================================================ FILE: collector/pkg/common/shell/local_shell_test.go ================================================ package shell import ( "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" "os/exec" "testing" ) func TestLocalShellCommand(t *testing.T) { t.Parallel() //setup testShell := localShell{} //test result, err := testShell.Command(logrus.WithField("exec", "test"), "echo", []string{"hello world"}, "", nil) //assert require.NoError(t, err) require.Equal(t, "hello world\n", result) } func TestLocalShellCommand_Date(t *testing.T) { t.Parallel() //setup testShell := localShell{} //test _, err := testShell.Command(logrus.WithField("exec", "test"), "date", []string{}, "", nil) //assert require.NoError(t, err) } // //func TestExecCmd_Error(t *testing.T) { // t.Parallel() // // //setup // bc := collector.BaseCollector {} // // //test // _, err := bc.ExecCmd("smartctl", []string{"-a", "/dev/doesnotexist"}, "", nil) // // //assert // exitError, castOk := err.(*exec.ExitError); // require.True(t, castOk) // require.Equal(t, 1, exitError.ExitCode()) // //} // func TestLocalShellCommand_InvalidCommand(t *testing.T) { t.Parallel() //setup testShell := localShell{} //test _, err := testShell.Command(logrus.WithField("exec", "test"), "invalid_binary", []string{}, "", nil) //assert _, castOk := err.(*exec.ExitError) require.False(t, castOk) } ================================================ FILE: collector/pkg/common/shell/mock/mock_shell.go ================================================ // Code generated by MockGen. DO NOT EDIT. // Source: collector/pkg/common/shell/interface.go // Package mock_shell is a generated GoMock package. package mock_shell import ( reflect "reflect" logrus "github.com/sirupsen/logrus" gomock "go.uber.org/mock/gomock" ) // MockInterface is a mock of Interface interface. type MockInterface struct { ctrl *gomock.Controller recorder *MockInterfaceMockRecorder } // MockInterfaceMockRecorder is the mock recorder for MockInterface. type MockInterfaceMockRecorder struct { mock *MockInterface } // NewMockInterface creates a new mock instance. func NewMockInterface(ctrl *gomock.Controller) *MockInterface { mock := &MockInterface{ctrl: ctrl} mock.recorder = &MockInterfaceMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use. func (m *MockInterface) EXPECT() *MockInterfaceMockRecorder { return m.recorder } // Command mocks base method. func (m *MockInterface) Command(logger *logrus.Entry, cmdName string, cmdArgs []string, workingDir string, environ []string) (string, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Command", logger, cmdName, cmdArgs, workingDir, environ) ret0, _ := ret[0].(string) ret1, _ := ret[1].(error) return ret0, ret1 } // Command indicates an expected call of Command. func (mr *MockInterfaceMockRecorder) Command(logger, cmdName, cmdArgs, workingDir, environ interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Command", reflect.TypeOf((*MockInterface)(nil).Command), logger, cmdName, cmdArgs, workingDir, environ) } ================================================ FILE: collector/pkg/config/config.go ================================================ package config import ( "fmt" "log" "os" "sort" "strings" "github.com/analogj/go-util/utils" "github.com/analogj/scrutiny/collector/pkg/errors" "github.com/analogj/scrutiny/collector/pkg/models" "github.com/go-viper/mapstructure/v2" "github.com/spf13/viper" ) // When initializing this class the following methods must be called: // Config.New // Config.Init // This is done automatically when created via the Factory. type configuration struct { *viper.Viper deviceOverrides []models.ScanOverride } //Viper uses the following precedence order. Each item takes precedence over the item below it: // explicit call to Set // flag // env // config // key/value store // default func (c *configuration) Init() error { c.Viper = viper.New() //set defaults c.SetDefault("host.id", "") c.SetDefault("devices", []string{}) c.SetDefault("log.level", "INFO") c.SetDefault("log.file", "") c.SetDefault("api.endpoint", "http://localhost:8080") c.SetDefault("commands.metrics_smartctl_bin", "smartctl") c.SetDefault("commands.metrics_scan_args", "--scan --json") c.SetDefault("commands.metrics_info_args", "--info --json") c.SetDefault("commands.metrics_smart_args", "--xall --json") c.SetDefault("commands.metrics_smartctl_wait", 0) //configure env variable parsing. c.SetEnvPrefix("COLLECTOR") c.SetEnvKeyReplacer(strings.NewReplacer("-", "_", ".", "_")) c.AutomaticEnv() //c.SetDefault("collect.short.command", "-a -o on -S on") c.SetDefault("allow_listed_devices", []string{}) //if you want to load a non-standard location system config file (~/drawbridge.yml), use ReadConfig c.SetConfigType("yaml") //c.SetConfigName("drawbridge") //c.AddConfigPath("$HOME/") //CLI options will be added via the `Set()` function return nil } func (c *configuration) ReadConfig(configFilePath string) error { configFilePath, err := utils.ExpandPath(configFilePath) if err != nil { return err } if !utils.FileExists(configFilePath) { log.Printf("No configuration file found at %v. Using Defaults.", configFilePath) return errors.ConfigFileMissingError("The configuration file could not be found.") } //validate config file contents //err = c.ValidateConfigFile(configFilePath) //if err != nil { // log.Printf("Config file at `%v` is invalid: %s", configFilePath, err) // return err //} log.Printf("Loading configuration file: %s", configFilePath) config_data, err := os.Open(configFilePath) if err != nil { log.Printf("Error reading configuration file: %s", err) return err } err = c.MergeConfig(config_data) if err != nil { return err } return c.ValidateConfig() } // This function ensures that the merged config works correctly. func (c *configuration) ValidateConfig() error { //TODO: // check that device prefix matches OS // check that schema of config file is valid // check that the collector commands are valid commandArgStrings := map[string]string{ "commands.metrics_scan_args": c.GetString("commands.metrics_scan_args"), "commands.metrics_info_args": c.GetString("commands.metrics_info_args"), "commands.metrics_smart_args": c.GetString("commands.metrics_smart_args"), } errorStrings := []string{} for configKey, commandArgString := range commandArgStrings { args := strings.Split(commandArgString, " ") //ensure that the args string contains `--json` or `-j` flag containsJsonFlag := false containsDeviceFlag := false for _, flag := range args { if strings.HasPrefix(flag, "--json") || strings.HasPrefix(flag, "-j") { containsJsonFlag = true } if strings.HasPrefix(flag, "--device") || strings.HasPrefix(flag, "-d") { containsDeviceFlag = true } } if !containsJsonFlag { errorStrings = append(errorStrings, fmt.Sprintf("configuration key '%s' is missing '--json' flag", configKey)) } if containsDeviceFlag { errorStrings = append(errorStrings, fmt.Sprintf("configuration key '%s' must not contain '--device' or '-d' flag", configKey)) } } //sort(errorStrings) sort.Strings(errorStrings) if len(errorStrings) == 0 { return nil } else { return errors.ConfigValidationError(strings.Join(errorStrings, ", ")) } } func (c *configuration) GetDeviceOverrides() []models.ScanOverride { // we have to support 2 types of device types. // - simple device type (device_type: 'sat') // and list of device types (type: \n- 3ware,0 \n- 3ware,1 \n- 3ware,2) // GetString will return "" if this is a list of device types. if c.deviceOverrides == nil { overrides := []models.ScanOverride{} c.UnmarshalKey("devices", &overrides, func(c *mapstructure.DecoderConfig) { c.WeaklyTypedInput = true }) c.deviceOverrides = overrides } return c.deviceOverrides } func (c *configuration) GetCommandMetricsInfoArgs(deviceName string) string { overrides := c.GetDeviceOverrides() for _, deviceOverrides := range overrides { if strings.EqualFold(deviceName, deviceOverrides.Device) { //found matching device if len(deviceOverrides.Commands.MetricsInfoArgs) > 0 { return deviceOverrides.Commands.MetricsInfoArgs } else { return c.GetString("commands.metrics_info_args") } } } return c.GetString("commands.metrics_info_args") } func (c *configuration) GetCommandMetricsSmartArgs(deviceName string) string { overrides := c.GetDeviceOverrides() for _, deviceOverrides := range overrides { if strings.EqualFold(deviceName, deviceOverrides.Device) { //found matching device if len(deviceOverrides.Commands.MetricsSmartArgs) > 0 { return deviceOverrides.Commands.MetricsSmartArgs } else { return c.GetString("commands.metrics_smart_args") } } } return c.GetString("commands.metrics_smart_args") } func (c *configuration) IsAllowlistedDevice(deviceName string) bool { allowList := c.GetStringSlice("allow_listed_devices") if len(allowList) == 0 { return true } for _, item := range allowList { if item == deviceName { return true } } return false } ================================================ FILE: collector/pkg/config/config_test.go ================================================ package config_test import ( "github.com/analogj/scrutiny/collector/pkg/config" "github.com/analogj/scrutiny/collector/pkg/models" "github.com/stretchr/testify/require" "path" "testing" ) func TestConfiguration_InvalidConfigPath(t *testing.T) { t.Parallel() //setup testConfig, _ := config.Create() //test err := testConfig.ReadConfig("does_not_exist.yaml") //assert require.Error(t, err, "should return an error") } func TestConfiguration_GetScanOverrides_Simple(t *testing.T) { t.Parallel() //setup testConfig, _ := config.Create() //test err := testConfig.ReadConfig(path.Join("testdata", "simple_device.yaml")) require.NoError(t, err, "should correctly load simple device config") scanOverrides := testConfig.GetDeviceOverrides() //assert require.Equal(t, []models.ScanOverride{{Device: "/dev/sda", DeviceType: []string{"sat"}, Ignore: false}}, scanOverrides) } // fixes #418 func TestConfiguration_GetScanOverrides_DeviceTypeComma(t *testing.T) { t.Parallel() //setup testConfig, _ := config.Create() //test err := testConfig.ReadConfig(path.Join("testdata", "device_type_comma.yaml")) require.NoError(t, err, "should correctly load simple device config") scanOverrides := testConfig.GetDeviceOverrides() //assert require.Equal(t, []models.ScanOverride{ {Device: "/dev/sda", DeviceType: []string{"sat", "auto"}, Ignore: false}, {Device: "/dev/sdb", DeviceType: []string{"sat,auto"}, Ignore: false}, }, scanOverrides) } func TestConfiguration_GetScanOverrides_Ignore(t *testing.T) { t.Parallel() //setup testConfig, _ := config.Create() //test err := testConfig.ReadConfig(path.Join("testdata", "ignore_device.yaml")) require.NoError(t, err, "should correctly load ignore device config") scanOverrides := testConfig.GetDeviceOverrides() //assert require.Equal(t, []models.ScanOverride{{Device: "/dev/sda", DeviceType: nil, Ignore: true}}, scanOverrides) } func TestConfiguration_GetScanOverrides_Raid(t *testing.T) { t.Parallel() //setup testConfig, _ := config.Create() //test err := testConfig.ReadConfig(path.Join("testdata", "raid_device.yaml")) require.NoError(t, err, "should correctly load ignore device config") scanOverrides := testConfig.GetDeviceOverrides() //assert require.Equal(t, []models.ScanOverride{ { Device: "/dev/bus/0", DeviceType: []string{"megaraid,14", "megaraid,15", "megaraid,18", "megaraid,19", "megaraid,20", "megaraid,21"}, Ignore: false, }, { Device: "/dev/twa0", DeviceType: []string{"3ware,0", "3ware,1", "3ware,2", "3ware,3", "3ware,4", "3ware,5"}, Ignore: false, }}, scanOverrides) } func TestConfiguration_InvalidCommands_MissingJson(t *testing.T) { t.Parallel() //setup testConfig, _ := config.Create() //test err := testConfig.ReadConfig(path.Join("testdata", "invalid_commands_missing_json.yaml")) require.EqualError(t, err, `ConfigValidationError: "configuration key 'commands.metrics_scan_args' is missing '--json' flag"`, "should throw an error because json flag is missing") } func TestConfiguration_InvalidCommands_IncludesDevice(t *testing.T) { t.Parallel() //setup testConfig, _ := config.Create() //test err := testConfig.ReadConfig(path.Join("testdata", "invalid_commands_includes_device.yaml")) require.EqualError(t, err, `ConfigValidationError: "configuration key 'commands.metrics_info_args' must not contain '--device' or '-d' flag, configuration key 'commands.metrics_smart_args' must not contain '--device' or '-d' flag"`, "should throw an error because device flags detected") } func TestConfiguration_OverrideCommands(t *testing.T) { t.Parallel() //setup testConfig, _ := config.Create() //test err := testConfig.ReadConfig(path.Join("testdata", "override_commands.yaml")) require.NoError(t, err, "should not throw an error") require.Equal(t, "--xall --json -T permissive", testConfig.GetString("commands.metrics_smart_args")) } func TestConfiguration_OverrideDeviceCommands_MetricsInfoArgs(t *testing.T) { t.Parallel() //setup testConfig, _ := config.Create() //test err := testConfig.ReadConfig(path.Join("testdata", "override_device_commands.yaml")) require.NoError(t, err, "should correctly override device command") //assert require.Equal(t, "--info --json -T permissive", testConfig.GetCommandMetricsInfoArgs("/dev/sda")) require.Equal(t, "--info --json", testConfig.GetCommandMetricsInfoArgs("/dev/sdb")) //require.Equal(t, []models.ScanOverride{{Device: "/dev/sda", DeviceType: nil, Commands: {MetricsInfoArgs: "--info --json -T "}}}, scanOverrides) } func TestConfiguration_DeviceAllowList(t *testing.T) { t.Parallel() t.Run("present", func(t *testing.T) { testConfig, err := config.Create() require.NoError(t, err) require.NoError(t, testConfig.ReadConfig(path.Join("testdata", "allow_listed_devices_present.yaml"))) require.True(t, testConfig.IsAllowlistedDevice("/dev/sda"), "/dev/sda should be allow listed") require.False(t, testConfig.IsAllowlistedDevice("/dev/sdc"), "/dev/sda should not be allow listed") }) t.Run("missing", func(t *testing.T) { testConfig, err := config.Create() require.NoError(t, err) // Really just any other config where the key is full missing require.NoError(t, testConfig.ReadConfig(path.Join("testdata", "override_device_commands.yaml"))) // Anything should be allow listed if the key isnt there require.True(t, testConfig.IsAllowlistedDevice("/dev/sda"), "/dev/sda should be allow listed") require.True(t, testConfig.IsAllowlistedDevice("/dev/sdc"), "/dev/sda should be allow listed") }) } ================================================ FILE: collector/pkg/config/factory.go ================================================ package config func Create() (Interface, error) { config := new(configuration) if err := config.Init(); err != nil { return nil, err } return config, nil } ================================================ FILE: collector/pkg/config/interface.go ================================================ package config import ( "github.com/analogj/scrutiny/collector/pkg/models" "github.com/spf13/viper" ) // Create mock using: // mockgen -source=collector/pkg/config/interface.go -destination=collector/pkg/config/mock/mock_config.go type Interface interface { Init() error ReadConfig(configFilePath string) error Set(key string, value interface{}) SetDefault(key string, value interface{}) AllSettings() map[string]interface{} IsSet(key string) bool Get(key string) interface{} GetBool(key string) bool GetInt(key string) int GetString(key string) string GetStringSlice(key string) []string UnmarshalKey(key string, rawVal interface{}, decoderOpts ...viper.DecoderConfigOption) error GetDeviceOverrides() []models.ScanOverride GetCommandMetricsInfoArgs(deviceName string) string GetCommandMetricsSmartArgs(deviceName string) string IsAllowlistedDevice(deviceName string) bool } ================================================ FILE: collector/pkg/config/mock/mock_config.go ================================================ // Code generated by MockGen. DO NOT EDIT. // Source: collector/pkg/config/interface.go // Package mock_config is a generated GoMock package. package mock_config import ( reflect "reflect" models "github.com/analogj/scrutiny/collector/pkg/models" viper "github.com/spf13/viper" gomock "go.uber.org/mock/gomock" ) // MockInterface is a mock of Interface interface. type MockInterface struct { ctrl *gomock.Controller recorder *MockInterfaceMockRecorder } // MockInterfaceMockRecorder is the mock recorder for MockInterface. type MockInterfaceMockRecorder struct { mock *MockInterface } // NewMockInterface creates a new mock instance. func NewMockInterface(ctrl *gomock.Controller) *MockInterface { mock := &MockInterface{ctrl: ctrl} mock.recorder = &MockInterfaceMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use. func (m *MockInterface) EXPECT() *MockInterfaceMockRecorder { return m.recorder } // AllSettings mocks base method. func (m *MockInterface) AllSettings() map[string]interface{} { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AllSettings") ret0, _ := ret[0].(map[string]interface{}) return ret0 } // AllSettings indicates an expected call of AllSettings. func (mr *MockInterfaceMockRecorder) AllSettings() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllSettings", reflect.TypeOf((*MockInterface)(nil).AllSettings)) } // Get mocks base method. func (m *MockInterface) Get(key string) interface{} { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Get", key) ret0, _ := ret[0].(interface{}) return ret0 } // Get indicates an expected call of Get. func (mr *MockInterfaceMockRecorder) Get(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockInterface)(nil).Get), key) } // GetBool mocks base method. func (m *MockInterface) GetBool(key string) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBool", key) ret0, _ := ret[0].(bool) return ret0 } // GetBool indicates an expected call of GetBool. func (mr *MockInterfaceMockRecorder) GetBool(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBool", reflect.TypeOf((*MockInterface)(nil).GetBool), key) } // GetCommandMetricsInfoArgs mocks base method. func (m *MockInterface) GetCommandMetricsInfoArgs(deviceName string) string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetCommandMetricsInfoArgs", deviceName) ret0, _ := ret[0].(string) return ret0 } // GetCommandMetricsInfoArgs indicates an expected call of GetCommandMetricsInfoArgs. func (mr *MockInterfaceMockRecorder) GetCommandMetricsInfoArgs(deviceName interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCommandMetricsInfoArgs", reflect.TypeOf((*MockInterface)(nil).GetCommandMetricsInfoArgs), deviceName) } // GetCommandMetricsSmartArgs mocks base method. func (m *MockInterface) GetCommandMetricsSmartArgs(deviceName string) string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetCommandMetricsSmartArgs", deviceName) ret0, _ := ret[0].(string) return ret0 } // GetCommandMetricsSmartArgs indicates an expected call of GetCommandMetricsSmartArgs. func (mr *MockInterfaceMockRecorder) GetCommandMetricsSmartArgs(deviceName interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCommandMetricsSmartArgs", reflect.TypeOf((*MockInterface)(nil).GetCommandMetricsSmartArgs), deviceName) } // GetDeviceOverrides mocks base method. func (m *MockInterface) GetDeviceOverrides() []models.ScanOverride { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetDeviceOverrides") ret0, _ := ret[0].([]models.ScanOverride) return ret0 } // GetDeviceOverrides indicates an expected call of GetDeviceOverrides. func (mr *MockInterfaceMockRecorder) GetDeviceOverrides() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDeviceOverrides", reflect.TypeOf((*MockInterface)(nil).GetDeviceOverrides)) } // GetInt mocks base method. func (m *MockInterface) GetInt(key string) int { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetInt", key) ret0, _ := ret[0].(int) return ret0 } // GetInt indicates an expected call of GetInt. func (mr *MockInterfaceMockRecorder) GetInt(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetInt", reflect.TypeOf((*MockInterface)(nil).GetInt), key) } // GetString mocks base method. func (m *MockInterface) GetString(key string) string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetString", key) ret0, _ := ret[0].(string) return ret0 } // GetString indicates an expected call of GetString. func (mr *MockInterfaceMockRecorder) GetString(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetString", reflect.TypeOf((*MockInterface)(nil).GetString), key) } // GetStringSlice mocks base method. func (m *MockInterface) GetStringSlice(key string) []string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetStringSlice", key) ret0, _ := ret[0].([]string) return ret0 } // GetStringSlice indicates an expected call of GetStringSlice. func (mr *MockInterfaceMockRecorder) GetStringSlice(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStringSlice", reflect.TypeOf((*MockInterface)(nil).GetStringSlice), key) } // Init mocks base method. func (m *MockInterface) Init() error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Init") ret0, _ := ret[0].(error) return ret0 } // Init indicates an expected call of Init. func (mr *MockInterfaceMockRecorder) Init() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockInterface)(nil).Init)) } // IsAllowlistedDevice mocks base method. func (m *MockInterface) IsAllowlistedDevice(deviceName string) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "IsAllowlistedDevice", deviceName) ret0, _ := ret[0].(bool) return ret0 } // IsAllowlistedDevice indicates an expected call of IsAllowlistedDevice. func (mr *MockInterfaceMockRecorder) IsAllowlistedDevice(deviceName interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsAllowlistedDevice", reflect.TypeOf((*MockInterface)(nil).IsAllowlistedDevice), deviceName) } // IsSet mocks base method. func (m *MockInterface) IsSet(key string) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "IsSet", key) ret0, _ := ret[0].(bool) return ret0 } // IsSet indicates an expected call of IsSet. func (mr *MockInterfaceMockRecorder) IsSet(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSet", reflect.TypeOf((*MockInterface)(nil).IsSet), key) } // ReadConfig mocks base method. func (m *MockInterface) ReadConfig(configFilePath string) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ReadConfig", configFilePath) ret0, _ := ret[0].(error) return ret0 } // ReadConfig indicates an expected call of ReadConfig. func (mr *MockInterfaceMockRecorder) ReadConfig(configFilePath interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadConfig", reflect.TypeOf((*MockInterface)(nil).ReadConfig), configFilePath) } // Set mocks base method. func (m *MockInterface) Set(key string, value interface{}) { m.ctrl.T.Helper() m.ctrl.Call(m, "Set", key, value) } // Set indicates an expected call of Set. func (mr *MockInterfaceMockRecorder) Set(key, value interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockInterface)(nil).Set), key, value) } // SetDefault mocks base method. func (m *MockInterface) SetDefault(key string, value interface{}) { m.ctrl.T.Helper() m.ctrl.Call(m, "SetDefault", key, value) } // SetDefault indicates an expected call of SetDefault. func (mr *MockInterfaceMockRecorder) SetDefault(key, value interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetDefault", reflect.TypeOf((*MockInterface)(nil).SetDefault), key, value) } // UnmarshalKey mocks base method. func (m *MockInterface) UnmarshalKey(key string, rawVal interface{}, decoderOpts ...viper.DecoderConfigOption) error { m.ctrl.T.Helper() varargs := []interface{}{key, rawVal} for _, a := range decoderOpts { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "UnmarshalKey", varargs...) ret0, _ := ret[0].(error) return ret0 } // UnmarshalKey indicates an expected call of UnmarshalKey. func (mr *MockInterfaceMockRecorder) UnmarshalKey(key, rawVal interface{}, decoderOpts ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() varargs := append([]interface{}{key, rawVal}, decoderOpts...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnmarshalKey", reflect.TypeOf((*MockInterface)(nil).UnmarshalKey), varargs...) } ================================================ FILE: collector/pkg/config/testdata/allow_listed_devices_present.yaml ================================================ allow_listed_devices: - /dev/sda - /dev/sdb ================================================ FILE: collector/pkg/config/testdata/device_type_comma.yaml ================================================ version: 1 devices: # the scrutiny config parser will detect `sat,auto` as two separate items in a list. If you want to use `-d sat,auto` you must # set 'sat,auto' in a list (see eg. /dev/sbd) - device: /dev/sda type: 'sat,auto' - device: /dev/sdb type: - sat,auto ================================================ FILE: collector/pkg/config/testdata/ignore_device.yaml ================================================ version: 1 devices: - device: /dev/sda ignore: true ================================================ FILE: collector/pkg/config/testdata/invalid_commands_includes_device.yaml ================================================ commands: metrics_scan_args: '--scan --json' # used to detect devices metrics_info_args: '--info --json --device=sat' # used to determine device unique ID & register device with Scrutiny metrics_smart_args: '--xall --json -d sat' # used to retrieve smart data for each device. ================================================ FILE: collector/pkg/config/testdata/invalid_commands_missing_json.yaml ================================================ commands: metrics_scan_args: '--scan' # used to detect devices metrics_info_args: '--info -j' # used to determine device unique ID & register device with Scrutiny metrics_smart_args: '--xall --json' # used to retrieve smart data for each device. ================================================ FILE: collector/pkg/config/testdata/override_commands.yaml ================================================ commands: metrics_scan_args: '--scan --json' # used to detect devices metrics_info_args: '--info -j' # used to determine device unique ID & register device with Scrutiny metrics_smart_args: '--xall --json -T permissive' # used to retrieve smart data for each device. ================================================ FILE: collector/pkg/config/testdata/override_device_commands.yaml ================================================ version: 1 devices: - device: /dev/sda commands: metrics_info_args: "--info --json -T permissive" ================================================ FILE: collector/pkg/config/testdata/raid_device.yaml ================================================ version: 1 devices: - device: /dev/bus/0 type: - megaraid,14 - megaraid,15 - megaraid,18 - megaraid,19 - megaraid,20 - megaraid,21 - device: /dev/twa0 type: - 3ware,0 - 3ware,1 - 3ware,2 - 3ware,3 - 3ware,4 - 3ware,5 ================================================ FILE: collector/pkg/config/testdata/simple_device.yaml ================================================ version: 1 devices: - device: /dev/sda type: 'sat' # # # example to show how to ignore a specific disk/device. # - device: /dev/sda # ignore: true # # # examples showing how to force smartctl to detect disks inside a raid array/virtual disk # - device: /dev/bus/0 # type: # - megaraid,14 # - megaraid,15 # - megaraid,18 # - megaraid,19 # - megaraid,20 # - megaraid,21 # # - device: /dev/twa0 # type: # - 3ware,0 # - 3ware,1 # - 3ware,2 # - 3ware,3 # - 3ware,4 # - 3ware,5 ================================================ FILE: collector/pkg/detect/detect.go ================================================ package detect import ( "encoding/json" "fmt" "os" "strings" "github.com/analogj/scrutiny/collector/pkg/common/shell" "github.com/analogj/scrutiny/collector/pkg/config" "github.com/analogj/scrutiny/collector/pkg/models" "github.com/analogj/scrutiny/webapp/backend/pkg/models/collector" "github.com/sirupsen/logrus" ) type Detect struct { Logger *logrus.Entry Config config.Interface Shell shell.Interface } //private/common functions // This function calls smartctl --scan which can be used to detect storage devices. // It has a couple of issues however: // - --scan does not return any results on mac // // To handle these issues, we have OS specific wrapper functions that update/modify these detected devices. // models.Device returned from this function only contain the minimum data for smartctl to execute: device type and device name (device file). func (d *Detect) SmartctlScan() ([]models.Device, error) { //we use smartctl to detect all the drives available. args := strings.Split(d.Config.GetString("commands.metrics_scan_args"), " ") detectedDeviceConnJson, err := d.Shell.Command(d.Logger, d.Config.GetString("commands.metrics_smartctl_bin"), args, "", os.Environ()) if err != nil { d.Logger.Errorf("Error scanning for devices: %v", err) return nil, err } var detectedDeviceConns models.Scan err = json.Unmarshal([]byte(detectedDeviceConnJson), &detectedDeviceConns) if err != nil { d.Logger.Errorf("Error decoding detected devices: %v", err) return nil, err } detectedDevices := d.TransformDetectedDevices(detectedDeviceConns) return detectedDevices, nil } // updates a device model with information from smartctl --scan // It has a couple of issues however: // - WWN is provided as component data, rather than a "string". We'll have to generate the WWN value ourselves // - WWN from smartctl only provided for ATA protocol drives, NVMe and SCSI drives do not include WWN. func (d *Detect) SmartCtlInfo(device *models.Device) error { fullDeviceName := fmt.Sprintf("%s%s", DevicePrefix(), device.DeviceName) args := strings.Split(d.Config.GetCommandMetricsInfoArgs(fullDeviceName), " ") //only include the device type if its a non-standard one. In some cases ata drives are detected as scsi in docker, and metadata is lost. if len(device.DeviceType) > 0 && device.DeviceType != "scsi" && device.DeviceType != "ata" { args = append(args, "--device", device.DeviceType) } args = append(args, fullDeviceName) availableDeviceInfoJson, err := d.Shell.Command(d.Logger, d.Config.GetString("commands.metrics_smartctl_bin"), args, "", os.Environ()) if err != nil { d.Logger.Errorf("Could not retrieve device information for %s: %v", device.DeviceName, err) return err } var availableDeviceInfo collector.SmartInfo err = json.Unmarshal([]byte(availableDeviceInfoJson), &availableDeviceInfo) if err != nil { d.Logger.Errorf("Could not decode device information for %s: %v", device.DeviceName, err) return err } //WWN: this is a serial number/world-wide number that will not change. //DeviceType and DeviceName are already populated, however may change between collector runs (eg. config/host restart) //InterfaceType: device.ModelName = availableDeviceInfo.ModelName device.InterfaceSpeed = availableDeviceInfo.InterfaceSpeed.Current.String device.SerialNumber = availableDeviceInfo.SerialNumber device.Firmware = availableDeviceInfo.FirmwareVersion device.RotationSpeed = availableDeviceInfo.RotationRate device.Capacity = availableDeviceInfo.Capacity() device.FormFactor = availableDeviceInfo.FormFactor.Name device.DeviceType = availableDeviceInfo.Device.Type device.DeviceProtocol = availableDeviceInfo.Device.Protocol if len(availableDeviceInfo.Vendor) > 0 { device.Manufacturer = availableDeviceInfo.Vendor } //populate WWN is possible if present if availableDeviceInfo.Wwn.Naa != 0 { //valid values are 1-6 (5 is what we handle correctly) d.Logger.Info("Generating WWN") wwn := Wwn{ Naa: availableDeviceInfo.Wwn.Naa, Oui: availableDeviceInfo.Wwn.Oui, Id: availableDeviceInfo.Wwn.ID, } device.WWN = strings.ToLower(wwn.ToString()) d.Logger.Debugf("NAA: %d OUI: %d Id: %d => WWN: %s", wwn.Naa, wwn.Oui, wwn.Id, device.WWN) } else { d.Logger.Info("Using WWN Fallback") d.wwnFallback(device) } if len(device.WWN) == 0 { // no WWN populated after WWN lookup and fallback. we need to throw an error errMsg := fmt.Sprintf("no WWN (or fallback) populated for device: %s. Device will be registered, but no data will be published for this device. ", device.DeviceName) d.Logger.Errorf("%v", errMsg) return fmt.Errorf("%v", errMsg) } return nil } // function will remove devices that are marked for "ignore" in config file // will also add devices that are specified in config file, but "missing" from smartctl --scan // this function will also update the deviceType to the option specified in config. func (d *Detect) TransformDetectedDevices(detectedDeviceConns models.Scan) []models.Device { groupedDevices := map[string][]models.Device{} for _, scannedDevice := range detectedDeviceConns.Devices { deviceFile := strings.ToLower(scannedDevice.Name) // If the user has defined a device allow list, and this device isnt there, then ignore it if !d.Config.IsAllowlistedDevice(deviceFile) { continue } detectedDevice := models.Device{ HostId: d.Config.GetString("host.id"), DeviceType: scannedDevice.Type, DeviceName: strings.TrimPrefix(deviceFile, DevicePrefix()), } //find (or create) a slice to contain the devices in this group if groupedDevices[deviceFile] == nil { groupedDevices[deviceFile] = []models.Device{} } // add this scanned device to the group groupedDevices[deviceFile] = append(groupedDevices[deviceFile], detectedDevice) } //now tha we've "grouped" all the devices, lets override any groups specified in the config file. for _, overrideDevice := range d.Config.GetDeviceOverrides() { overrideDeviceFile := strings.ToLower(overrideDevice.Device) if overrideDevice.Ignore { // this device file should be deleted if it exists delete(groupedDevices, overrideDeviceFile) } else { //create a new device group, and replace the one generated by smartctl --scan overrideDeviceGroup := []models.Device{} if overrideDevice.DeviceType != nil { for _, overrideDeviceType := range overrideDevice.DeviceType { overrideDeviceGroup = append(overrideDeviceGroup, models.Device{ HostId: d.Config.GetString("host.id"), DeviceType: overrideDeviceType, DeviceName: strings.TrimPrefix(overrideDeviceFile, DevicePrefix()), }) } } else { //user may have specified device in config file without device type (default to scanned device type) //check if the device file was detected by the scanner var deviceType string if scannedDevice, foundScannedDevice := groupedDevices[overrideDeviceFile]; foundScannedDevice { if len(scannedDevice) > 0 { //take the device type from the first grouped device deviceType = scannedDevice[0].DeviceType } else { deviceType = "ata" } } else { //fallback to ata if no scanned device detected deviceType = "ata" } overrideDeviceGroup = append(overrideDeviceGroup, models.Device{ HostId: d.Config.GetString("host.id"), DeviceType: deviceType, DeviceName: strings.TrimPrefix(overrideDeviceFile, DevicePrefix()), }) } groupedDevices[overrideDeviceFile] = overrideDeviceGroup } } //flatten map detectedDevices := []models.Device{} for _, group := range groupedDevices { detectedDevices = append(detectedDevices, group...) } return detectedDevices } ================================================ FILE: collector/pkg/detect/detect_test.go ================================================ package detect_test import ( "os" "strings" "testing" mock_shell "github.com/analogj/scrutiny/collector/pkg/common/shell/mock" mock_config "github.com/analogj/scrutiny/collector/pkg/config/mock" "github.com/analogj/scrutiny/collector/pkg/detect" "github.com/analogj/scrutiny/collector/pkg/models" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/mock/gomock" ) func TestDetect_SmartctlScan(t *testing.T) { // setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("host.id").AnyTimes().Return("") fakeConfig.EXPECT().GetDeviceOverrides().AnyTimes().Return([]models.ScanOverride{}) fakeConfig.EXPECT().GetString("commands.metrics_smartctl_bin").AnyTimes().Return("smartctl") fakeConfig.EXPECT().GetString("commands.metrics_scan_args").AnyTimes().Return("--scan --json") fakeConfig.EXPECT().IsAllowlistedDevice(gomock.Any()).AnyTimes().Return(true) fakeShell := mock_shell.NewMockInterface(mockCtrl) testScanResults, err := os.ReadFile("testdata/smartctl_scan_simple.json") fakeShell.EXPECT().Command(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes().Return(string(testScanResults), err) d := detect.Detect{ Logger: logrus.WithFields(logrus.Fields{}), Shell: fakeShell, Config: fakeConfig, } // test scannedDevices, err := d.SmartctlScan() // assert require.NoError(t, err) require.Equal(t, 7, len(scannedDevices)) require.Equal(t, "scsi", scannedDevices[0].DeviceType) } func TestDetect_SmartctlScan_Megaraid(t *testing.T) { // setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("host.id").AnyTimes().Return("") fakeConfig.EXPECT().GetDeviceOverrides().AnyTimes().Return([]models.ScanOverride{}) fakeConfig.EXPECT().GetString("commands.metrics_smartctl_bin").AnyTimes().Return("smartctl") fakeConfig.EXPECT().GetString("commands.metrics_scan_args").AnyTimes().Return("--scan --json") fakeConfig.EXPECT().IsAllowlistedDevice(gomock.Any()).AnyTimes().Return(true) fakeShell := mock_shell.NewMockInterface(mockCtrl) testScanResults, err := os.ReadFile("testdata/smartctl_scan_megaraid.json") fakeShell.EXPECT().Command(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes().Return(string(testScanResults), err) d := detect.Detect{ Logger: logrus.WithFields(logrus.Fields{}), Shell: fakeShell, Config: fakeConfig, } // test scannedDevices, err := d.SmartctlScan() // assert require.NoError(t, err) require.Equal(t, 2, len(scannedDevices)) require.Equal(t, []models.Device{ {DeviceName: "bus/0", DeviceType: "megaraid,0"}, {DeviceName: "bus/0", DeviceType: "megaraid,1"}, }, scannedDevices) } func TestDetect_SmartctlScan_Nvme(t *testing.T) { // setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("host.id").AnyTimes().Return("") fakeConfig.EXPECT().GetDeviceOverrides().AnyTimes().Return([]models.ScanOverride{}) fakeConfig.EXPECT().GetString("commands.metrics_smartctl_bin").AnyTimes().Return("smartctl") fakeConfig.EXPECT().GetString("commands.metrics_scan_args").AnyTimes().Return("--scan --json") fakeConfig.EXPECT().IsAllowlistedDevice(gomock.Any()).AnyTimes().Return(true) fakeShell := mock_shell.NewMockInterface(mockCtrl) testScanResults, err := os.ReadFile("testdata/smartctl_scan_nvme.json") fakeShell.EXPECT().Command(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes().Return(string(testScanResults), err) d := detect.Detect{ Logger: logrus.WithFields(logrus.Fields{}), Shell: fakeShell, Config: fakeConfig, } // test scannedDevices, err := d.SmartctlScan() // assert require.NoError(t, err) require.Equal(t, 1, len(scannedDevices)) require.Equal(t, []models.Device{ {DeviceName: "nvme0", DeviceType: "nvme"}, }, scannedDevices) } func TestDetect_TransformDetectedDevices_Empty(t *testing.T) { // setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("host.id").AnyTimes().Return("") fakeConfig.EXPECT().GetDeviceOverrides().AnyTimes().Return([]models.ScanOverride{}) fakeConfig.EXPECT().GetString("commands.metrics_smartctl_bin").AnyTimes().Return("smartctl") fakeConfig.EXPECT().GetString("commands.metrics_scan_args").AnyTimes().Return("--scan --json") fakeConfig.EXPECT().IsAllowlistedDevice(gomock.Any()).AnyTimes().Return(true) detectedDevices := models.Scan{ Devices: []models.ScanDevice{ { Name: "/dev/sda", InfoName: "/dev/sda", Protocol: "scsi", Type: "scsi", }, }, } d := detect.Detect{ Config: fakeConfig, } // test transformedDevices := d.TransformDetectedDevices(detectedDevices) // assert require.Equal(t, "sda", transformedDevices[0].DeviceName) require.Equal(t, "scsi", transformedDevices[0].DeviceType) } func TestDetect_TransformDetectedDevices_Ignore(t *testing.T) { // setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("host.id").AnyTimes().Return("") fakeConfig.EXPECT().GetDeviceOverrides().AnyTimes().Return([]models.ScanOverride{{Device: "/dev/sda", DeviceType: nil, Ignore: true}}) fakeConfig.EXPECT().GetString("commands.metrics_smartctl_bin").AnyTimes().Return("smartctl") fakeConfig.EXPECT().GetString("commands.metrics_scan_args").AnyTimes().Return("--scan --json") fakeConfig.EXPECT().IsAllowlistedDevice(gomock.Any()).AnyTimes().Return(true) detectedDevices := models.Scan{ Devices: []models.ScanDevice{ { Name: "/dev/sda", InfoName: "/dev/sda", Protocol: "scsi", Type: "scsi", }, }, } d := detect.Detect{ Config: fakeConfig, } // test transformedDevices := d.TransformDetectedDevices(detectedDevices) // assert require.Equal(t, []models.Device{}, transformedDevices) } func TestDetect_TransformDetectedDevices_Raid(t *testing.T) { // setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("host.id").AnyTimes().Return("") fakeConfig.EXPECT().GetString("commands.metrics_smartctl_bin").AnyTimes().Return("smartctl") fakeConfig.EXPECT().GetString("commands.metrics_scan_args").AnyTimes().Return("--scan --json") fakeConfig.EXPECT().IsAllowlistedDevice(gomock.Any()).AnyTimes().Return(true) fakeConfig.EXPECT().GetDeviceOverrides().AnyTimes().Return([]models.ScanOverride{ { Device: "/dev/bus/0", DeviceType: []string{"megaraid,14", "megaraid,15", "megaraid,18", "megaraid,19", "megaraid,20", "megaraid,21"}, Ignore: false, }, { Device: "/dev/twa0", DeviceType: []string{"3ware,0", "3ware,1", "3ware,2", "3ware,3", "3ware,4", "3ware,5"}, Ignore: false, }, }) detectedDevices := models.Scan{ Devices: []models.ScanDevice{ { Name: "/dev/bus/0", InfoName: "/dev/bus/0", Protocol: "scsi", Type: "scsi", }, }, } d := detect.Detect{ Config: fakeConfig, } // test transformedDevices := d.TransformDetectedDevices(detectedDevices) // assert require.Equal(t, 12, len(transformedDevices)) } func TestDetect_TransformDetectedDevices_Simple(t *testing.T) { // setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("host.id").AnyTimes().Return("") fakeConfig.EXPECT().GetString("commands.metrics_smartctl_bin").AnyTimes().Return("smartctl") fakeConfig.EXPECT().GetString("commands.metrics_scan_args").AnyTimes().Return("--scan --json") fakeConfig.EXPECT().GetDeviceOverrides().AnyTimes().Return([]models.ScanOverride{{Device: "/dev/sda", DeviceType: []string{"sat+megaraid"}}}) fakeConfig.EXPECT().IsAllowlistedDevice(gomock.Any()).AnyTimes().Return(true) detectedDevices := models.Scan{ Devices: []models.ScanDevice{ { Name: "/dev/sda", InfoName: "/dev/sda", Protocol: "ata", Type: "ata", }, }, } d := detect.Detect{ Config: fakeConfig, } // test transformedDevices := d.TransformDetectedDevices(detectedDevices) // assert require.Equal(t, 1, len(transformedDevices)) require.Equal(t, "sat+megaraid", transformedDevices[0].DeviceType) } // test https://github.com/AnalogJ/scrutiny/issues/255#issuecomment-1164024126 func TestDetect_TransformDetectedDevices_WithoutDeviceTypeOverride(t *testing.T) { // setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("host.id").AnyTimes().Return("") fakeConfig.EXPECT().GetString("commands.metrics_smartctl_bin").AnyTimes().Return("smartctl") fakeConfig.EXPECT().GetString("commands.metrics_scan_args").AnyTimes().Return("--scan --json") fakeConfig.EXPECT().GetDeviceOverrides().AnyTimes().Return([]models.ScanOverride{{Device: "/dev/sda"}}) fakeConfig.EXPECT().IsAllowlistedDevice(gomock.Any()).AnyTimes().Return(true) detectedDevices := models.Scan{ Devices: []models.ScanDevice{ { Name: "/dev/sda", InfoName: "/dev/sda", Protocol: "ata", Type: "scsi", }, }, } d := detect.Detect{ Config: fakeConfig, } // test transformedDevices := d.TransformDetectedDevices(detectedDevices) // assert require.Equal(t, 1, len(transformedDevices)) require.Equal(t, "scsi", transformedDevices[0].DeviceType) } func TestDetect_TransformDetectedDevices_WhenDeviceNotDetected(t *testing.T) { // setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("host.id").AnyTimes().Return("") fakeConfig.EXPECT().GetString("commands.metrics_smartctl_bin").AnyTimes().Return("smartctl") fakeConfig.EXPECT().GetString("commands.metrics_scan_args").AnyTimes().Return("--scan --json") fakeConfig.EXPECT().GetDeviceOverrides().AnyTimes().Return([]models.ScanOverride{{Device: "/dev/sda"}}) detectedDevices := models.Scan{} d := detect.Detect{ Config: fakeConfig, } // test transformedDevices := d.TransformDetectedDevices(detectedDevices) // assert require.Equal(t, 1, len(transformedDevices)) require.Equal(t, "ata", transformedDevices[0].DeviceType) } func TestDetect_TransformDetectedDevices_AllowListFilters(t *testing.T) { mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("host.id").AnyTimes().Return("") fakeConfig.EXPECT().GetString("commands.metrics_smartctl_bin").AnyTimes().Return("smartctl") fakeConfig.EXPECT().GetString("commands.metrics_scan_args").AnyTimes().Return("--scan --json") fakeConfig.EXPECT().GetDeviceOverrides().AnyTimes().Return([]models.ScanOverride{{Device: "/dev/sda", DeviceType: []string{"sat+megaraid"}}}) fakeConfig.EXPECT().IsAllowlistedDevice("/dev/sda").Return(true) fakeConfig.EXPECT().IsAllowlistedDevice("/dev/sdb").Return(false) detectedDevices := models.Scan{ Devices: []models.ScanDevice{ { Name: "/dev/sda", InfoName: "/dev/sda", Protocol: "ata", Type: "ata", }, { Name: "/dev/sdb", InfoName: "/dev/sdb", Protocol: "ata", Type: "ata", }, }, } d := detect.Detect{ Config: fakeConfig, } // test transformedDevices := d.TransformDetectedDevices(detectedDevices) // assert require.Equal(t, 1, len(transformedDevices)) require.Equal(t, "sda", transformedDevices[0].DeviceName) } func TestDetect_SmartCtlInfo(t *testing.T) { t.Run("should report nvme info", func(t *testing.T) { ctrl := gomock.NewController(t) const ( someArgs = "--info --json" // device info someDeviceName = "some-device-name" someModelName = "KCD61LUL3T84" someSerialNumber = "61Q0A05UT7B8" someFirmware = "8002" someDeviceProtocol = "NVMe" someDeviceType = "nvme" someCapacity int64 = 3840755982336 ) fakeConfig := mock_config.NewMockInterface(ctrl) fakeConfig.EXPECT(). GetCommandMetricsInfoArgs("/dev/" + someDeviceName). Return(someArgs) fakeConfig.EXPECT(). GetString("commands.metrics_smartctl_bin"). Return("smartctl") someLogger := logrus.WithFields(logrus.Fields{}) smartctlInfoResults, err := os.ReadFile("testdata/smartctl_info_nvme.json") require.NoError(t, err) fakeShell := mock_shell.NewMockInterface(ctrl) fakeShell.EXPECT(). Command(someLogger, "smartctl", append(strings.Split(someArgs, " "), "/dev/"+someDeviceName), "", gomock.Any()). Return(string(smartctlInfoResults), err) d := detect.Detect{ Logger: someLogger, Shell: fakeShell, Config: fakeConfig, } someDevice := &models.Device{ WWN: "some wwn", DeviceName: someDeviceName, } require.NoError(t, d.SmartCtlInfo(someDevice)) assert.Equal(t, someDeviceName, someDevice.DeviceName) assert.Equal(t, someModelName, someDevice.ModelName) assert.Equal(t, someSerialNumber, someDevice.SerialNumber) assert.Equal(t, someFirmware, someDevice.Firmware) assert.Equal(t, someDeviceProtocol, someDevice.DeviceProtocol) assert.Equal(t, someDeviceType, someDevice.DeviceType) assert.Equal(t, someCapacity, someDevice.Capacity) }) } ================================================ FILE: collector/pkg/detect/devices_darwin.go ================================================ package detect import ( "github.com/analogj/scrutiny/collector/pkg/common/shell" "github.com/analogj/scrutiny/collector/pkg/models" "github.com/jaypipes/ghw" "strings" ) func DevicePrefix() string { return "/dev/" } func (d *Detect) Start() ([]models.Device, error) { d.Shell = shell.Create() // call the base/common functionality to get a list of devices detectedDevices, err := d.SmartctlScan() if err != nil { return nil, err } //smartctl --scan doesn't seem to detect mac nvme drives, lets see if we can detect them manually. missingDevices, err := d.findMissingDevices(detectedDevices) //we dont care about the error here, just continue retrieving device info. if err == nil { detectedDevices = append(detectedDevices, missingDevices...) } //inflate device info for detected devices. for ndx, _ := range detectedDevices { d.SmartCtlInfo(&detectedDevices[ndx]) //ignore errors. } return detectedDevices, nil } func (d *Detect) findMissingDevices(detectedDevices []models.Device) ([]models.Device, error) { missingDevices := []models.Device{} block, err := ghw.Block() if err != nil { d.Logger.Errorf("Error getting block storage info: %v", err) return nil, err } for _, disk := range block.Disks { // ignore optical drives and floppy disks if disk.DriveType == ghw.DRIVE_TYPE_FDD || disk.DriveType == ghw.DRIVE_TYPE_ODD { d.Logger.Debugf(" => Ignore: Optical or floppy disk - (found %s)\n", disk.DriveType.String()) continue } // ignore removable disks if disk.IsRemovable { d.Logger.Debugf(" => Ignore: Removable disk (%v)\n", disk.IsRemovable) continue } // ignore virtual disks & mobile phone storage devices if disk.StorageController == ghw.STORAGE_CONTROLLER_VIRTIO || disk.StorageController == ghw.STORAGE_CONTROLLER_MMC { d.Logger.Debugf(" => Ignore: Virtual/multi-media storage controller - (found %s)\n", disk.StorageController.String()) continue } // Skip unknown storage controllers, not usually S.M.A.R.T compatible. if disk.StorageController == ghw.STORAGE_CONTROLLER_UNKNOWN { d.Logger.Debugf(" => Ignore: Unknown storage controller - (found %s)\n", disk.StorageController.String()) continue } //check if device is already detected. alreadyDetected := false diskName := strings.TrimPrefix(disk.Name, DevicePrefix()) for _, detectedDevice := range detectedDevices { if detectedDevice.DeviceName == diskName { alreadyDetected = true break } } if !alreadyDetected { missingDevices = append(missingDevices, models.Device{ DeviceName: diskName, DeviceType: "", }) } } return missingDevices, nil } //WWN values NVMe and SCSI func (d *Detect) wwnFallback(detectedDevice *models.Device) { block, err := ghw.Block() if err == nil { for _, disk := range block.Disks { if disk.Name == detectedDevice.DeviceName && strings.ToLower(disk.WWN) != "unknown" { d.Logger.Debugf("Found matching block device. WWN: %s", disk.WWN) detectedDevice.WWN = disk.WWN break } } } //no WWN found, or could not open Block devices. Either way, fallback to serial number if len(detectedDevice.WWN) == 0 { d.Logger.Debugf("WWN is empty, falling back to serial number: %s", detectedDevice.SerialNumber) detectedDevice.WWN = detectedDevice.SerialNumber } //wwn must always be lowercase. detectedDevice.WWN = strings.ToLower(detectedDevice.WWN) } ================================================ FILE: collector/pkg/detect/devices_freebsd.go ================================================ package detect import ( "github.com/analogj/scrutiny/collector/pkg/common/shell" "github.com/analogj/scrutiny/collector/pkg/models" "github.com/jaypipes/ghw" "strings" ) func DevicePrefix() string { return "/dev/" } func (d *Detect) Start() ([]models.Device, error) { d.Shell = shell.Create() // call the base/common functionality to get a list of devices detectedDevices, err := d.SmartctlScan() if err != nil { return nil, err } //inflate device info for detected devices. for ndx, _ := range detectedDevices { d.SmartCtlInfo(&detectedDevices[ndx]) //ignore errors. } return detectedDevices, nil } //WWN values NVMe and SCSI func (d *Detect) wwnFallback(detectedDevice *models.Device) { block, err := ghw.Block() if err == nil { for _, disk := range block.Disks { if disk.Name == detectedDevice.DeviceName && strings.ToLower(disk.WWN) != "unknown" { d.Logger.Debugf("Found matching block device. WWN: %s", disk.WWN) detectedDevice.WWN = disk.WWN break } } } //no WWN found, or could not open Block devices. Either way, fallback to serial number if len(detectedDevice.WWN) == 0 { d.Logger.Debugf("WWN is empty, falling back to serial number: %s", detectedDevice.SerialNumber) detectedDevice.WWN = detectedDevice.SerialNumber } //wwn must always be lowercase. detectedDevice.WWN = strings.ToLower(detectedDevice.WWN) } ================================================ FILE: collector/pkg/detect/devices_linux.go ================================================ package detect import ( "fmt" "os" "path/filepath" "strings" "github.com/analogj/scrutiny/collector/pkg/common/shell" "github.com/analogj/scrutiny/collector/pkg/models" "github.com/jaypipes/ghw" ) func DevicePrefix() string { return "/dev/" } func (d *Detect) Start() ([]models.Device, error) { d.Shell = shell.Create() // call the base/common functionality to get a list of devices detectedDevices, err := d.SmartctlScan() if err != nil { return nil, err } //inflate device info for detected devices. for ndx := range detectedDevices { d.SmartCtlInfo(&detectedDevices[ndx]) //ignore errors. populateUdevInfo(&detectedDevices[ndx]) //ignore errors. } return detectedDevices, nil } // WWN values NVMe and SCSI func (d *Detect) wwnFallback(detectedDevice *models.Device) { block, err := ghw.Block() if err == nil { for _, disk := range block.Disks { if disk.Name == detectedDevice.DeviceName && strings.ToLower(disk.WWN) != "unknown" { d.Logger.Debugf("Found matching block device. WWN: %s", disk.WWN) detectedDevice.WWN = disk.WWN break } } } //no WWN found, or could not open Block devices. Either way, fallback to serial number if len(detectedDevice.WWN) == 0 { d.Logger.Debugf("WWN is empty, falling back to serial number: %s", detectedDevice.SerialNumber) detectedDevice.WWN = detectedDevice.SerialNumber } //wwn must always be lowercase. detectedDevice.WWN = strings.ToLower(detectedDevice.WWN) } // as discussed in // - https://github.com/AnalogJ/scrutiny/issues/225 // - https://github.com/jaypipes/ghw/issues/59#issue-361915216 // udev exposes its data in a standardized way under /run/udev/data/.... func populateUdevInfo(detectedDevice *models.Device) error { // Get device major:minor numbers // `cat /sys/class/block/sda/dev` devNo, err := os.ReadFile(filepath.Join("/sys/class/block/", detectedDevice.DeviceName, "dev")) if err != nil { return err } // Look up block device in udev runtime database // `cat /run/udev/data/b8:0` udevID := "b" + strings.TrimSpace(string(devNo)) udevBytes, err := os.ReadFile(filepath.Join("/run/udev/data/", udevID)) if err != nil { return err } deviceMountPaths := []string{} udevInfo := make(map[string]string) for _, udevLine := range strings.Split(string(udevBytes), "\n") { if strings.HasPrefix(udevLine, "E:") { if s := strings.SplitN(udevLine[2:], "=", 2); len(s) == 2 { udevInfo[s[0]] = s[1] } } else if strings.HasPrefix(udevLine, "S:") { deviceMountPaths = append(deviceMountPaths, udevLine[2:]) } } //Set additional device information. if deviceLabel, exists := udevInfo["ID_FS_LABEL"]; exists { detectedDevice.DeviceLabel = deviceLabel } if deviceUUID, exists := udevInfo["ID_FS_UUID"]; exists { detectedDevice.DeviceUUID = deviceUUID } if deviceSerialID, exists := udevInfo["ID_SERIAL"]; exists { detectedDevice.DeviceSerialID = fmt.Sprintf("%s-%s", udevInfo["ID_BUS"], deviceSerialID) } return nil } ================================================ FILE: collector/pkg/detect/devices_linux_test.go ================================================ package detect_test import ( "github.com/analogj/scrutiny/collector/pkg/detect" "github.com/stretchr/testify/require" "testing" ) func TestDevicePrefix(t *testing.T) { //setup //test //assert require.Equal(t, "/dev/", detect.DevicePrefix()) } ================================================ FILE: collector/pkg/detect/devices_windows.go ================================================ package detect import ( "github.com/analogj/scrutiny/collector/pkg/common/shell" "github.com/analogj/scrutiny/collector/pkg/models" "strings" ) func DevicePrefix() string { return "" } func (d *Detect) Start() ([]models.Device, error) { d.Shell = shell.Create() // call the base/common functionality to get a list of devices detectedDevices, err := d.SmartctlScan() if err != nil { return nil, err } //inflate device info for detected devices. for ndx, _ := range detectedDevices { d.SmartCtlInfo(&detectedDevices[ndx]) //ignore errors. } return detectedDevices, nil } //WWN values NVMe and SCSI func (d *Detect) wwnFallback(detectedDevice *models.Device) { //fallback to serial number if len(detectedDevice.WWN) == 0 { detectedDevice.WWN = detectedDevice.SerialNumber } //wwn must always be lowercase. detectedDevice.WWN = strings.ToLower(detectedDevice.WWN) } ================================================ FILE: collector/pkg/detect/testdata/smartctl_info_nvme.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 2 ], "svn_revision": "5155", "platform_info": "x86_64-linux-6.1.69-talos", "build_info": "(local build)", "argv": [ "smartctl", "--info", "--json", "/dev/nvme4" ], "exit_status": 0 }, "device": { "name": "/dev/nvme4", "info_name": "/dev/nvme4", "type": "nvme", "protocol": "NVMe" }, "model_name": "KCD61LUL3T84", "serial_number": "61Q0A05UT7B8", "firmware_version": "8002", "nvme_pci_vendor": { "id": 7695, "subsystem_id": 7695 }, "nvme_ieee_oui_identifier": 9233294, "nvme_total_capacity": 3840755982336, "nvme_unallocated_capacity": 0, "nvme_controller_id": 1, "nvme_version": { "string": "1.4", "value": 66560 }, "nvme_number_of_namespaces": 16, "local_time": { "time_t": 1706045146, "asctime": "Tue Jan 23 21:25:46 2024 UTC" } } ================================================ FILE: collector/pkg/detect/testdata/smartctl_scan_megaraid.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 1 ], "svn_revision": "5022", "platform_info": "x86_64-linux-5.4.0-45-generic", "build_info": "(local build)", "argv": [ "smartctl", "-j", "--scan" ], "exit_status": 0 }, "devices": [ { "name": "/dev/bus/0", "info_name": "/dev/bus/0 [megaraid_disk_00]", "type": "megaraid,0", "protocol": "SCSI" }, { "name": "/dev/bus/0", "info_name": "/dev/bus/0 [megaraid_disk_01]", "type": "megaraid,1", "protocol": "SCSI" } ] } ================================================ FILE: collector/pkg/detect/testdata/smartctl_scan_nvme.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-linux-4.19.107-Unraid", "build_info": "(local build)", "argv": [ "smartctl", "-j", "--scan" ], "exit_status": 0 }, "devices": [ { "name": "/dev/nvme0", "info_name": "/dev/nvme0", "type": "nvme", "protocol": "NVMe" } ] } ================================================ FILE: collector/pkg/detect/testdata/smartctl_scan_simple.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-linux-5.15.32-flatcar", "build_info": "(local build)", "argv": [ "smartctl", "--scan", "-j" ], "exit_status": 0 }, "devices": [ { "name": "/dev/sda", "info_name": "/dev/sda", "type": "scsi", "protocol": "SCSI" }, { "name": "/dev/sdb", "info_name": "/dev/sdb", "type": "scsi", "protocol": "SCSI" }, { "name": "/dev/sdc", "info_name": "/dev/sdc", "type": "scsi", "protocol": "SCSI" }, { "name": "/dev/sdd", "info_name": "/dev/sdd", "type": "scsi", "protocol": "SCSI" }, { "name": "/dev/sde", "info_name": "/dev/sde", "type": "scsi", "protocol": "SCSI" }, { "name": "/dev/sdf", "info_name": "/dev/sdf", "type": "scsi", "protocol": "SCSI" }, { "name": "/dev/sdg", "info_name": "/dev/sdg", "type": "scsi", "protocol": "SCSI" } ] } ================================================ FILE: collector/pkg/detect/wwn.go ================================================ package detect import ( "fmt" "strings" ) type Wwn struct { Naa uint64 `json:"naa"` Oui uint64 `json:"oui"` Id uint64 `json:"id"` VendorCode string `json:"vendor_code"` } // this is an incredibly basic converter, that only works for "Registered" IEEE format - NAA5 // https://standards.ieee.org/content/dam/ieee-standards/standards/web/documents/tutorials/fibre.pdf // references: // - https://metacpan.org/pod/Device::WWN // - https://en.wikipedia.org/wiki/World_Wide_Name // - https://storagemeat.blogspot.com/2012/08/decoding-wwids-or-how-to-tell-whats-what.html // - https://bryanchain.com/2016/01/20/breaking-down-an-naa-id-world-wide-name/ /* +----------+---+---+---+---+---+---+---+---+ | Byte/Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +----------+---+---+---+---+---+---+---+---+ | 0 | NAA (5h) | (MSB) | +----------+---------------+ + | 1 | | +----------+ IEEE OUI | | 2 | | +----------+ +---------------+ | 3 | (LSB) | (MSB) | +----------+---------------+ + | 4 | | | | | +----------+ | | 5 | Vendor ID | +----------+ | | 6 | | +----------+ | | 7 | (LSB) | +----------+-------------------------------+ */ func (wwn *Wwn) ToString() string { var wwnBuffer uint64 wwnBuffer = wwn.Id //start with vendor ID wwnBuffer += (wwn.Oui << 36) //add left-shifted OUI wwnBuffer += (wwn.Naa << 60) //NAA is a number from 1-6, so decimal == hex. //TODO: may need to support additional versions in the future. return strings.ToLower(fmt.Sprintf("%#x", wwnBuffer)) } ================================================ FILE: collector/pkg/detect/wwn_test.go ================================================ package detect_test import ( "testing" "github.com/analogj/scrutiny/collector/pkg/detect" "github.com/stretchr/testify/require" ) func TestWwn_FromStringTable(t *testing.T) { //setup var tests = []struct { wwnStr string wwn detect.Wwn }{ {"0x5002538e40a22954", detect.Wwn{Naa: 5, Oui: 9528, Id: 61213911380}}, //sda {"0x5000cca264eb01d7", detect.Wwn{Naa: 5, Oui: 3274, Id: 10283057623}}, //sdb {"0x5000cca264ec3183", detect.Wwn{Naa: 5, Oui: 3274, Id: 10283135363}}, //sdc {"0x5000cca252c859cc", detect.Wwn{Naa: 5, Oui: 3274, Id: 9978796492}}, //sdd {"0x50014ee20b2a72a9", detect.Wwn{Naa: 5, Oui: 5358, Id: 8777265833}}, //sde {"0x5000cca264ebc248", detect.Wwn{Naa: 5, Oui: 3274, Id: 10283106888}}, //sdf {"0x5000c500673e6b5f", detect.Wwn{Naa: 5, Oui: 3152, Id: 1732143967}}, //sdg } //test for _, tt := range tests { t.Run(tt.wwnStr, func(t *testing.T) { str := tt.wwn.ToString() require.Equal(t, tt.wwnStr, str) }) } } ================================================ FILE: collector/pkg/errors/errors.go ================================================ package errors import ( "fmt" ) // Raised when config file is missing type ConfigFileMissingError string func (str ConfigFileMissingError) Error() string { return fmt.Sprintf("ConfigFileMissingError: %q", string(str)) } // Raised when the config file doesnt match schema type ConfigValidationError string func (str ConfigValidationError) Error() string { return fmt.Sprintf("ConfigValidationError: %q", string(str)) } // Raised when a dependency (like smartd or ssh-agent) is missing type DependencyMissingError string func (str DependencyMissingError) Error() string { return fmt.Sprintf("DependencyMissingError: %q", string(str)) } // Raised when there was an error communicating with API server type ApiServerCommunicationError string func (str ApiServerCommunicationError) Error() string { return fmt.Sprintf("ApiServerCommunicationError: %q", string(str)) } ================================================ FILE: collector/pkg/errors/errors_test.go ================================================ package errors_test import ( "github.com/analogj/scrutiny/collector/pkg/errors" "github.com/stretchr/testify/require" "testing" ) //func TestCheckErr_WithoutError(t *testing.T) { // t.Parallel() // // //assert // require.NotPanics(t, func() { // errors.CheckErr(nil) // }) //} //func TestCheckErr_Error(t *testing.T) { // t.Parallel() // // //assert // require.Panics(t, func() { // errors.CheckErr(stderrors.New("This is an error")) // }) //} func TestErrors(t *testing.T) { t.Parallel() //assert require.Implements(t, (*error)(nil), errors.ConfigFileMissingError("test"), "should implement the error interface") require.Implements(t, (*error)(nil), errors.ConfigValidationError("test"), "should implement the error interface") require.Implements(t, (*error)(nil), errors.DependencyMissingError("test"), "should implement the error interface") } ================================================ FILE: collector/pkg/models/device.go ================================================ package models type Device struct { WWN string `json:"wwn"` DeviceName string `json:"device_name"` DeviceUUID string `json:"device_uuid"` DeviceSerialID string `json:"device_serial_id"` DeviceLabel string `json:"device_label"` Manufacturer string `json:"manufacturer"` ModelName string `json:"model_name"` InterfaceType string `json:"interface_type"` InterfaceSpeed string `json:"interface_speed"` SerialNumber string `json:"serial_number"` Firmware string `json:"firmware"` RotationSpeed int `json:"rotational_speed"` Capacity int64 `json:"capacity"` FormFactor string `json:"form_factor"` SmartSupport bool `json:"smart_support"` DeviceProtocol string `json:"device_protocol"` //protocol determines which smart attribute types are available (ATA, NVMe, SCSI) DeviceType string `json:"device_type"` //device type is used for querying with -d/t flag, should only be used by collector. // User provided metadata Label string `json:"label"` HostId string `json:"host_id"` } type DeviceWrapper struct { Success bool `json:"success,omitempty"` Errors []error `json:"errors,omitempty"` Data []Device `json:"data"` } ================================================ FILE: collector/pkg/models/scan.go ================================================ package models type Scan struct { JSONFormatVersion []int `json:"json_format_version"` Smartctl struct { Version []int `json:"version"` SvnRevision string `json:"svn_revision"` PlatformInfo string `json:"platform_info"` BuildInfo string `json:"build_info"` Argv []string `json:"argv"` ExitStatus int `json:"exit_status"` } `json:"smartctl"` Devices []ScanDevice `json:"devices"` } type ScanDevice struct { Name string `json:"name"` InfoName string `json:"info_name"` Type string `json:"type"` Protocol string `json:"protocol"` } ================================================ FILE: collector/pkg/models/scan_override.go ================================================ package models type ScanOverride struct { Device string `mapstructure:"device"` DeviceType []string `mapstructure:"type"` Ignore bool `mapstructure:"ignore"` Commands struct { MetricsInfoArgs string `mapstructure:"metrics_info_args"` MetricsSmartArgs string `mapstructure:"metrics_smart_args"` } `mapstructure:"commands"` } ================================================ FILE: docker/Dockerfile ================================================ # syntax=docker/dockerfile:1.4 ######################################################################################################################## # Omnibus Image ######################################################################################################################## ######## Build the frontend FROM --platform=${BUILDPLATFORM} node AS frontendbuild WORKDIR /go/src/github.com/analogj/scrutiny COPY --link Makefile /go/src/github.com/analogj/scrutiny/ COPY --link webapp/frontend /go/src/github.com/analogj/scrutiny/webapp/frontend RUN make binary-frontend ######## Build the backend FROM golang:1.25-trixie as backendbuild WORKDIR /go/src/github.com/analogj/scrutiny COPY --link Makefile /go/src/github.com/analogj/scrutiny/ COPY --link go.mod go.sum /go/src/github.com/analogj/scrutiny/ COPY --link collector /go/src/github.com/analogj/scrutiny/collector COPY --link webapp/backend /go/src/github.com/analogj/scrutiny/webapp/backend RUN apt-get update && DEBIAN_FRONTEND=noninteractive \ apt-get install -y --no-install-recommends \ file \ && rm -rf /var/lib/apt/lists/* RUN make binary-clean binary-all WEB_BINARY_NAME=scrutiny ######## Build smartmontools from source FROM debian:trixie-slim AS smartmontoolsbuild ARG SMARTMONTOOLS_VER=7.5 RUN apt-get update && DEBIAN_FRONTEND=noninteractive \ apt-get install -y --no-install-recommends \ ca-certificates curl gcc g++ gnupg make \ && rm -rf /var/lib/apt/lists/* RUN curl -L "https://github.com/smartmontools/smartmontools/releases/download/RELEASE_$(echo ${SMARTMONTOOLS_VER} | tr '.' '_')/smartmontools-${SMARTMONTOOLS_VER}.tar.gz" -o /tmp/smartmontools.tar.gz \ && tar -xzf /tmp/smartmontools.tar.gz -C /tmp \ && cd /tmp/smartmontools-${SMARTMONTOOLS_VER} \ && ./configure --prefix=/usr LDFLAGS='-static' --without-libcap-ng --without-libsystemd \ && make -j"$(nproc)" \ && make install \ && /usr/sbin/update-smart-drivedb \ && rm -rf /tmp/smartmontools* ######## Combine build artifacts in runtime image FROM debian:trixie-slim AS runtime ARG TARGETARCH EXPOSE 8080 WORKDIR /opt/scrutiny ENV PATH="/opt/scrutiny/bin:${PATH}" ENV INFLUXD_CONFIG_PATH=/opt/scrutiny/influxdb ENV S6VER="3.1.6.2" ENV INFLUXVER="2.2.0" ENV S6_SERVICES_READYTIME=1000 SHELL ["/usr/bin/sh", "-c"] RUN apt-get update && DEBIAN_FRONTEND=noninteractive \ apt-get install -y --no-install-recommends \ ca-certificates \ cron \ curl \ tzdata \ procps \ xz-utils \ && rm -rf /var/lib/apt/lists/* \ && update-ca-certificates \ && case ${TARGETARCH} in \ "amd64") S6_ARCH=x86_64 ;; \ "arm64") S6_ARCH=aarch64 ;; \ esac \ && curl https://github.com/just-containers/s6-overlay/releases/download/v${S6VER}/s6-overlay-noarch.tar.xz -L -s --output /tmp/s6-overlay-noarch.tar.xz \ && tar -Jxpf /tmp/s6-overlay-noarch.tar.xz -C / \ && rm -rf /tmp/s6-overlay-noarch.tar.xz \ && curl https://github.com/just-containers/s6-overlay/releases/download/v${S6VER}/s6-overlay-${S6_ARCH}.tar.xz -L -s --output /tmp/s6-overlay-${S6_ARCH}.tar.xz \ && tar -Jxpf /tmp/s6-overlay-${S6_ARCH}.tar.xz -C / \ && rm -rf /tmp/s6-overlay-${S6_ARCH}.tar.xz RUN curl -L https://dl.influxdata.com/influxdb/releases/influxdb2-${INFLUXVER}-${TARGETARCH}.deb --output /tmp/influxdb2-${INFLUXVER}-${TARGETARCH}.deb \ && dpkg -i --force-all /tmp/influxdb2-${INFLUXVER}-${TARGETARCH}.deb \ && rm -rf /tmp/influxdb2-${INFLUXVER}-${TARGETARCH}.deb COPY /rootfs / COPY --from=smartmontoolsbuild /usr/sbin/smartctl /usr/sbin/smartctl COPY --from=smartmontoolsbuild /usr/share/smartmontools/ /usr/share/smartmontools/ COPY --link --from=backendbuild --chmod=755 /go/src/github.com/analogj/scrutiny/scrutiny /opt/scrutiny/bin/ COPY --link --from=backendbuild --chmod=755 /go/src/github.com/analogj/scrutiny/scrutiny-collector-metrics /opt/scrutiny/bin/ COPY --link --from=frontendbuild --chmod=644 /go/src/github.com/analogj/scrutiny/dist /opt/scrutiny/web RUN chmod 0644 /etc/cron.d/scrutiny && \ rm -f /etc/cron.daily/* && \ mkdir -p /opt/scrutiny/web && \ mkdir -p /opt/scrutiny/config && \ chmod -R ugo+rwx /opt/scrutiny/config && \ chmod +x /etc/cont-init.d/* && \ chmod +x /etc/services.d/*/run && \ chmod +x /etc/services.d/*/finish CMD ["/init"] ================================================ FILE: docker/Dockerfile.collector ================================================ ######################################################################################################################## # Collector Image ######################################################################################################################## ######## FROM golang:1.25-trixie AS backendbuild WORKDIR /go/src/github.com/analogj/scrutiny COPY --link Makefile /go/src/github.com/analogj/scrutiny/ COPY --link go.mod go.sum /go/src/github.com/analogj/scrutiny/ COPY --link collector /go/src/github.com/analogj/scrutiny/collector COPY --link webapp/backend /go/src/github.com/analogj/scrutiny/webapp/backend RUN apt-get update && apt-get install -y file && rm -rf /var/lib/apt/lists/* RUN make binary-clean binary-collector ######## Build smartmontools from source FROM debian:trixie-slim AS smartmontoolsbuild ARG SMARTMONTOOLS_VER=7.5 RUN apt-get update && DEBIAN_FRONTEND=noninteractive \ apt-get install -y --no-install-recommends \ ca-certificates curl gcc g++ gnupg make \ && rm -rf /var/lib/apt/lists/* RUN curl -L "https://github.com/smartmontools/smartmontools/releases/download/RELEASE_$(echo ${SMARTMONTOOLS_VER} | tr '.' '_')/smartmontools-${SMARTMONTOOLS_VER}.tar.gz" -o /tmp/smartmontools.tar.gz \ && tar -xzf /tmp/smartmontools.tar.gz -C /tmp \ && cd /tmp/smartmontools-${SMARTMONTOOLS_VER} \ && ./configure --prefix=/usr LDFLAGS='-static' --without-libcap-ng --without-libsystemd \ && make -j"$(nproc)" \ && make install \ && /usr/sbin/update-smart-drivedb \ && rm -rf /tmp/smartmontools* ######## FROM debian:trixie-slim AS runtime WORKDIR /opt/scrutiny ENV PATH="/opt/scrutiny/bin:${PATH}" RUN apt-get update && apt-get install -y cron ca-certificates tzdata && rm -rf /var/lib/apt/lists/* && update-ca-certificates COPY --from=smartmontoolsbuild /usr/sbin/smartctl /usr/sbin/smartctl COPY --from=smartmontoolsbuild /usr/share/smartmontools/ /usr/share/smartmontools/ COPY /docker/entrypoint-collector.sh /entrypoint-collector.sh COPY /rootfs/etc/cron.d/scrutiny /etc/cron.d/scrutiny COPY --from=backendbuild /go/src/github.com/analogj/scrutiny/scrutiny-collector-metrics /opt/scrutiny/bin/ RUN chmod +x /opt/scrutiny/bin/scrutiny-collector-metrics && \ chmod +x /entrypoint-collector.sh && \ chmod 0644 /etc/cron.d/scrutiny && \ rm -f /etc/cron.daily/apt /etc/cron.daily/dpkg /etc/cron.daily/passwd CMD ["/entrypoint-collector.sh"] ================================================ FILE: docker/Dockerfile.smartmontools ================================================ ######################################################################################################################## # Smartmontools Builder # - Builds smartctl from source as a static binary. # - Updates the drive database to include the latest drive models since it can change between releases. # - Used as a shared build stage by Dockerfile and Dockerfile.collector. ######################################################################################################################## FROM debian:trixie-slim ARG SMARTMONTOOLS_VER=7.5 RUN apt-get update && DEBIAN_FRONTEND=noninteractive \ apt-get install -y --no-install-recommends \ ca-certificates curl gcc g++ gnupg make \ && rm -rf /var/lib/apt/lists/* RUN curl -L "https://github.com/smartmontools/smartmontools/releases/download/RELEASE_$(echo ${SMARTMONTOOLS_VER} | tr '.' '_')/smartmontools-${SMARTMONTOOLS_VER}.tar.gz" -o /tmp/smartmontools.tar.gz \ && tar -xzf /tmp/smartmontools.tar.gz -C /tmp \ && cd /tmp/smartmontools-${SMARTMONTOOLS_VER} \ && ./configure --prefix=/usr LDFLAGS='-static' --without-libcap-ng --without-libsystemd \ && make -j"$(nproc)" \ && make install \ && /usr/sbin/update-smart-drivedb \ && rm -rf /tmp/smartmontools* ================================================ FILE: docker/Dockerfile.web ================================================ # syntax=docker/dockerfile:1.4 ######################################################################################################################## # Web Image ######################################################################################################################## ######## Build the frontend FROM --platform=${BUILDPLATFORM} node AS frontendbuild WORKDIR /go/src/github.com/analogj/scrutiny COPY --link Makefile /go/src/github.com/analogj/scrutiny/ COPY --link webapp/frontend /go/src/github.com/analogj/scrutiny/webapp/frontend RUN make binary-frontend ######## Build the backend FROM golang:1.25-trixie as backendbuild WORKDIR /go/src/github.com/analogj/scrutiny COPY --link Makefile /go/src/github.com/analogj/scrutiny/ COPY --link go.mod go.sum /go/src/github.com/analogj/scrutiny/ COPY --link collector /go/src/github.com/analogj/scrutiny/collector COPY --link webapp/backend /go/src/github.com/analogj/scrutiny/webapp/backend RUN apt-get update && apt-get install -y file && rm -rf /var/lib/apt/lists/* RUN make binary-clean binary-all WEB_BINARY_NAME=scrutiny ######## Combine build artifacts in runtime image FROM debian:trixie-slim as runtime EXPOSE 8080 WORKDIR /opt/scrutiny ENV PATH="/opt/scrutiny/bin:${PATH}" RUN apt-get update && apt-get install -y ca-certificates curl tzdata && rm -rf /var/lib/apt/lists/* && update-ca-certificates COPY --link --from=backendbuild --chmod=755 /go/src/github.com/analogj/scrutiny/scrutiny /opt/scrutiny/bin/ COPY --link --from=frontendbuild --chmod=644 /go/src/github.com/analogj/scrutiny/dist /opt/scrutiny/web RUN mkdir -p /opt/scrutiny/web && \ mkdir -p /opt/scrutiny/config && \ chmod -R a+rX /opt/scrutiny && \ chmod -R a+w /opt/scrutiny/config CMD ["/opt/scrutiny/bin/scrutiny", "start"] ================================================ FILE: docker/README.md ================================================ `rootfs` is only used by Dockerfile and Dockerfile.collector ================================================ FILE: docker/entrypoint-collector.sh ================================================ #!/bin/bash # Cron runs in its own isolated environment (usually using only /etc/environment ) # So when the container starts up, we will do a dump of the runtime environment into a .env file that we # will then source into the crontab file (/etc/cron.d/scrutiny) (set -o posix; export -p) > /env.sh # adding ability to customize the cron schedule. COLLECTOR_CRON_SCHEDULE=${COLLECTOR_CRON_SCHEDULE:-"0 0 * * *"} COLLECTOR_RUN_STARTUP=${COLLECTOR_RUN_STARTUP:-"false"} COLLECTOR_RUN_STARTUP_SLEEP=${COLLECTOR_RUN_STARTUP_SLEEP:-"1"} # if the cron schedule has been overridden via env variable (eg docker-compose) we should make sure to strip quotes [[ "${COLLECTOR_CRON_SCHEDULE}" == \"*\" || "${COLLECTOR_CRON_SCHEDULE}" == \'*\' ]] && COLLECTOR_CRON_SCHEDULE="${COLLECTOR_CRON_SCHEDULE:1:-1}" # replace placeholder with correct value sed -i 's|{COLLECTOR_CRON_SCHEDULE}|'"${COLLECTOR_CRON_SCHEDULE}"'|g' /etc/cron.d/scrutiny if [[ "${COLLECTOR_RUN_STARTUP}" == "true" ]]; then sleep ${COLLECTOR_RUN_STARTUP_SLEEP} echo "starting scrutiny collector (run-once mode. subsequent calls will be triggered via cron service)" /opt/scrutiny/bin/scrutiny-collector-metrics run fi # now that we have the env start cron in the foreground echo "starting cron" exec su -c "cron -f -L 15" root ================================================ FILE: docker/example.hubspoke.docker-compose.yml ================================================ version: '2.4' services: influxdb: restart: unless-stopped image: influxdb:2.8 ports: - '8086:8086' volumes: - './influxdb:/var/lib/influxdb2' healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8086/health"] interval: 5s timeout: 10s retries: 20 web: restart: unless-stopped image: 'ghcr.io/analogj/scrutiny:master-web' ports: - '8080:8080' volumes: - './config:/opt/scrutiny/config' environment: SCRUTINY_WEB_INFLUXDB_HOST: 'influxdb' depends_on: influxdb: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/api/health"] interval: 5s timeout: 10s retries: 20 start_period: 10s collector: restart: unless-stopped image: 'ghcr.io/analogj/scrutiny:master-collector' cap_add: - SYS_RAWIO volumes: - '/run/udev:/run/udev:ro' environment: COLLECTOR_API_ENDPOINT: 'http://web:8080' COLLECTOR_HOST_ID: 'scrutiny-collector-hostname' # If true forces the collector to run on startup (cron will be started after the collector completes) # see: https://github.com/AnalogJ/scrutiny/blob/master/docs/TROUBLESHOOTING_DEVICE_COLLECTOR.md#collector-trigger-on-startup COLLECTOR_RUN_STARTUP: false depends_on: web: condition: service_healthy devices: - "/dev/sda" - "/dev/sdb" ================================================ FILE: docker/example.omnibus.docker-compose.yml ================================================ version: '3.5' services: scrutiny: restart: unless-stopped container_name: scrutiny image: ghcr.io/analogj/scrutiny:master-omnibus cap_add: - SYS_RAWIO ports: - "8080:8080" # webapp - "8086:8086" # influxDB admin volumes: - /run/udev:/run/udev:ro - ./config:/opt/scrutiny/config - ./influxdb:/opt/scrutiny/influxdb devices: - "/dev/sda" - "/dev/sdb" ================================================ FILE: docs/DOWNSAMPLING.md ================================================ # Downsampling Scrutiny collects alot of data, that can cause the database to grow unbounded. - Smart data - Smart test data - Temperature data - Disk metrics (capacity/usage) - etc This data must be accurate in the short term, and is useful for doing trend analysis in the long term. However, for trend analysis we only need aggregate data, individual data points are not as useful. Scrutiny will automatically downsample data on a schedule to ensure that the database size stays reasonable, while still ensuring historical data is present for comparisons. | Bucket Name | Retention Period | Downsampling Range | Downsampling Aggregation Window | Downsampling Cron | Comments | | --- | --- | --- | --- | --- | --- | | `metrics` | 15 days | `-2w -1w` | `1w` | main bucket, weekly on Sunday at 1:00am | | `metrics_weekly` | 9 weeks | `-2mo -1mo` | `1mo` | monthly on first day of the month at 1:30am | `metrics_monthly` | 25 months | `-2y -1y` | `1y` | yearly on the first day of the year at 2:00am | `metrics_yearly` | forever | - | - | - | | After 5 months, here's how may data points should exist in each bucket for one disk | Bucket Name | Datapoints | Comments | | --- | --- | --- | | `metrics` | 15 | 7 daily datapoints , up to 7 pending data, 1 buffer data point | | `metrics_weekly` | 9 | 4 aggregated weekly data points, 4 pending datapoints, 1 buffer data point | | `metrics_monthly` | 3 | 3 aggregated monthly data points | | `metrics_yearly` | 0 | | After 5 years, here's how may data points should exist in each bucket for one disk | Bucket Name | Datapoints | Comments | | --- | --- | --- | | `metrics` | - | - | | `metrics_weekly` | - | | `metrics_monthly` | - | | `metrics_yearly` | - | ================================================ FILE: docs/INSTALL_ANSIBLE.md ================================================ # Ansible Install [Zorlin](https://github.com/Zorlin) has developed and now maintains [an Ansible playbook](https://github.com/Zorlin/scrutiny-playbook) which automates the steps involved in manually setting up Scrutiny. Using it is simple: * Grab a copy of the playbook * Follow the directions in the playbook repository * Run `ansible-playbook site.yml` * Visit http://your-machine:8080 to see your new Scrutiny installation. It will automatically pull metrics from machines once a day, at 1am. You can see it in action below. [![asciicast](https://asciinema.org/a/493531.svg)](https://asciinema.org/a/493531) ================================================ FILE: docs/INSTALL_HUB_SPOKE.md ================================================ > See [docker/example.hubspoke.docker-compose.yml](https://github.com/AnalogJ/scrutiny/blob/master/docker/example.hubspoke.docker-compose.yml) for a docker-compose file. > The following guide was contributed by @TinJoy59 in #417 > It describes how to deploy the Scrutiny in Hub/Spoke mode, where the Hub is running in Docker, and the Spokes ( > collectors) are running as binaries. > He's using Proxmox & Synology in his guide, however this should be applicable for almost anyone # S.M.A.R.T. Monitoring with Scrutiny across machines ![drawing-3-1671744407](https://user-images.githubusercontent.com/86809766/209230023-bf1ef9f8-65c4-454e-9e1a-be1293cd737e.png) ### 🤔 The problem: Scrutiny offers a nice Docker package called "Omnibus" that can monitor HDDs attached to a Docker host with relative ease. Scrutiny can also be installed in a Hub-Spoke layout where Web interface, Database and Collector come in 3 separate packages. The official documentation assumes that the spokes in the "Hub-Spokes layout" run Docker, which is not always the case. The third approach is to install Scrutiny manually, entirely outside of Docker. ### 💡 The solution: This tutorial provides a hybrid configuration where the Hub lives in a Docker instance while the spokes have only Scrutiny Collector installed manually. The Collector periodically send data to the Hub. It's not mind-boggling hard to understand but someone might struggle with the setup. This is for them. ### 🖥️ My setup: I have a Proxmox cluster where one VM runs Docker and all monitoring services - Grafana, Prometheus, various exporters, InfluxDB and so forth. Another VM runs the NAS - OpenMediaVault v6, where all hard drives reside. The Scrutiny Collector is triggered every 30min to collect data on the drives. The data is sent to the Docker VM, running InfluxDB. ## Setting up the Hub ![drawing-3-1671744714](https://user-images.githubusercontent.com/86809766/209230113-c954d834-521b-4555-bcd2-eb6b80f343be.png) The Hub consists of Scrutiny Web - a web interface for viewing the SMART data. And InfluxDB, where the smartmon data is stored. [🔗This is the official Hub-Spoke layout in docker-compose.](https://github.com/AnalogJ/scrutiny/blob/master/docker/example.hubspoke.docker-compose.yml) We are going to reuse parts of it. The ENV variables provide the necessary configuration for the initial setup, both for InfluxDB and Scrutiny. If you are working with and existing InfluxDB instance, you can forgo all the `INIT` variables as they already exist. The official Scrutiny documentation has a sample [scrutiny.yaml ](https://github.com/AnalogJ/scrutiny/blob/master/example.scrutiny.yaml)file that normally contains the connection and notification details but I always find it easier to configure as much as possible in the docker-compose. ```yaml networks: monitoring: # A common network for all monitoring services to communicate into notifications: # To Gotify or another Notification service services: influxdb: restart: unless-stopped container_name: influxdb image: influxdb:2.8 ports: - 8086:8086 volumes: - ${DIR_CONFIG}/influxdb2/db:/var/lib/influxdb2 - ${DIR_CONFIG}/influxdb2/config:/etc/influxdb2 environment: - DOCKER_INFLUXDB_INIT_MODE=setup - DOCKER_INFLUXDB_INIT_USERNAME=Admin - DOCKER_INFLUXDB_INIT_PASSWORD=${PASSWORD} - DOCKER_INFLUXDB_INIT_ORG=homelab - DOCKER_INFLUXDB_INIT_BUCKET=scrutiny - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=SUPER-SECRET-TOKEN - TZ=Europe/Stockholm networks: - monitoring scrutiny: restart: unless-stopped container_name: scrutiny # best practice: pin to a specific release instead of latest image: ghcr.io/analogj/scrutiny:latest-web ports: - 8080:8080 volumes: - ${DIR_CONFIG}/config:/opt/scrutiny/config environment: - SCRUTINY_WEB_INFLUXDB_HOST=influxdb - SCRUTINY_WEB_INFLUXDB_PORT=8086 - SCRUTINY_WEB_INFLUXDB_TOKEN=SUPER-SECRET-TOKEN - SCRUTINY_WEB_INFLUXDB_ORG=homelab - SCRUTINY_WEB_INFLUXDB_BUCKET=scrutiny # Optional but highly recommended to notify you in case of a problem; space-separated list of shoutrrr uri's # https://github.com/AnalogJ/scrutiny/blob/master/docs/TROUBLESHOOTING_NOTIFICATIONS.md - SCRUTINY_NOTIFY_URLS=http://gotify:80/message?token=a-gotify-token ntfy://username:password@host:port/topic - TZ=Europe/Stockholm depends_on: influxdb: condition: service_healthy networks: - notifications - monitoring ``` A freshly initialized Scrutiny instance can be accessed on port 8080, eg. `192.168.0.100:8080`. The interface will be empty because no metrics have been collected yet. ## Setting up a Spoke ***without*** Docker ![drawing-3-1671744208](https://user-images.githubusercontent.com/86809766/209230155-386a8644-b506-497f-8245-0d24e15c9063.png) A spoke consists of the Scrutiny Collector binary that is run on a set interval via crontab and sends the data to the Hub. The official documentation [describes the manual setup of the Collector](https://github.com/AnalogJ/scrutiny/blob/master/docs/INSTALL_MANUAL.md#collector) - dependencies and step by step commands. I have a shortened version that does the same thing but in one line of code. ```bash # Installing dependencies apt install smartmontools -y # 1. Create directory for the binary # 2. Download the binary into that directory # 3. Make it exacutable # 4. List the contents of the library for confirmation mkdir -p /opt/scrutiny/bin && \ curl -L https://github.com/AnalogJ/scrutiny/releases/download/v0.8.1/scrutiny-collector-metrics-linux-amd64 > /opt/scrutiny/bin/scrutiny-collector-metrics-linux-amd64 && \ chmod +x /opt/scrutiny/bin/scrutiny-collector-metrics-linux-amd64 && \ ls -lha /opt/scrutiny/bin ```

When downloading Github Release Assests, make sure that you have the correct version. The provided example is with Release v0.5.0. [The release list can be found here.](https://github.com/analogj/scrutiny/releases)

Once the Collector is installed, you can run it with the following command. Make sure to add the correct address and port of your Hub as `--api-endpoint`. ```bash /opt/scrutiny/bin/scrutiny-collector-metrics-linux-amd64 run --api-endpoint "http://192.168.0.100:8080" ``` This will run the Collector once and populate the Web interface of your Scrutiny instance. In order to collect metrics for a time series, you need to run the command repeatedly. Here is an example for crontab, running the Collector every 15min. ```bash # open crontab crontab -e # add a line for Scrutiny */15 * * * * /opt/scrutiny/bin/scrutiny-collector-metrics-linux-amd64 run --api-endpoint "http://192.168.0.100:8080" ``` The Collector has its own independent config file that lives in `/opt/scrutiny/config/collector.yaml` but I did not find a need to modify it. [A default collector.yaml can be found in the official documentation.](https://github.com/AnalogJ/scrutiny/blob/master/example.collector.yaml) ## Setting up a Spoke ***with*** Docker ![drawing-3-1671744277](https://user-images.githubusercontent.com/86809766/209230176-87c9e55a-4e3e-4f5f-9609-335d41529f3d.png) Setting up a remote Spoke in Docker requires you to split the [official Hub-Spoke layout docker-compose.yml](https://github.com/AnalogJ/scrutiny/blob/master/docker/example.hubspoke.docker-compose.yml) . In the following docker-compose you need to provide the `${API_ENDPOINT}`, in my case `http://192.168.0.100:8080`. Also all drives that you wish to monitor need to be presented to the container under `devices`. The image handles the periodic scanning of the drives. ```yaml services: collector: restart: unless-stopped # best practice: pin to a specific release instead of latest image: 'ghcr.io/analogj/scrutiny:latest-collector' cap_add: - SYS_RAWIO volumes: - '/run/udev:/run/udev:ro' environment: COLLECTOR_API_ENDPOINT: ${API_ENDPOINT} devices: - "/dev/sda" - "/dev/sdb" ``` ================================================ FILE: docs/INSTALL_MANUAL.md ================================================ # Manual Install While the easiest way to get started with [Scrutiny is using Docker](https://github.com/AnalogJ/scrutiny#docker), it is possible to run it manually without much work. You can even mix and match, using Docker for one component and a manual installation for the other. There's also [an installer](INSTALL_ANSIBLE.md) which automates this manual installation procedure. Scrutiny is made up of three components: an influxdb Database, a collector and a webapp/api. Here's how each component can be deployed manually. > Note: the `/opt/scrutiny` directory is not hardcoded, you can use any directory name/path. ## InfluxDB Please follow the official InfluxDB installation guide. Note, you'll need to install v2.8.0+. https://docs.influxdata.com/influxdb/v2/install/ ## Webapp/API ### Dependencies Since the webapp is packaged as a stand alone binary, there isn't really any software you need to install other than `glibc` which is included by most linux OS's already. ### Directory Structure Now let's create a directory structure to contain the Scrutiny files & binary. ``` mkdir -p /opt/scrutiny/config mkdir -p /opt/scrutiny/web mkdir -p /opt/scrutiny/bin ``` ### Config file While it is possible to run the webapp/api without a config file, the defaults are designed for use in a container environment, and so will need to be overridden. So the first thing you'll need to do is create a config file that looks like the following: ``` # stored in /opt/scrutiny/config/scrutiny.yaml version: 1 web: database: # The Scrutiny webapp will create a database for you, however the parent directory must exist. location: /opt/scrutiny/config/scrutiny.db src: frontend: # The path to the Scrutiny frontend files (js, css, images) must be specified. # We'll populate it with files in the next section path: /opt/scrutiny/web # if you're runnning influxdb on a different host (or using a cloud-provider) you'll need to update the host & port below. # token, org, bucket are unnecessary for a new InfluxDB installation, as Scrutiny will automatically run the InfluxDB setup, # and store the information in the config file. If you 're re-using an existing influxdb installation, you'll need to provide # the `token` influxdb: host: localhost port: 8086 # token: 'my-token' # org: 'my-org' # bucket: 'bucket' ``` > Note: for a full list of available configuration options, please check the [example.scrutiny.yaml](https://github.com/AnalogJ/scrutiny/blob/master/example.scrutiny.yaml) file. ### Download Files Next, we'll download the Scrutiny API binary and frontend files from the [latest Github release](https://github.com/analogj/scrutiny/releases). The files you need to download are named: - **scrutiny-web-linux-amd64** - save this file to `/opt/scrutiny/bin` - **scrutiny-web-frontend.tar.gz** - save this file to `/opt/scrutiny/web` ### Prepare Scrutiny Now that we have downloaded the required files, let's prepare the filesystem. ``` # Let's make sure the Scrutiny webapp is executable. chmod +x /opt/scrutiny/bin/scrutiny-web-linux-amd64 # Next, lets extract the frontend files. # NOTE: after extraction, there **should not** be a `dist` subdirectory in `/opt/scrutiny/web` directory. cd /opt/scrutiny/web tar xvzf scrutiny-web-frontend.tar.gz --strip-components 1 -C . # Cleanup rm -rf scrutiny-web-frontend.tar.gz ``` ### Start Scrutiny Webapp Finally, we start the Scrutiny webapp: ``` /opt/scrutiny/bin/scrutiny-web-linux-amd64 start --config /opt/scrutiny/config/scrutiny.yaml ``` The webapp listens for traffic on `http://0.0.0.0:8080` by default. ## Collector ### Dependencies Unlike the webapp, the collector does have some dependencies: - `smartctl`, v7+ - `cron` (or an alternative process scheduler) Unfortunately the version of `smartmontools` (which contains `smartctl`) available in some of the base OS repositories is ancient. So you'll need to install the v7+ version using one of the following commands: - **Ubuntu (22.04/Jammy/LTS):** `apt-get install -y smartmontools` - **Ubuntu (18.04/Bionic):** `apt-get install -y smartmontools=7.0-0ubuntu1~ubuntu18.04.1` - **Centos8:** - `dnf install https://extras.getpagespeed.com/release-el8-latest.rpm` - `dnf install smartmontools` - **FreeBSD:** `pkg install smartmontools` The following additional dependencies are needed if you want to run the collector as an unprivileged user: - systemd version > 235 - a restricted user account ### Directory Structure Now let's create a directory structure to contain the Scrutiny collector binary. ``` mkdir -p /opt/scrutiny/bin ``` ### Download Files Next, we'll download the Scrutiny collector binary from the [latest Github release](https://github.com/analogj/scrutiny/releases). You are looking for the one titled **scrutiny-collector-metrics-linux-amd64** unless you know you are on arm. ```sh wget -O /tmp/scrutiny-collector-metrics https://github.com/AnalogJ/scrutiny/releases/latest/download/scrutiny-collector-metrics-linux-amd64 ``` Optional, but recommended: Before continuing it's recommended you compare the sha from the release page with the downloaded file to ensure it's the same file and not corrupted/tampered with. The command to do this is: `echo "SHA_GOES_HERE /tmp/scrutiny-collector-metrics" | sha256sum -c` example for the v0.8.6 release: `echo "4c163645ce24e5487f4684a25ec73485d77a82a57f084808ff5aad0c11499ad2 /tmp/scrutiny-collector-metrics" | sha256sum -c` followed by: `sudo mv /tmp/scrutiny-collector-metrics /opt/scrutiny/bin/` to move the binary to its final resting place ### Prepare Scrutiny Now that we have downloaded the required files, let's prepare the filesystem. ```sh # Let's make sure the Scrutiny collector is executable. chmod +x /opt/scrutiny/bin/scrutiny-collector-metrics ``` if you are using SELinux, you may need to also do the following: ```sh # tell SELinux to allow these binaries sudo semanage fcontext -a -t bin_t "/opt/scrutiny/bin(/.*)?" # update labels sudo restorecon -Rv /opt/scrutiny/bin ``` ### Start Scrutiny Collector, Populate Webapp Next, we will manually trigger the collector, to populate the Scrutiny dashboard: > NOTE: if you need to pass a config file to the scrutiny collector, you can provide it using the `--config` flag. ```sh /opt/scrutiny/bin/scrutiny-collector-metrics run --api-endpoint "http://localhost:8080" ``` ### Schedule Collector with (root) Cron Finally you need to schedule the collector to run periodically. This may be different depending on your OS/environment, but it may look something like this: ```sh # open crontab sudo crontab -e # add a line for Scrutiny */15 * * * * . /etc/profile; /opt/scrutiny/bin/scrutiny-collector-metrics run --api-endpoint "http://localhost:8080" ``` ### Schedule Collector with Systemd (rootless) Alternatively you can run `scrutiny-collector-metrics` as non-root so long as the relevant capabilities and permissions are granted. #### Creating a Restricted Service Account This is the account that will run `scrutiny-collector-metrics`. Note this isn't strictly needed for all setups, but is useful from a logging/auditing perspective. - Debian-based distros: - `sudo adduser --system scrutiny-svc --group --home /opt/scrutiny-svc` - RHEL-based distros: - `sudo useradd --system --home-dir /opt/scrutiny-svc --shell /sbin/nologin scrutiny-svc` Next, add the user to the `disk` group: ```sh sudo usermod -aG disk scrutiny-svc ``` #### Creating a Restricted Systemd Service using AmbientCapabilities (easier) This is the simpler setup, which allows you to run scrutiny rootless, but depending on what you want, may require granting more permissions to scrutiny than you would like to. 1. go to `/etc/systemd/system` 2. create scrutiny-collector.service with the following contents: ```ini [Unit] Description=Daily Restricted Scrutiny Collector After=network.target [Service] [Unit] Description=Daily Restricted Scrutiny Collector After=network.target [Service] Type=oneshot User=scrutiny-svc Group=disk ExecStart=/opt/scrutiny/bin/scrutiny-collector-metrics run --api-endpoint "http://localhost:8080" # --- PRIVILEGE LOCKDOWN --- ## CAP_SYS_RAWIO is needed for SATA drives AmbientCapabilities=CAP_SYS_RAWIO CapabilityBoundingSet=CAP_SYS_RAWIO ## unfortunately nvme drives require CAP_SYS_ADMIN ## if you want nvme drives you must do the following: #AmbientCapabilities=CAP_SYS_RAWIO CAP_SYS_ADMIN #CapabilityBoundingSet= NoNewPrivileges=yes # Security/sandboxing settings KeyringMode=private LockPersonality=yes MemoryDenyWriteExecute=yes ProtectSystem=strict ProtectHome=yes PrivateDevices=no ## you can restrict devices using: #DevicePolicy=closed #DeviceAllow=/dev/sda r #DeviceAllow=/dev/nvme0 r ProtectKernelModules=yes ProtectKernelTunables=yes ProtectControlGroups=yes ProtectClock=yes ProtectHostname=yes ProtectKernelLogs=yes RemoveIPC=yes RestrictSUIDSGID=true # --- NETWORK LOCKDOWN ## use these to restrict what scrutiny can talk to over the network ## if using a hub on a different host you will need to change the values accordingly RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX IPAddressDeny=any IPAddressAllow=localhost [Install] WantedBy=multi-user.target ``` Additionally, for nvme drives you may need to create a udev rule on many systems, as /dev/nvme* is often owned only by root: ##### add udev rule `/etc/udev/rules.d/99-nvme.rules` with contents: ``` KERNEL=="nvme[0-9]*", GROUP="disk", MODE="0640" ``` then run the following commands to load the udev rule: ```sh sudo udevadm control --reload-rules sudo udevadm trigger --subsystem-match=nvme --action=add ``` ##### Pros: - easy to maintain - much better than running as root (especially if you don't need nvme drives) - there are no privilege escalations needed ##### Cons: NOTE: These cons basically only apply if a major supply-chain attack happens against scrutiny, and reflect a worst-case scenario that is unlikely to ever occur: - CAP_SYS_RAWIO allows for data exfiltration/modification from SATA drives (ssh keys, /etc/shadow, etc) - CAP_SYS_ADMIN would theoretically allow for significant system compromise - nvme drives requires a udev rule for reliable access If you are happy with that, you can jump to [Create a Systemd Timer to run scrutiny-collector.service](#create-a-systemd-timer-to-run-scrutiny-collectorservice) #### Creating a Restricted Systemd Service using sudo and Shim Script If granting scrutiny `CAP_SYS_RAWIO` and/or `CAP_SYS_ADMIN` exceeds your risk appetite, you have another option, though one more complicated and with its own set of pros/cons 1. run `sudo mkdir -p /opt/smartctl-shim/bin` 2. edit `/opt/smartctl-shim/bin/smartctl` with the following content: ```sh #!/bin/bash # Shim for accounts to use smartctl without being root # for automation requires the account be in sudoers exec /usr/bin/sudo /usr/sbin/smartctl "$@" ``` 3. create a new `scrutiny-collector` file in `/etc/sudoers.d/` 4. inside `/etc/sudoers.d/scrutiny-collector` add the following: ```sh scrutiny-svc ALL=(root) NOPASSWD: /usr/sbin/smartctl * ``` 5. go to `/etc/systemd/system` 6. create scrutiny-collector.service with the following contents: ```ini [Unit] Description=Daily Restricted Scrutiny Collector After=network.target [Service] Type=oneshot User=scrutiny-svc Environment="PATH=/opt/smartctl-shim/bin:/usr/bin:/bin" ExecStart=/opt/scrutiny/bin/scrutiny-collector-metrics run --api-endpoint "http://localhost:8080" # --- PRIVILEGE LOCKDOWN --- ## we use sudo to elevate privileges for smartctl only, so no Ambient Capabilities are needed AmbientCapabilities= ## CAP_SYS_RAWIO is needed for SATA drives CapabilityBoundingSet=CAP_SETUID CAP_SETGID CAP_AUDIT_WRITE CAP_SYS_RAWIO CAP_SYS_RESOURCE ## unfortunately nvme drives require CAP_SYS_ADMIN ## if you want nvme drives you must do the following: # CapabilityBoundingSet=CAP_SETUID CAP_SETGID CAP_AUDIT_WRITE CAP_SYS_RAWIO CAP_SYS_ADMIN CAP_SYS_RESOURCE ## since sudo needs to be used to elevate permissions in this setup, we need to allow new privileges NoNewPrivileges=no # Security/sandboxing settings KeyringMode=private LockPersonality=yes MemoryDenyWriteExecute=yes ProtectSystem=strict ProtectHome=yes PrivateDevices=no ProtectKernelModules=yes ProtectKernelTunables=yes ProtectControlGroups=yes ProtectClock=yes ProtectHostname=yes ProtectKernelLogs=yes RemoveIPC=yes RestrictSUIDSGID=true # --- NETWORK LOCKDOWN ## use these to restrict what scrutiny can talk to over the network ## if using a hub on a different host you will need to change the values accordingly RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX IPAddressDeny=any IPAddressAllow=localhost [Install] WantedBy=multi-user.target ``` ##### Pros: - the scrutiny binary itself will not have permissions like CAP_SYS_ADMIN - much better than running as root (especially if you don't need nvme drives) - `sudo` restricts privilege escalation to just `smartctl` - no udev rule needed ##### Cons: NOTE: These cons basically only apply if a major supply-chain attack happens against scrutiny, and reflect a worst-case scenario that is unlikely to ever occur: - Any sort of privilege escalation attack in sudo could theoretically allow a compromised scrutiny to gain additional privileges, since the process has permission to escelate privileges in general - Even though sudo only allows `smartctl`, it still has `CAP_SYS_RAWIO` and `CAP_SYS_ADMIN` so in theory the same attacks from the first method are possible, though now only with an exploit using smartctl instead of scrutiny directly - even though you don't need a udev rule, this adds a lot of additional administrative overhead - while the scrutiny binary itself isn't elevated, it has a sub-process that is running as root (systemctl) #### Create a Systemd Timer to run scrutiny-collector.service First, lets test our service. It doesn't matter which method you used above, as either way you need to load and run it. ```sh # reload changes for systemd services sudo systemctl daemon-reload # enable the service sudo systemctl enable scrutiny-collector.service # now run the service sudo systemctl start scrutiny-collector.service ``` You should see the data in your hub instance of scrutiny now. If your run into issues I recommend turning on debug logging for scrutiny and checking your system logs using journalctl. It may be a permission is missing or wrong. Now that things have been validated, lets create the systemd timer to run the service for us on a schedule: 1. if you are not still there, go to `/etc/systemd/system` 2. create scrutiny-collector.timer with the following contents: ```ini [Unit] Description=Run Scruitiny Collector daily at 2am [Timer] # Standard calendar trigger OnCalendar=*-*-* 02:00:00 # Ensures the job runs if the computer was off at 2am Persistent=true # Minimizes I/O spikes by staggering start time RandomizedDelaySec=30 [Install] WantedBy=timers.target ``` Update the schedule as you see fit for your needs Once you are satisfied with our timer, you'll need to load and enable it: ```sh # reload changes for systemd services sudo systemctl daemon-reload # now enable the timer sudo systemctl enable --now scrutiny-collector.timer ``` That's it! you're done. You can check the status of the timer using `sudo systemctl status scrutiny-collector.timer ` ================================================ FILE: docs/INSTALL_MANUAL_WINDOWS.md ================================================ # Manual Windows Install This guide is specifically for people who are on a Windows machine using [WSL](https://learn.microsoft.com/en-us/windows/wsl/about) with Docker. Scrutiny is made up of three components: an influxdb Database, a collector and a webapp/api. Docker will be used for the influxdb and webapp/API, the collector component will be facilitated by [Windows Task Scheduler](https://learn.microsoft.com/en-us/windows/win32/taskschd/task-scheduler-start-page). > **NOTE:** If you are **NOT** using WSL with docker, then the easiest way to get started with [Scrutiny is the omnibus Docker image](https://github.com/AnalogJ/scrutiny#docker). ## InfluxDB and Webapp/API (Docker) 1. Copy the [example.hubspoke.docker-compose.yml](https://github.com/AnalogJ/scrutiny/blob/master/docker/example.hubspoke.docker-compose.yml) file and delete the collector section near the bottom of the file. 2. Run `docker-compose up -d` to verify that the DB and webapp are working correctly and once its completed, your webapp should be up and running but the dashboard will be empty (default location is `localhost:8080`) ## Collector (Windows Task Scheduler) 1. Download the latest `scrutiny-collector-metrics-windows-amd64.exe` from the [releases page](https://github.com/AnalogJ/scrutiny/releases) (under assets) 2. On your windows host, open [Windows Task Scheduler](https://www.wikihow.com/Open-Task-Scheduler-in-Windows-10) as **Administrator** 1. In the **Start Menu** (Windows key), type `Task Scheduler` and then right click `Run as Administrator` to open 3. On the status bar (under the `action` tab), click `Create Task...` 4. A new window should open with the `General` Tab open, enter relevant information into the `Name` and `Description` fields 1. Under **Security Options** check: 1. **Run whether user is logged on or not** 2. **Run with highest privileges** 5. Next, click the `Triggers` tab and then click `New...` (bottom left-hand side of the window) 6. Here you can set how often you want this task to run, example settings are the following: 1. **Settings:** 1. `Daily`, start at `TODAYS_DATE` `12:00:00 AM`, Recur every `1` days, 2. **Advanced Settings:** 1. Repeat Task every: `1 hour` for a duration of `Indefinitely` 2. Stop task if it runs longer than: `30 minutes` 3. Click Ok when satisfied with your schedule > **NOTE:** The above settings will trigger the task **every day at midnight** and then **run every hour after that** (modify as needed) 7. Next, click the `Actions` tab and then click `New...` (bottom left-hand side of the window) 1. **Action Settings:** 1. In the **Program/Script** field, put: `scrutiny-collector-metrics-windows-amd64.exe` 2. In the **Add arguments (optional)** field, put: `run --api-endpoint "http://localhost:8080" --config collector.yaml` > **NOTE:** > * Make sure that you put the correct port number (as specified in the docker-compose file) for the webapp (default is `8080`) > * The `--config` param is optional and is not needed if you just want to use the default collector config, see [example.collector.yaml](https://github.com/AnalogJ/scrutiny/blob/master/example.collector.yaml) for more info on the collector config. 3. In the **Start in (optional)** field, put: FOLDER_PATH_TO_YOUR `scrutiny-collector-metrics-windows-amd64.exe` file > **NOTE:** Must be exact and do not include `scrutiny-collector-metrics-windows-amd64.exe` in the path 4. Click Ok when finished 8. Next, click the `Conditions` tab and make sure that everything is unchecked (unless you want to specify otherwise) 9. Next, click the `Settings` tab and check everything except for the last checkbox 1. **Examples for the following settings:** 1. If the task fails, restart every: `5 minutes` 2. Attempt restart up to: `3` times 3. Stop the task if it runs longer than `1 hour` 10. Next, once satisfied with everything, click Ok 11. Then, find your newly created task (by its name) in the scheduler task list and then manually run it (right click it and then click `Run`) 12. Finally, refresh your dashboard after a minute or two and your drive information should have populated the webapp dashboard. ================================================ FILE: docs/INSTALL_NAS.md ================================================ package docs ================================================ FILE: docs/INSTALL_PFSENSE.md ================================================ # pfsense Install This bascially follows the [Manual collector instructions](https://github.com/AnalogJ/scrutiny/blob/master/docs/INSTALL_MANUAL.md#collector) and assumes you are running a hub and spoke deployment and already have the web app setup. ### Dependencies SSH into pfsense, hit `8` for the shell and install the required dependencies. ``` pkg install smartmontools ``` Ensure smartmontools is v7+. This won't be a problem in pfsense 2.6.0+ ### Directory Structure Now let's create a directory structure to contain the Scrutiny collector binary. ``` mkdir -p /opt/scrutiny/bin ``` ### Download Files Next, we'll download the Scrutiny collector binary from the [latest Github release](https://github.com/analogj/scrutiny/releases). > NOTE: Ensure you have the latest version in the below command ``` fetch -o /opt/scrutiny/bin https://github.com/AnalogJ/scrutiny/releases/download/vX.X.X/scrutiny-collector-metrics-freebsd-amd64 ``` ### Prepare Scrutiny Now that we have downloaded the required files, let's prepare the filesystem. ``` chmod +x /opt/scrutiny/bin/scrutiny-collector-metrics-freebsd-amd64 ``` ### Start Scrutiny Collector, Populate Webapp Next, we will manually trigger the collector, to populate the Scrutiny dashboard: > NOTE: if you need to pass a config file to the scrutiny collector, you can provide it using the `--config` flag. ``` /opt/scrutiny/bin/scrutiny-collector-metrics-freebsd-amd64 run --api-endpoint "http://localhost:8080" ``` > NOTE: change the IP address to that of your web app ### Schedule Collector with Cron Finally you need to schedule the collector to run periodically. Login to the pfsense webGUI and head to `Services/Cron` add an entry with the following details: ``` Minute: */15 Hour: * Day of the Month: * Month of the Year: * Day of the Week: * User: root Command: /opt/scrutiny/bin/scrutiny-collector-metrics-freebsd-amd64 run --api-endpoint "http://localhost:8080" >/dev/null 2>&1 ``` > NOTE: `>/dev/null 2>&1` is used to stop cron confirmation emails being sent. ================================================ FILE: docs/INSTALL_ROOTLESS_PODMAN.md ================================================ # Rootless Podman Quadlet Install Note: These instructions are written with Podman 4.9 in mind, as that's what's available on Ubuntu 24.04. Podman 5+ can simplify the process using a .pod file to run both the hub and influxdb instance in the same pod, sharing localhost. This is a fairly trivial change should anyone want to add the documentation for it. While this document isn't Ubuntu-specific, this is being purposefully done to allow it to apply to the vast majority of Podman users, regardless of what Linux distro they use. ### Dependencies - Podman > 4.9 - Systemd > 250 (for quadlet support) - a restricted service account ### Creating a Service Account See [Creating a Restricted Service Account](INSTALL_MANUAL.md#creating-a-restricted-service-account) for instructions. While you do not need to use the same account as the collector, this guide will assume you will be for all its examples. In addition to those steps, you will need to create sub ids and enable lingering for the user: ```sh # add sub-uids and sub-gids, you may need to adjust numbers if you have other rootless quadlets running for other users already # it is not recommended to go below 100000 # we choose to start at 500000 in the event you have some other podman accounts sudo usermod --add-subuids 500000-565535 scrutiny-svc sudo usermod --add-subgids 500000-565535 scrutiny-svc # We want the quadlets to stay running even if the user isn't logged in sudo loginctl enable-linger scrutiny-svc ``` ### Directory Structure Once the account is created, you will need to grab its id to create a few drectories for the data files and rootless quadlet files: ```sh # create folders for config and influxdb sudo mkdir -p /opt/scrutiny-svc/scrutiny/{config,influxdb} # get the config file for scrutiny hub sudo wget -O /opt/scrutiny-svc/scrutiny/config/scrutiny.yaml https://raw.githubusercontent.com/AnalogJ/scrutiny/refs/heads/master/example.scrutiny.yaml # set permissions on everything sudo chown -R scrutiny-svc:scrutiny-svc /opt/scrutiny-svc # Get the ID of scrutiny-svc so you know it for your own record-keeping id -u scrutiny-svc # create a directory sudo mkdir -p /etc/containers/systemd/users/$(id -u scrutiny-svc) ## go into the directory you just created for the rest of the guide cd /etc/containers/systemd/users/$(id -u scrutiny-svc) ``` ### Quadlet Files Now that everything is set up and configured for the account to run quadlets, we just need to create a few quadlet files. All remaining system actions will take place in `/etc/containers/systemd/users/$(id -u scrutiny-svc)` which is why we had you cd into it. #### Networking We need the hub and influxdb instances to be able to talk to each other, and in the case of Podman 4.9, they will run separately not sharing a localhost, and as such we need to configure a network for them to share. The file is pretty simple: ##### scrutiny-net.network ```ini [Network] NetworkName=scrutiny-net ``` #### Containers Now we're ready for creating the containers ##### influxdb.container ```ini [Unit] Description=influxdb [Container] ContainerName=influxdb Image=docker.io/library/influxdb:2.8 AutoUpdate=registry Timezone=local ## not strictly necessary, but keeps file permission sane for influxdb PodmanArgs=--group-add keep-groups ## versions of podman after 5.1 should do the below instead #GroupAdd=keep-groups Volume=/opt/scrutiny-svc/scrutiny/influxdb:/var/lib/influxdb2:Z Network=scrutiny-net [Service] Restart=on-failure [Install] # Start by default on boot WantedBy=default.target ``` ##### scrutiny-web.container ```ini [Unit] Description=scrutiny-web After=influxdb.service Requires=influxdb.service [Container] ContainerName=scrutiny-web Image=ghcr.io/analogj/scrutiny:latest-web AutoUpdate=registry Timezone=local Volume=/opt/scrutiny-svc/scrutiny/config:/opt/scrutiny/config:Z Network=scrutiny-net PublishPort=8080:8080/tcp [Service] Restart=on-failure [Install] # Start by default on boot WantedBy=default.target ``` #### Update scrutiny config Since our containers are running separately, we need to update `/opt/scrutiny-svc/scrutiny/config/scrutiny.yaml` to the new influxdb host: 1. edit `/opt/scrutiny-svc/scrutiny/config/scrutiny.yaml` 2. under `influxdb` section, change `host: 0.0.0.0` to `host: influxdb` -- remember that yaml is whitespace-sensitive! so be mindful of the indents ```yaml influxdb: # scheme: 'http' host: influxdb port: 8086 ``` # Running the hub and doing the With that done, we're now ready to start up the services: ```sh # reload all the systemd user files for scrutiny-svc sudo systemctl --user -M scrutiny-svc@ daemon-reload # start the scrutiny-net network: sudo systemctl --user -M scrutiny-svc@ start scrutiny-net-network.service # start influxdb first and wait for it to come up sudo systemctl --user -M scrutiny-svc@ start influxdb.service # check if it's fully up sudo systemctl --user -M scrutiny-svc@ status influxdb.service # now start scrutiny sudo systemctl --user -M scrutiny-svc@ start scrutiny-web.service ``` You are now ready to run the collector, if you would like to run that rootless as well, see the guide at [Schedule Collector with Systemd (rootless)](INSTALL_MANUAL.md#schedule-collector-with-systemd-rootless) ================================================ FILE: docs/INSTALL_SYNOLOGY_COLLECTOR.md ================================================ # Install collector on Synology ## Install Entware This will allow you to install a newer version of smartmontools on your Synology. Follow the instructions here (This is tested on DSM7) - https://github.com/Entware/Entware/wiki/Install-on-Synology-NAS **PLEASE NOTE THAT IF YOU UPDATE DSM FIRMWARE YOU MAY BORK THE EXISTING ENTWARE INSTALLATION, FOR ANYTHING THAT MAY RELATE TO ENTWARE PLEASE VISIT THEIR REPO** ## Collector Setup **1. Run an update** `sudo opkg update` **2. Run an upgrade** `sudo opkg upgrade` **3. Install smartmontools** `sudo opkg install smartmontools` *It should install v7.2-2* `Installing smartmontools (7.2-2) to root...` **4. We will now create the directories.** ``` mkdir -p /volume1/\@Entware/scrutiny/bin mkdir -p /volume1/\@Entware/scrutiny/conf ``` **5. change into the bin directory** `cd /volume1/\@Entware/scrutiny/bin` **6. Download the collector binary for your architecture and make it executable** `wget https://github.com/AnalogJ/scrutiny/releases/download/v0.4.12/scrutiny-collector-metrics-linux-arm64` `chmod +x /volume1/\@Entware/scrutiny/bin/scrutiny-collector-metrics-linux-arm64` **7. Create a config file for the collector** ``` cd /volume1/\@Entware/scrutiny/conf wget https://raw.githubusercontent.com/AnalogJ/scrutiny/master/example.collector.yaml mv example.collector.yaml collector.yaml ``` **8. Lets make some changes in the [collector config file](../example.collector.yaml), these are what i uncommented/added, please tweak the device paths to your needs** ``` host: id: 'Server_Name' devices: # # example for forcing device type detection for a single disk - device: /dev/sda type: 'sat' - device: /dev/sdb type: 'sat' - device: /dev/sdc type: 'sat' - device: /dev/sdd type: 'sat' api: endpoint: 'http://:8080' ``` **9. Let's update the smartd db** ``` cd /volume1/\@Entware/scrutiny/bin/ wget https://raw.githubusercontent.com/smartmontools/smartmontools/master/smartmontools/drivedb.h ``` **10. I ran it like this but you can tweak to your liking, the most important part is the --drivedb, as this loads it into the aplication for future use** `smartctl -d sat --all /dev/sda --drivedb=/volume1/\@Entware/scrutiny/bin/drivedb.h` **11. Now lets create a small bash script, this will be used for the scheduled task inside Synology** `vim /volume1/\@Entware/scrutiny/bin/run_collect.sh` **The contents are below, copy and paste them in** ``` #!/bin/bash /volume1/\@Entware/scrutiny/bin/scrutiny-collector-metrics-linux-arm64 run --config /volume1/\@Entware/scrutiny/conf/collector.yaml ``` **Make `run_collect.sh` executable** `chmod +x /volume1/\@Entware/scrutiny/bin/run_collect.sh` ## Set up Synology to run a scheduled task. Log in to DSM and do the following: Goto: DSM > Control Panel > Task Scheduler Create > Scheduled Task > User Defined Script ###### General ``` Task: Scrutiny_Collector User: root Enabled: yes ``` ###### Schedule ``` Run on the following days: Daily ``` ###### Time: ``` Frequency: ``` ###### Task Settings **Run Command** ``` . /opt/etc/profile; /volume1/\@Entware/scrutiny/bin/run_collect.sh ``` ## Troubleshooting If you have any issues with your devices being detected, or incorrect data, please take a look at [TROUBLESHOOTING_DEVICE_COLLECTOR.md](./TROUBLESHOOTING_DEVICE_COLLECTOR.md) ================================================ FILE: docs/INSTALL_UNRAID.md ================================================ # UnRAID Install Installation of Scrutiny in UnRAID follows the same process as installing any other docker container, utilizing the Community Applications plugin ## Install the 'Community Applications' Plugin All docker containers in UnRAID are typically installed utilizing the Community Applications plugin. To get started: - Navigate to the plugins tab ( /Plugins ) - Select the 'Install Plugin' tab, and enter the following address into the input field ``` https://raw.githubusercontent.com/Squidly271/community.applications/master/plugins/community.applications.plg ``` You're all set with the pre-requisites! ## Installing the Scrutiny docker image To install, simply click 'Install'; the configuration parameters should not need modification as the template within CA already defines the necessary parameters. As a docker image can be created using various OS bases, the image choice is entirely the users choice. Recommendations of a specific image from a specific maintainer is beyond the scope of this guide. However, to provide some context given the number of questions posed regarding the various versions available: - **ghcr.io/analogj/scrutiny:master-omnibus** - `Image maintained directly by the application author` - `Debian based docker image` - **linuxserver/scrutiny** - `Image maintained by the LinuxServer.io group` - `Alpine based docker image` - **hotio/scrutiny** - `Image maintained by hotio` - `DETAILS TBD` The support for a given image is provided by that images maintainers, while support for the application itself remains with the developer - i.e. LinuxServer.io supports the docker image of Scrutiny which they create, to the extent an issue is specific to that image. If an issue/enhancement pertains directly to the source code, support would still come directly from this repository's contributors. ================================================ FILE: docs/SUPPORTED_NAS_OS.md ================================================ # Officially Supported NAS/OS's These are the officially supported NAS OS's (with documentation and setup guides). Once a guide is created ( in `docs/guides/` or elsewhere) it will be linked here. - [x] [freenas/truenas](https://blog.stefandroid.com/2022/01/14/smart-scrutiny.html) - [x] [unraid](./INSTALL_UNRAID.md) - [ ] ESXI - [ ] Proxmox - [x] Synology - [Hub/Spoke Deployment - Collector](./INSTALL_SYNOLOGY_COLLECTOR.md) - [Omnibus Deployment](https://drfrankenstein.co.uk/2022/07/28/scrutiny-in-docker-on-a-synology-nas) - Docker Package - [Omnibus Deployment](https://drfrankenstein.co.uk/scrutiny-in-container-manager-on-a-synology-nas/) - Container Manager Package - [ ] OMV - [ ] Amahi - [ ] Running in a LXC container - [x] [PFSense](./INSTALL_PFSENSE.md) - [x] QNAP - [x] [RockStor](https://rockstor.com/docs/interface/docker-based-rock-ons/scrutiny.html) - [ ] Solaris/OmniOS CE Support - [ ] Kubernetes - [x] [Windows](./INSTALL_MANUAL_WINDOWS.md) ================================================ FILE: docs/TESTERS.md ================================================ # Testers Scrutiny supports many operating systems, CPU architectures and runtime environments. Unfortunately that makes it incredibly difficult to test. Thankfully the following users have been gracious enough to test/validate Scrutiny works on their system. > NOTE: If you're interested in volunteering to test Scrutiny beta builds on your system, please [open an issue](https://github.com/AnalogJ/scrutiny/issues). | Architecture Name | Binaries | Docker | | --- | --- | --- | | linux-amd64 | @TizzAmmazz | @feroxy @rshxyz | | linux-arm-5 | -- | | | linux-arm-6 | -- | | | linux-arm-7 | @Zorlin | @martini1992 | | linux-arm64 | @SiM22 @Zorlin | @ViRb3 @agneevX @benamajin | | freebsd-amd64 | @BadCo-NZ @varunsridharan @martadinata666 @KenwoodFox @FingerlessGlov3s | | | macos-amd64 | -- | -- | | macos-arm64 | -- | -- | | windows-amd64 | @gabrielv33 | -- | | windows-arm64 | -- | -- | ================================================ FILE: docs/TROUBLESHOOTING_DEVICE_COLLECTOR.md ================================================ # Scrutiny <-> SmartMonTools Scrutiny uses `smartctl --scan` to detect devices/drives. If your devices are not being detected by Scrutiny, or some data is missing, this is probably due to a `smartctl` issue. The following page will document commonly asked questions and troubleshooting steps for the Scrutiny S.M.A.R.T. data collector. ## WWN vs Device name As discussed in [`#117`](https://github.com/AnalogJ/scrutiny/issues/117), `/dev/sd*` device paths are ephemeral. > Device paths in Linux aren't guaranteed to be consistent across restarts. Device names consist of major numbers (letters) and minor numbers. When the Linux storage device driver detects a new device, the driver assigns major and minor numbers from the available range to the device. When a device is removed, the device numbers are freed for reuse. > > The problem occurs because device scanning in Linux is scheduled by the SCSI subsystem to happen asynchronously. As a result, a device path name can vary across restarts. > > https://docs.microsoft.com/en-us/troubleshoot/azure/virtual-machines/troubleshoot-device-names-problems While the Docker Scrutiny collector does require devices to attached to the docker container by device name (using `--device=/dev/sd..`), internally Scrutiny stores and references the devices by their `WWN` which is globally unique, and never changes. As such, passing devices to the Scrutiny collector container using `/dev/disk/by-id/`, `/dev/disk/by-label/`, `/dev/disk/by-path/` and `/dev/disk/by-uuid/` paths are unnecessary, unless you'd like to ensure the docker run command never needs to change. #### Force /dev/disk/by-id paths Since Scrutiny uses WWN under the hood, it really doesn't care about `/dev/sd*` vs `/dev/disk/by-id/`. The problem is the interaction between docker and smartmontools when using `--device /dev/disk/by-id` paths. Basically Scrutiny offloads all device detection to smartmontools, which doesn't seem to detect devices that have been passed into the docker container using `/dev/disk/by-id` paths. If you must use "static" device references, you can map the host device id/uuid/wwn references to device names within the container: ``` # --device=: docker run .... --device=/dev/disk/by-id/wwn-0x5000xxxxx:/dev/sda --device=/dev/disk/by-id/wwn-0x5001xxxxx:/dev/sdb --device=/dev/disk/by-id/wwn-0x5003xxxxx:/dev/sdc ... ``` ## Device Detection By Smartctl The first thing you'll want to do is run `smartctl` locally (not in Docker) and make sure the output shows all your drives as expected. See the `Drive Types` section below for what this output should look like for `NVMe`/`ATA`/`RAID` drives. ```bash smartctl --scan /dev/sda -d scsi # /dev/sda, SCSI device /dev/sdb -d scsi # /dev/sdb, SCSI device /dev/sdc -d scsi # /dev/sdc, SCSI device /dev/sdd -d scsi # /dev/sdd, SCSI device ``` Once you've verified that `smartctl` correctly detects your drives, make sure scrutiny is correctly detecting them as well. > NOTE: make sure you specify all the devices you'd like scrutiny to process using `--device=` flags. ```bash docker run -it --rm \ -v /run/udev:/run/udev:ro \ --cap-add SYS_RAWIO \ --device=/dev/sda \ --device=/dev/sdb \ ghcr.io/analogj/scrutiny:master-collector smartctl --scan ``` If the output is the same, your devices will be processed by Scrutiny. ### Collector Config File In some cases `--scan` does not correctly detect the device type, returning [incomplete SMART data](https://github.com/AnalogJ/scrutiny/issues/45). Scrutiny will supports overriding the detected device type via the config file. [example.collector.yaml](https://github.com/AnalogJ/scrutiny/blob/master/example.collector.yaml) ### RAID Controllers (Megaraid/3ware/HBA/Adaptec/HPE/etc) Smartctl has support for a large number of [RAID controllers](https://www.smartmontools.org/wiki/Supported_RAID-Controllers), however this support is not automatic, and may require some additional device type hinting. You can provide this information to the Scrutiny collector using a collector config file. See [example.collector.yaml](/example.collector.yaml) > NOTE: If you use docker, you **must** pass though the RAID virtual disk to the container using `--device` (see below) > > This device may be in `/dev/*` or `/dev/bus/*`. > If you do not see a virtual device file `/dev/bus/*` you may need to use the `--privileged` flag. See [#366 for more info](https://github.com/AnalogJ/scrutiny/issues/366#issuecomment-1253196407) > > If you're unsure, run `smartctl --scan` on your host, and pass all listed devices to the container. ```yaml # /opt/scrutiny/config/collector.yaml devices: # Dell PERC/Broadcom Megaraid example: https://github.com/AnalogJ/scrutiny/issues/30 - device: /dev/bus/0 type: - megaraid,14 - megaraid,15 - megaraid,18 - megaraid,19 - megaraid,20 - megaraid,21 - device: /dev/twa0 type: - 3ware,0 - 3ware,1 - 3ware,2 - 3ware,3 - 3ware,4 - 3ware,5 # Adapec RAID: https://github.com/AnalogJ/scrutiny/issues/189 - device: /dev/sdb type: - aacraid,0,0,0 - aacraid,0,0,1 # HPE Smart Array example: https://github.com/AnalogJ/scrutiny/issues/213 - device: /dev/sda type: - 'cciss,0' - 'cciss,1' ``` > ### NVMe Drives As mentioned in the [README.md](/README.md), NVMe devices require both `--cap-add SYS_RAWIO` and `--cap-add SYS_ADMIN` to allow smartctl permission to query your NVMe device SMART data [#26](https://github.com/AnalogJ/scrutiny/issues/26) When attaching NVMe devices using `--device=/dev/nvme..`, make sure to provide the device controller (`/dev/nvme0`) instead of the block device (`/dev/nvme0n1`). See [#209](https://github.com/AnalogJ/scrutiny/issues/209). > The character device /dev/nvme0 is the NVME device controller, and block devices like /dev/nvme0n1 are the NVME storage namespaces: the devices you use for actual storage, which will behave essentially as disks. > > In enterprise-grade hardware, there might be support for several namespaces, thin provisioning within namespaces and other features. For now, you could think namespaces as sort of meta-partitions with extra features for enterprise use. ### ATA ### USB Devices The following information is extracted from [#266](https://github.com/AnalogJ/scrutiny/issues/266) External HDDs support two modes of operation usb-storage (old, slower, stable) and uas (new, faster, sometimes unstable) . On some external HDDs, uas mode does not properly pass through SMART information, or even causes hardware issues, so it has been disabled by the kernel. No amount of smartctl parameters will fix this, as it is being rejected by the kernel. This is especially true with Seagate HDDs. One solution is to force these devices into usb-storage mode, which will incur some performance penalty, but may work well enough for you. More info: - https://smartmontools.org/wiki/Supported_USB-Devices - https://smartmontools.org/wiki/SAT-with-UAS-Linux - https://forums.raspberrypi.com/viewtopic.php?t=245931 ### Exit Codes If you see an error message similar to `smartctl returned an error code (2) while processing /dev/sda`, this means that `smartctl` (not Scrutiny) exited with an error code. Scrutiny will attempt to print a helpful error message to help you debug, but you can look at the table (and associated links) below to debug `smartctl`. > smartctl Return Values > The return values of smartctl are defined by a bitmask. If all is well with the disk, the return value (exit status) of > smartctl is 0 (all bits turned off). If a problem occurs, or an error, potential error, or fault is detected, then > a non-zero status is returned. In this case, the eight different bits in the return value have the following meanings > for ATA disks; some of these values may also be returned for SCSI disks. > > source: http://www.linuxguide.it/command_line/linux-manpage/do.php?file=smartctl#sect7 | Exit Code (Isolated) | Binary | Problem Message | | --- | --- | --- | | 1 | Bit 0 | Command line did not parse. | | 2 | Bit 1 | Device open failed, or device did not return an IDENTIFY DEVICE structure. | | 4 | Bit 2 | Some SMART command to the disk failed, or there was a checksum error in a SMART data structure (see В´-bВ´ option above). | | 8 | Bit 3 | SMART status check returned “DISK FAILING". | | 16 | Bit 4 | We found prefail Attributes <= threshold. | | 32 | Bit 5 | SMART status check returned “DISK OK” but we found that some (usage or prefail) Attributes have been <= threshold at some time in the past. | | 64 | Bit 6 | The device error log contains records of errors. | | 128 | Bit 7 | The device self-test log contains records of errors. | #### Standby/Sleeping Disks Disks in Standby/Sleep can also cause `smartctl` to exit abnormally, usually with `exit code: 2`. - https://github.com/AnalogJ/scrutiny/issues/221 - https://github.com/AnalogJ/scrutiny/issues/157 ### Volume Mount All Devices (`/dev`) - Privileged > WARNING: This is an insecure/dangerous workaround. Running Scrutiny (or any Docker image) with `--privileged` is equivalent to running it with root access. If you have exhausted all other mechanisms to get your disks working with `smartctl` running within a container, you can try running the docker image with the following additional flags: - `--privileged` (instead of `--cap-add`) - this gives the docker container full access to your system. Scrutiny does not require this permission, however it can be helpful for `smartctl` - `-v /dev:/dev:ro` (instead of `--device`) - this mounts the `/dev` folder (containing all your device files) into the container, allowing `smartctl` to see your disks, exactly as if it were running on your host directly. With this workaround your `docker run` command would look similar to the following: ```bash docker run -it --rm -p 8080:8080 -p 8086:8086 \ -v `pwd`/scrutiny:/opt/scrutiny/config \ -v `pwd`/influxdb2:/opt/scrutiny/influxdb \ -v /run/udev:/run/udev:ro \ --privileged \ -v /dev:/dev \ --name scrutiny \ ghcr.io/analogj/scrutiny:master-omnibus ``` ## Scrutiny detects Failure but SMART Passed? There's 2 different mechanisms that Scrutiny uses to detect failures. The first is simple SMART failures. If SMART thinks an attribute is in a failed state, Scrutiny will display it as failed as well. The second is using BackBlaze failure data: [https://backblaze.com/blog-smart-stats-2014-8.html](https://backblaze.com/blog-smart-stats-2014-8.html) If Scrutiny detects that an attribute corresponds with a high rate of failure using BackBlaze's data, it will also mark that attribute (and disk) as failed (even though SMART may think the device is still healthy). This can cause some confusion when comparing Scrutiny's dashboard against other SMART analysis tools. If you hover over the "failed" label beside an attribute, Scrutiny will tell you if the failure was due to SMART or Scrutiny/BackBlaze data. ### Device failed but Smart & Scrutiny passed Device SMART results are the source of truth for Scrutiny, however we don't just take into account the current SMART results, but also historical analysis of a disk. This means that if a device is marked as failed at any point in its history, it will continue to be stored in the database as failed until the device is removed (or status is reset -- see below). In some cases, this historical failure may have been due to attribute analysis/thresholds that have since been relaxed: - NVME - Numb Error Log Entries (v0.4.7) - ATA - Power Cycle Count (v0.4.7) - ATA - Read Error Rate (v0.4.13) - ATA - Seek Error Rate (v0.4.13) If you'd like to reset the status of a disk (to healthy) and allow the next run of the collector to determine the actual status, you can run the following command: ```bash # connect to scrutiny docker container docker exec -it scrutiny bash # install sqlite CLI tools (inside container) apt update && apt install -y sqlite3 # connect to the scrutiny database sqlite3 /opt/scrutiny/config/scrutiny.db # reset/update the devices table, unset the failure status. UPDATE devices SET device_status = null; # exit sqlite CLI .exit ``` ### Seagate Drives Failing As thoroughly discussed in [#255](https://github.com/AnalogJ/scrutiny/issues/255) and [#522](https://github.com/AnalogJ/scrutiny/issues/522), Seagate (Ironwolf & others) drives are almost always marked as failed by Scrutiny. #### Seek Error Rate & Read Error Rate (#255) > The `Seek Error Rate` & `Read Error Rate` attribute raw values are typically very high, and the > normalised values (Current / Worst / Threshold) are usually quite low. Despite this, the numbers in most cases are perfectly OK > > The anxiety arises because we intuitively expect that the normalised values should reflect a "health" score, with > 100 being the ideal value. Similarly, we would expect that the raw values should reflect an error count, in > which case a value of 0 would be most desirable. However, Seagate calculates and applies these attribute values > in a counterintuitive way. > > http://www.users.on.net/~fzabkar/HDD/Seagate_SER_RRER_HEC.html Some analysis has been done which shows that Seagate drives break the common SMART conventions, which also causes Scrutiny's comparison against BackBlaze data to detect these drives as failed. **So what's the Solution?** After taking a look at the BackBlaze data for the relevant Attributes (`Seek Error Rate` & `Read Error Rate`), I've decided to disable Scrutiny analysis for them. Both are non-critical, and have low-correlation with failure. > Please note: SMART failures for these attributes will still cause the drive to be marked as failed. Only BackBlaze analysis has been disabled If this is effecting your drives, you'll need to do the following: 1. Upgrade to v0.4.13+ 2. Reset your drive status using the SQLite script in [#device-failed-but-smart--scrutiny-passed](https://github.com/AnalogJ/scrutiny/blob/master/docs/TROUBLESHOOTING_DEVICE_COLLECTOR.md#device-failed-but-smart--scrutiny-passed) 3. Wait for (or manually start) the collector. If you'd like to learn more about how the Seagate Ironwolf SMART attributes work under the hood, and how they differ from other drives, please read the following: - http://www.users.on.net/~fzabkar/HDD/Seagate_SER_RRER_HEC.html - https://www.truenas.com/community/threads/seagate-ironwolf-smart-test-raw_read_error_rate-seek_error_rate.68634/ #### Seagate Raw Values are incorrect (#522) Basically Seagate drives are known to use a custom data format for a number of their SMART attributes. This causes issues with Scrutiny's threshold analysis. - The workaround is to customize the smartctl command that Scrutiny uses for your drive by [creating a collector.yaml file](https://github.com/AnalogJ/scrutiny/issues/522#issuecomment-1766727988) and "fixing" each attribute - The **real "fix"** is to make sure your Seagate drive is correctly supported by smartmontools. See this [PR](https://github.com/smartmontools/smartmontools/pull/247) Sorry for the bad news, but this is a known issue and there's just not much we can do on the Scrutiny side. ## Hub & Spoke model, with multiple Hosts. ![multiple-host-ids image](multiple-host-ids.png) When deploying Scrutiny in a hub & spoke model, it can be difficult to determine exactly which node a set of devices are associated with. Thankfully the collector has a special `--host-id` flag (or `COLLECTOR_HOST_ID` env variable) that can be used to associate devices with a friendly host name. The host-id is passed from the collector to the web-api when SMART device data is uploaded. There's 3 ways you can set the host-id: - using the collector config file: [master/example.collector.yaml#L19-L22](https://github.com/AnalogJ/scrutiny/blob/master/example.collector.yaml?rgh-link-date=2022-05-25T15%3A08%3A56Z#L19-L22) - using the `--host-id` collector CLI argument: [master/collector/cmd/collector-metrics/collector-metrics.go#L180-L185](https://github.com/AnalogJ/scrutiny/blob/master/collector/cmd/collector-metrics/collector-metrics.go?rgh-link-date=2022-05-25T15%3A08%3A56Z#L180-L185) - using the `COLLECTOR_HOST_ID` environmental variable. See the [docs/INSTALL_HUB_SPOKE.md](/docs/INSTALL_HUB_SPOKE.md) guide for more information. ## Collector DEBUG mode You can use environmental variables to enable debug logging and/or log files for the collector: ```bash DEBUG=true COLLECTOR_LOG_FILE=/tmp/collector.log ``` Or if you're not using docker, you can pass CLI arguments to the collector during startup: ```bash scrutiny-collector-metrics run --debug --log-file /tmp/collector.log ``` ## Collector trigger on startup When the `omnibus` docker image starts up, it will automatically trigger the collector, which will populate the Scrutiny Webui with your disks. This is not the case when running the collector docker image in **hub/spoke** mode, as the collector and webui are running in different containers (and potentially different host machines), so the web container may not be ready for incoming connections. By default the container will only run the collector at the time specified in the cron schedule. You can force the collector to run on startup using the following env variables: - `-e COLLECTOR_RUN_STARTUP=true` - forces the collector to run on startup (cron will be started after the collector completes) - `-e COLLECTOR_RUN_STARTUP_SLEEP=10` - if `COLLECTOR_RUN_STARTUP` is enabled, you can use this env variable to configure the delay before the collector is run (default: `1` second). Used to ensure the web container has started successfully. ================================================ FILE: docs/TROUBLESHOOTING_DOCKER.md ================================================ # Docker Images `latest` vs `nightly` > TL;DR; The `latest-omnibus`, `latest-collector`, and `latest-web` tags point to the most recent release. (`latest` points to `latest-omnibus`) > The `nightly-omnibus`, `nightly-collector`, and `nightly-web` tags point to builds that are generated every night from the latest commit on the `master` branch. The CD scripts used to orchestrate the docker image builds can be found here: * https://github.com/AnalogJ/scrutiny/blob/master/.github/workflows/docker-build.yaml * https://github.com/AnalogJ/scrutiny/blob/master/.github/workflows/docker-nightly.yaml In general scrutiny follows a feature branch development process, which means that the `master` branch should ideally always be free of bugs This is driven by the requirement that every PR be reviewed and pass all tests. Unfortunately, bugs do make it through, especially because of the enormous number of hard drives that scrutiny must support.. This means that while the nightly builds should have the latest features and bug fixes, there may be things that sneak through. Unless you need a particular feature or bug fix, we recommend sticking to releases. Also note that using `latest` tags is generally considered a bad practice; pin a specific version instead. # Running Docker `rootless` To avoid that the container(s) restart when you installed Docker as `rootless` you need to isssue the following commands to allow the session to stay alive even after you close your (SSH) sesssion: `sudo loginctl enable-linger $(whoami)` `systemctl --user enable docker` ================================================ FILE: docs/TROUBLESHOOTING_INFLUXDB.md ================================================ # InfluxDB Troubleshooting ## Why?? Scrutiny has many features, but the relevant one to this conversation is the "S.M.A.R.T metric tracking for historical trends". Basically Scrutiny not only shows you the current SMART values, but how they've changed over weeks, months (or even years). To efficiently handle that data at scale (and to make my life easier as a developer) I decided to add InfluxDB as a dependency. It's a dedicated timeseries database, as opposed to the general purpose sqlite DB I used before. I also did a bunch of testing and analysis before I made the change. With InfluxDB the memory footprint for Scrutiny (at idle) is ~ 100mb, which is still fairly reasonable. ### Data Size It's surprisingly easy to reach extremely large database sizes, if you don't use downsampling, or you downsample incorrectly. The growth rate is pretty unintuitive -- see https://github.com/AnalogJ/scrutiny/issues/650#issuecomment-2365174940 > Fasten stores the SMART metrics in a timeseries database (InfluxDB), and automatically downsamples the data on a schedule. > > The expectation was that cron would run daily, and there would be: > > - 7 daily data points > - 3 weekly data points > - 11 monthly data points > - and infinite yearly data points. > > These data points would be for each SMART metric, for each device. > eg. in one year, (7+3+11)*80ish SMART attributes = 1680 datapoints for one device > > If you're running cron every 15 minutes, your browser will instead be attempting to display: > > - 96*7 daily data points > - 3 weekly > - 11 monthly > > so (96*7 + 3 + 11)*80 = 54,880 datapoints for each device 😭 ## Installation InfluxDB is a required dependency for Scrutiny v0.4.0+. https://docs.influxdata.com/influxdb/v2/install/ ## Persistence To ensure that all data is correctly stored, you must also persist the InfluxDB database directory - If you're using the Official Scrutiny Omnibus image (`ghcr.io/analogj/scrutiny:master-omnibus`), the path is `/opt/scrutiny/influxdb` - If you're deploying in Hub/Spoke mode with the InfluxDB maintained image (`influxdb:2.8`), the path is `/var/lib/influxdb2` If you attempt to restart Scrutiny but you forgot to persist the InfluxDB directory, you will get an error message like follows: ``` scrutiny | time="2022-05-12T22:54:12Z" level=info msg="Trying to connect to scrutiny sqlite db: /opt/scrutiny/config/scrutiny.db\n" scrutiny | time="2022-05-12T22:54:12Z" level=info msg="Successfully connected to scrutiny sqlite db: /opt/scrutiny/config/scrutiny.db\n" scrutiny | ts=2022-05-12T22:54:12.240791Z lvl=info msg=Unauthorized log_id=0aQcVlOW000 error="authorization not found" scrutiny | panic: unauthorized: unauthorized access ``` Unfortunately this may mean that your database is lost, and the previous Scrutiny data is unavailable. You should fix the docker-compose/docker run command that you're using to ensure that your database folder is persisted correctly, then delete the `web.influxdb.token` field in your `scrutiny.yaml` file, and then restart Scrutiny. ## First Start The web/api service will trigger an InfluxDB onboarding process automatically when it first starts. After that, it will store the newly generated influxdb api token in the Scrutiny config file. If this Credential is not correctly stored in the scrutiny config file, Scrutiny will fail to start (with an authentication error) ``` scrutiny | time="2022-05-12T22:52:55Z" level=info msg="Successfully connected to scrutiny sqlite db: /opt/scrutiny/config/scrutiny.db\n" scrutiny | ts=2022-05-12T22:52:55.235753Z lvl=error msg="failed to onboard user admin" log_id=0aQcRnc0000 handler=onboard error="onboarding has already been completed" took=0.038ms scrutiny | ts=2022-05-12T22:52:55.235816Z lvl=error msg="api error encountered" log_id=0aQcRnc0000 error="onboarding has already been completed" scrutiny | panic: conflict: onboarding has already been completed ``` You can fix this issue by authenticating to the InfluxDB admin portal (the default credentials are username: `admin`, password: `password12345`), then retrieving the API token, and writing it to your `scrutiny.yaml` config file under the `web.influxdb.token` field: ![influx db admin token](./influxdb-admin-token.png) ## Upgrading from v0.3.x to v0.4.x When upgrading from v0.3.x to v0.4.x, some users have noticed problems such as: ``` 2022/05/13 14:38:05 Loading configuration file: /opt/scrutiny/config/scrutiny.yaml time="2022-05-13T14:38:05Z" level=info msg="Trying to connect to scrutiny sqlite db:" time="2022-05-13T14:38:05Z" level=info msg="Successfully connected to scrutiny sqlite db:" panic: a username and password is required for a setup ``` or ``` Start the scrutiny server time="2022-06-11T10:35:04-04:00" level=info msg="Trying to connect to scrutiny sqlite db: \n" time="2022-06-11T10:35:04-04:00" level=info msg="Successfully connected to scrutiny sqlite db: \n" panic: failed to check influxdb setup status - parse "://:": missing protocol scheme ``` As discussed in [#248](https://github.com/AnalogJ/scrutiny/issues/248) and [#234](https://github.com/AnalogJ/scrutiny/issues/234), this usually related to either: - Upgrading from the LSIO Scrutiny image to the Official Scrutiny image, without removing LSIO specific environmental variables - remove the `SCRUTINY_WEB=true` and `SCRUTINY_COLLECTOR=true` environmental variables. They were used by the LSIO image, but are unnecessary and cause issues with the official Scrutiny image. - Change your volume mappings to `/opt/scrutiny` from `/scrutiny` - Updated versions of the [LSIO Scrutiny images are broken](https://github.com/linuxserver/docker-scrutiny/issues/22), as they have not installed InfluxDB which is a required dependency of Scrutiny v0.4.x - You can revert to an earlier version of the LSIO image (`lscr.io/linuxserver/scrutiny:060ac7b8-ls34`), or just change to the official Scrutiny image (`ghcr.io/analogj/scrutiny:master-omnibus`) Here's a couple of confirmed working docker-compose files that you may want to look at: - https://github.com/AnalogJ/scrutiny/blob/master/docker/example.hubspoke.docker-compose.yml - https://github.com/AnalogJ/scrutiny/blob/master/docker/example.omnibus.docker-compose.yml ## Bring your own InfluxDB > WARNING: Most users should not follow these steps. This is ONLY for users who have an EXISTING InfluxDB installation which contains data from multiple services. > The Scrutiny Docker omnibus image includes an empty InfluxDB instance which it can configure. > If you're deploying manually or via Hub/Spoke, you can just follow the installation instructions, Scrutiny knows how > to run the first-time setup automatically. The goal here is to create an InfluxDB API key with minimal permissions for use by Scrutiny. - Create Scrutiny buckets (`metrics`, `metrics_weekly`, `metrics_monthly`, `metrics_yearly`) with placeholder config - Create Downsampling tasks (`tsk-weekly-aggr`, `tsk-monthly-aggr`, `tsk-yearly-aggr`) with placeholder script. - Create API token with restricted scope - NOTE: Placeholder bucket & task configuration will be replaced automatically by Scrutiny during startup The placeholder buckets and tasks need to be created before the API token can be created, as the resource ID's need to exist for the scope restriction to work. Scopes: - `orgs`: read - required for scrutiny to find it's configured org_id - `tasks`: scrutiny specific read/write access - Scrutiny only needs access to the downsampling tasks you created above - `buckets`: scrutiny specific read/write access - Scrutiny only needs access to the buckets you created above ### Setup Environmental Variables ```bash # replace the following values with correct values for your InfluxDB installation export INFLUXDB_ADMIN_TOKEN=pCqRq7xxxxxx-FZgNLfstIs0w== export INFLUXDB_ORG_ID=b2495xxxxx export INFLUXDB_HOSTNAME=http://localhost:8086 # if you want to change the bucket name prefix below, you'll also need to update the setting in the scrutiny.yaml config file. export INFLUXDB_SCRUTINY_BUCKET_BASENAME=metrics ``` ### Create placeholder buckets
Click to expand! ```bash curl -sS -X POST ${INFLUXDB_HOSTNAME}/api/v2/buckets \ -H "Content-Type: application/json" \ -H "Authorization: Token ${INFLUXDB_ADMIN_TOKEN}" \ --data-binary @- << EOF { "name": "${INFLUXDB_SCRUTINY_BUCKET_BASENAME}", "orgID": "${INFLUXDB_ORG_ID}", "retentionRules": [] } EOF curl -sS -X POST ${INFLUXDB_HOSTNAME}/api/v2/buckets \ -H "Content-Type: application/json" \ -H "Authorization: Token ${INFLUXDB_ADMIN_TOKEN}" \ --data-binary @- << EOF { "name": "${INFLUXDB_SCRUTINY_BUCKET_BASENAME}_weekly", "orgID": "${INFLUXDB_ORG_ID}", "retentionRules": [] } EOF curl -sS -X POST ${INFLUXDB_HOSTNAME}/api/v2/buckets \ -H "Content-Type: application/json" \ -H "Authorization: Token ${INFLUXDB_ADMIN_TOKEN}" \ --data-binary @- << EOF { "name": "${INFLUXDB_SCRUTINY_BUCKET_BASENAME}_monthly", "orgID": "${INFLUXDB_ORG_ID}", "retentionRules": [] } EOF curl -sS -X POST ${INFLUXDB_HOSTNAME}/api/v2/buckets \ -H "Content-Type: application/json" \ -H "Authorization: Token ${INFLUXDB_ADMIN_TOKEN}" \ --data-binary @- << EOF { "name": "${INFLUXDB_SCRUTINY_BUCKET_BASENAME}_yearly", "orgID": "${INFLUXDB_ORG_ID}", "retentionRules": [] } EOF ```
### Create placeholder tasks
Click to expand! ```bash curl -sS -X POST ${INFLUXDB_HOSTNAME}/api/v2/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Token ${INFLUXDB_ADMIN_TOKEN}" \ --data-binary @- << EOF { "orgID": "${INFLUXDB_ORG_ID}", "flux": "option task = {name: \"tsk-weekly-aggr\", every: 1y} \nyield now()" } EOF curl -sS -X POST ${INFLUXDB_HOSTNAME}/api/v2/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Token ${INFLUXDB_ADMIN_TOKEN}" \ --data-binary @- << EOF { "orgID": "${INFLUXDB_ORG_ID}", "flux": "option task = {name: \"tsk-monthly-aggr\", every: 1y} \nyield now()" } EOF curl -sS -X POST ${INFLUXDB_HOSTNAME}/api/v2/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Token ${INFLUXDB_ADMIN_TOKEN}" \ --data-binary @- << EOF { "orgID": "${INFLUXDB_ORG_ID}", "flux": "option task = {name: \"tsk-yearly-aggr\", every: 1y} \nyield now()" } EOF ```
### Create InfluxDB API Token
Click to expand! ```bash # replace these values with placeholder bucket and task ids from your InfluxDB installation. export INFLUXDB_SCRUTINY_BASE_BUCKET_ID=1e0709xxxx export INFLUXDB_SCRUTINY_WEEKLY_BUCKET_ID=1af03dexxxxx export INFLUXDB_SCRUTINY_MONTHLY_BUCKET_ID=b3c59c7xxxxx export INFLUXDB_SCRUTINY_YEARLY_BUCKET_ID=f381d8cxxxxx export INFLUXDB_SCRUTINY_WEEKLY_TASK_ID=09a64ecxxxxx export INFLUXDB_SCRUTINY_MONTHLY_TASK_ID=09a64xxxxx export INFLUXDB_SCRUTINY_YEARLY_TASK_ID=09a64ecxxxxx curl -sS -X POST ${INFLUXDB_HOSTNAME}/api/v2/authorizations \ -H "Content-Type: application/json" \ -H "Authorization: Token ${INFLUXDB_ADMIN_TOKEN}" \ --data-binary @- << EOF { "description": "scrutiny - restricted scope token", "orgID": "${INFLUXDB_ORG_ID}", "permissions": [ { "action": "read", "resource": { "type": "orgs" } }, { "action": "read", "resource": { "type": "tasks" } }, { "action": "write", "resource": { "type": "tasks", "id": "${INFLUXDB_SCRUTINY_WEEKLY_TASK_ID}", "orgID": "${INFLUXDB_ORG_ID}" } }, { "action": "write", "resource": { "type": "tasks", "id": "${INFLUXDB_SCRUTINY_MONTHLY_TASK_ID}", "orgID": "${INFLUXDB_ORG_ID}" } }, { "action": "write", "resource": { "type": "tasks", "id": "${INFLUXDB_SCRUTINY_YEARLY_TASK_ID}", "orgID": "${INFLUXDB_ORG_ID}" } }, { "action": "read", "resource": { "type": "buckets", "id": "${INFLUXDB_SCRUTINY_BASE_BUCKET_ID}", "orgID": "${INFLUXDB_ORG_ID}" } }, { "action": "write", "resource": { "type": "buckets", "id": "${INFLUXDB_SCRUTINY_BASE_BUCKET_ID}", "orgID": "${INFLUXDB_ORG_ID}" } }, { "action": "read", "resource": { "type": "buckets", "id": "${INFLUXDB_SCRUTINY_WEEKLY_BUCKET_ID}", "orgID": "${INFLUXDB_ORG_ID}" } }, { "action": "write", "resource": { "type": "buckets", "id": "${INFLUXDB_SCRUTINY_WEEKLY_BUCKET_ID}", "orgID": "${INFLUXDB_ORG_ID}" } }, { "action": "read", "resource": { "type": "buckets", "id": "${INFLUXDB_SCRUTINY_MONTHLY_BUCKET_ID}", "orgID": "${INFLUXDB_ORG_ID}" } }, { "action": "write", "resource": { "type": "buckets", "id": "${INFLUXDB_SCRUTINY_MONTHLY_BUCKET_ID}", "orgID": "${INFLUXDB_ORG_ID}" } }, { "action": "read", "resource": { "type": "buckets", "id": "${INFLUXDB_SCRUTINY_YEARLY_BUCKET_ID}", "orgID": "${INFLUXDB_ORG_ID}" } }, { "action": "write", "resource": { "type": "buckets", "id": "${INFLUXDB_SCRUTINY_YEARLY_BUCKET_ID}", "orgID": "${INFLUXDB_ORG_ID}" } } ] } EOF ```
### Save InfluxDB API Token After running the Curl command above, you'll see a JSON response that looks like the following: ```json { "token": "ksVU2t5SkQwYkvIxxxxxxxYt2xUt0uRKSbSF1Po0UQ==", "status": "active", "description": "scrutiny - restricted scope token", "orgID": "b2495586xxxx", "org": "my-org", "user": "admin", "permissions": [ { "action": "read", "resource": { "type": "orgs" } }, { "action": "read", "resource": { "type": "tasks" } }, { "action": "write", "resource": { "type": "tasks", "id": "09a64exxxxx", "orgID": "b24955860xxxxx", "org": "my-org" } }, ... ] } ``` You must copy the token field from the JSON response, and save it in your `scrutiny.yaml` config file. After that's done, you can start the Scrutiny server ## Customize InfluxDB Admin Username & Password The full set of InfluxDB configuration options are available in [code](https://github.com/AnalogJ/scrutiny/blob/master/webapp/backend/pkg/config/config.go?rgh-link-date=2023-01-19T16%3A23%3A40Z#L49-L51) . During first startup Scrutiny will connect to the unprotected InfluxDB server, start the setup process (via API) using a username and password of `admin`:`password12345` and then create an API token of `scrutiny-default-admin-token`. After that's complete, it will use the api token for all subsequent communication with InfluxDB. You can configure the values for the Admin username, password and token using the config file, or env variables: #### Config File Example ```yaml web: influxdb: token: 'my-custom-token' init_username: 'my-custom-username' init_password: 'my-custom-password' ``` #### Environmental Variables Example `SCRUTINY_WEB_INFLUXDB_TOKEN` , `SCRUTINY_WEB_INFLUXDB_INIT_USERNAME` and `SCRUTINY_WEB_INFLUXDB_INIT_PASSWORD` It's safe to change the InfluxDB Admin username/password after setup has completed, only the API token is used for subsequent communication with InfluxDB. ================================================ FILE: docs/TROUBLESHOOTING_NOTIFICATIONS.md ================================================ # Notifications As documented in [example.scrutiny.yaml](https://github.com/AnalogJ/scrutiny/blob/master/example.scrutiny.yaml#L59-L75) there are multiple ways to configure notifications for Scrutiny. Under the hood we use a library called [Shoutrrr](https://github.com/nicholas-fedor/shoutrrr) to send our notifications, and you should use their documentation if you run into any issues: https://shoutrrr.nickfedor.com/services/overview/ # Script Notifications While the Shoutrrr library supports many popular providers for sending notifications Scrutiny also supports a "script" based notification system, allowing you to execute a custom script whenever a notification needs to be sent. Data is provided to this script using the following environmental variables: ``` SCRUTINY_SUBJECT - eg. "Scrutiny SMART error (%s) detected on device: %s" SCRUTINY_DATE SCRUTINY_FAILURE_TYPE - EmailTest, SmartFail, ScrutinyFail SCRUTINY_DEVICE_NAME - eg. /dev/sda SCRUTINY_DEVICE_TYPE - ATA/SCSI/NVMe SCRUTINY_DEVICE_SERIAL - eg. WDDJ324KSO SCRUTINY_MESSAGE - eg. "Scrutiny SMART error notification for device: %s\nFailure Type: %s\nDevice Name: %s\nDevice Serial: %s\nDevice Type: %s\nDate: %s" SCRUTINY_HOST_ID - (optional) eg. "my-custom-host-id" ``` # Special Characters `Shoutrrr` supports special characters in the username and password fields, however you'll need to url-encode the username and the password separately. - if your username is: `myname@example.com` - if your password is `124@34$1` Then your `shoutrrr` url will look something like: - `smtp://myname%40example%2Ecom:124%4034%241@ms.my.domain.com:587` # Testing Notifications You can test that your notifications are configured correctly by posting an empty payload to the notifications health check API. ``` curl -X POST http://localhost:8080/api/health/notify ``` ================================================ FILE: docs/TROUBLESHOOTING_REVERSE_PROXY.md ================================================ # Reverse Proxy Support Scrutiny is designed so that it can be used with a reverse proxy, leveraging `domain`, `port` or `path` based matching to correctly route to the Scrutiny service. For simple `domain` and/or `port` based routing, this is easy. If your domain:port pair is similar to `http://scrutiny.example.com` or `http://localhost:54321`, just update your reverse proxy configuration to route traffic to the Scrutiny backend, which is listening on `0.0.0.0:8080` by default. ```yaml # default config web: listen: port: 8080 host: 0.0.0.0 ``` However if you're using `path` based routing to differentiate your reverse proxy protected services, things become more complicated. If you'd like to access Scrutiny using a path like: `http://example.com/scrutiny/`, then we need a way to configure Scrutiny so that it understands `http://example.com/scrutiny/api/health` actually means `http://localhost:8080/api/health`. Thankfully this can be done by changing **two** settings (both are required). 1. The webserver has a `web.listen.basepath` key 2. The collectors have a `api.endpoint` key. ## Webserver Configuration When setting the `web.listen.basepath` key in the web config file, make sure the `basepath` key is prefixed with `/`. ```yaml # customized webserver config web: listen: port: 8080 host: 0.0.0.0 # if you're using a reverse proxy like apache/nginx, you can override this value to serve scrutiny on a subpath. # eg. http://example.com/custombasepath/* vs http://example.com:8080 basepath: '/custombasepath' ``` ## Collector Configuration Here's how you can update the collector `api.endpoint` key: ```yaml # customized collector config api: endpoint: 'http://localhost:8080/custombasepath' ``` # Environmental Variables. You may also configure these values using the following environmental variables (both are required). - `COLLECTOR_API_ENDPOINT=http://localhost:8080/custombasepath` - `SCRUTINY_WEB_LISTEN_BASEPATH=/custombasepath` # Real Examples ## Caddy 1. Create a Caddyfile ```yaml # Caddyfile :9090 # The `scrutiny` text in this file must match the service name in the docker-compose file below. # The `/custom/` text is the custom base path scrutiny will be availble on. reverse_proxy /custom/* scrutiny:8080 ``` 2. Create a `docker-compose.yml` file ```yaml # docker-compose.yml version: '3.5' services: scrutiny: container_name: scrutiny image: ghcr.io/analogj/scrutiny:master-omnibus cap_add: - SYS_RAWIO ports: - "8086:8086" # influxDB admin volumes: - /run/udev:/run/udev:ro - ./config:/opt/scrutiny/config - ./influxdb:/opt/scrutiny/influxdb devices: - "/dev/sda" - "/dev/sdb" environment: - SCRUTINY_WEB_LISTEN_BASEPATH=/custom - COLLECTOR_API_ENDPOINT=http://localhost:8080/custom caddy: image: caddy volumes: - ./Caddyfile:/etc/caddy/Caddyfile ports: - "9090:9090" ``` 3. run `docker-compose up` 4. visit [http://localhost:9090/custom/web](http://localhost:9090/custom/web) - access the scrutiny container via caddy reverse proxy ## Traefik Assuming, that you have Traefik up and running with [AutoDiscovery Using Traefik For Docker ](https://doc.traefik.io/traefik/providers/docker/), here is an example of a `docker-compose.yml` file, with labels to enable Traefik reverse proxy and basic auth ```yaml version: '3.5' services: scrutiny: container_name: scrutiny image: ghcr.io/analogj/scrutiny:master-omnibus cap_add: - SYS_RAWIO - SYS_ADMIN volumes: - /run/udev:/run/udev:ro - ./config:/opt/scrutiny/config - ./influxdb:/opt/scrutiny/influxdb labels: - traefik.enable=true - traefik.http.routers.scrutiny.rule=Host(`example.com`) - traefik.http.services.scrutiny.loadbalancer.server.port=8080 # 2 labels below are optional, in case you want basic auth in Traefik: - traefik.http.routers.scrutiny.middlewares=auth - "traefik.http.middlewares.auth.basicauth.users=user:$$2y$$05$$G11Wm/dlWpXHENK..m8se.zxvaE8USJBp1Ws56sSCrOcwWDjsYHni" # Note: when used in docker-compose.yml all dollar signs in the hash need to be doubled for escaping. # To create user:password pair, it's possible to use this command: # echo $(htpasswd -nB user) | sed -e s/\\$/\\$\\$/g devices: - "/dev/sda" - "/dev/sdb" - "/dev/nvme0" ``` ================================================ FILE: docs/TROUBLESHOOTING_UDEV.md ================================================ # Operating systems without udev Some operating systems do not come with `udev` out of the box, for example Alpine Linux. In these instances you will not be able to bind `/run/udev` to the container for sharing device metadata. Some operating systems offer `udev` as a package that can be installed separately, or an alternative (such as `eudev` in the case of Alpine Linux) that provides the same functionality. To install `eudev` in Alpine Linux (run as root): ``` apk add eudev setup-udev ``` Once your `udev` implementation is installed, create `/run/udev` with the following command: ``` udevadm trigger ``` On Alpine Linux, this also has the benefit of creating symlinks to device serial numbers in `/dev/disk/by-id`. ================================================ FILE: docs/dbdiagram.io.txt ================================================ // SQLite Table(s) Table Device { Archived bool //GORM attributes, see: http://gorm.io/docs/conventions.html CreatedAt time UpdatedAt time DeletedAt time WWN string DeviceName string DeviceUUID string DeviceSerialID string DeviceLabel string Manufacturer string ModelName string InterfaceType string InterfaceSpeed string SerialNumber string Firmware string RotationSpeed int Capacity int64 FormFactor string SmartSupport bool DeviceProtocol string//protocol determines which smart attribute types are available (ATA, NVMe, SCSI) DeviceType string//device type is used for querying with -d/t flag, should only be used by collector. // User provided metadata Label string HostId string // Data set by Scrutiny DeviceStatus enum } Table Setting { //GORM attributes, see: http://gorm.io/docs/conventions.html SettingKeyName string SettingKeyDescription string SettingDataType string SettingValueNumeric int64 SettingValueString string } // InfluxDB Tables Table SmartTemperature { Date time DeviceWWN string //(tag) Temp int64 } Table Smart { Date time DeviceWWN string //(tag) DeviceProtocol string //Metrics (fields) Temp int64 PowerOnHours int64 PowerCycleCount int64 //Smart Status Status enum //SMART Attributes (fields) Attr_ID_AttributeId int Attr_ID_Value int64 Attr_ID_Threshold int64 Attr_ID_Worst int64 Attr_ID_RawValue int64 Attr_ID_RawString string Attr_ID_WhenFailed string //Generated data Attr_ID_TransformedValue int64 Attr_ID_Status enum Attr_ID_StatusReason string Attr_ID_FailureRate float64 } Ref: Device.WWN < Smart.DeviceWWN Ref: Device.WWN < SmartTemperature.DeviceWWN ================================================ FILE: example.collector.yaml ================================================ # Commented Scrutiny Configuration File # # The default location for this file is /opt/scrutiny/config/collector.yaml. # In some cases to improve clarity default values are specified, # uncommented. Other example values are commented out. # # When this file is parsed by Scrutiny, all configuration file keys are # lowercased automatically. As such, Configuration keys are case-insensitive, # and should be lowercase in this file to be consistent with usage. ###################################################################### # Version # # version specifies the version of this configuration file schema, not # the scrutiny binary. There is only 1 version available at the moment version: 1 # The host id is a label used for identifying groups of disks running on the same host # Primiarly used for hub/spoke deployments (can be left empty if using all-in-one image). host: id: "" # This block allows you to override/customize the settings for devices detected by # Scrutiny via `smartctl --scan` # See the "--device=TYPE" section of https://linux.die.net/man/8/smartctl # type can be a 'string' or a 'list' devices: # # example for forcing device type detection for a single disk # - device: /dev/sda # type: 'sat' # # # example for using `-d sat,auto`, notice the square brackets (workaround for #418) # - device: /dev/sda # type: ['sat,auto'] # # # example to show how to ignore a specific disk/device. # - device: /dev/sda # ignore: true # # # examples showing how to force smartctl to detect disks inside a raid array/virtual disk # - device: /dev/bus/0 # type: # - megaraid,14 # - megaraid,15 # - megaraid,18 # - megaraid,19 # - megaraid,20 # - megaraid,21 # # - device: /dev/twa0 # type: # - 3ware,0 # - 3ware,1 # - 3ware,2 # - 3ware,3 # - 3ware,4 # - 3ware,5 # # # example to show how to override the smartctl command args (per device), see below for how to override these globally. # - device: /dev/sda # commands: # metrics_info_args: '--info --json -T permissive' # used to determine device unique ID & register device with Scrutiny # metrics_smart_args: '--xall --json -T permissive' # used to retrieve smart data for each device. #log: # file: '' #absolute or relative paths allowed, eg. web.log # level: INFO # #api: # endpoint: 'http://localhost:8080' # endpoint: 'http://localhost:8080/custombasepath' # if you need to use a custom base path (for a reverse proxy), you can add a suffix to the endpoint. # See docs/TROUBLESHOOTING_REVERSE_PROXY.md for more info, # example to show how to override the smartctl command args globally #commands: # metrics_smartctl_bin: 'smartctl' # change to provide custom `smartctl` binary path, eg. `/usr/sbin/smartctl` # metrics_scan_args: '--scan --json' # used to detect devices # metrics_info_args: '--info --json' # used to determine device unique ID & register device with Scrutiny # metrics_smart_args: '--xall --json' # used to retrieve smart data for each device. # metrics_smartctl_wait: 0 # time to wait in seconds between each disk's check ######################################################################################################################## # FEATURES COMING SOON # # The following commented out sections are a preview of additional configuration options that will be available soon. # ######################################################################################################################## #collect: # long: # enable: false # command: '' # short: # enable: false # command: '' ================================================ FILE: example.scrutiny.yaml ================================================ # Commented Scrutiny Configuration File # # The default location for this file is /opt/scrutiny/config/scrutiny.yaml. # In some cases to improve clarity default values are specified, # uncommented. Other example values are commented out. # # When this file is parsed by Scrutiny, all configuration file keys are # lowercased automatically. As such, Configuration keys are case-insensitive, # and should be lowercase in this file to be consistent with usage. ###################################################################### # Version # # version specifies the version of this configuration file schema, not # the scrutiny binary. There is only 1 version available at the moment version: 1 web: listen: port: 8080 host: 0.0.0.0 # if you're using a reverse proxy like apache/nginx, you can override this value to serve scrutiny on a subpath. # eg. http://example.com/scrutiny/* vs http://example.com:8080 # see docs/TROUBLESHOOTING_REVERSE_PROXY.md # basepath: `/scrutiny` # leave empty unless behind a path prefixed proxy basepath: '' database: # can also set absolute path here location: /opt/scrutiny/config/scrutiny.db src: # the location on the filesystem where scrutiny javascript + css is located frontend: path: /opt/scrutiny/web # if you're running influxdb on a different host (or using a cloud-provider) you'll need to update the host & port below. # token, org, bucket are unnecessary for a new InfluxDB installation, as Scrutiny will automatically run the InfluxDB setup, # and store the information in the config file. If you 're re-using an existing influxdb installation, you'll need to provide # the `token` influxdb: # scheme: 'http' host: 0.0.0.0 port: 8086 # token: 'my-token' # org: 'my-org' # bucket: 'bucket' retention_policy: true # if you wish to disable TLS certificate verification, # when using self-signed certificates for example, # then uncomment the lines below and set `insecure_skip_verify: true` # tls: # insecure_skip_verify: false log: file: '' #absolute or relative paths allowed, eg. web.log level: INFO # Notification "urls" look like the following. For more information about service specific configuration see # Shoutrrr's documentation: https://shoutrrr.nickfedor.com/services/overview/ # # note, usernames and passwords containing special characters will need to be urlencoded. # if your username is: "myname@example.com" and your password is "124@34$1" # your shoutrrr url will look like: "smtp://myname%40example%2Ecom:124%4034%241@ms.my.domain.com:587" #notify: # urls: # - discord://token@id[?thread_id=threadid] # - googlechat://chat.googleapis.com/v1/spaces/FOO/messages?key=bar&token=baz # - hangouts://chat.googleapis.com/v1/spaces/FOO/messages?key=bar&token=baz # - lark://host/token?secret=secret&title=title&link=url # - matrix://username:password@host:port/[?rooms=!roomID1[,roomAlias2]] # - mattermost://[username@]mattermost-host/token[/channel] # - rocketchat://[username@]rocketchat-host/token[/channel|@recipient] # - signal://[user[:password]@]host[:port]/source_phone/recipient1[,recipient2,...] # - slack://[botname@]token-a/token-b/token-c # - teams://group@tenant/altId/groupOwner?host=organization.webhook.office.com # - telegram://token@telegram?chats=@channel-1[,chat-id-1,chat-id-2:message-thread-id,...] # - wecom://key # - zulip://bot-mail:bot-key@zulip-domain/?stream=name-or-id&topic=name # - bark://devicekey@host # - gotify://gotify-host/token # - ifttt://key/?events=event1[,event2,...]&value1=value1&value2=value2&value3=value3 # - join://shoutrrr:api-key@join/?devices=device1[,device2, ...][&icon=icon][&title=title] # - ntfy://username:password@ntfy.sh/topic # - pushbullet://api-token[/device/#channel/email] # - pushover://shoutrrr:apiToken@userKey/?devices=device1[,device2, ...] # - opsgenie://host/token?responders=responder1[,responder2] # - pagerduty://[host[:port]]/integration-key[?query-parameters] # - smtp://username:password@host:port/?fromaddress=fromAddress&toaddresses=recipient1[,recipient2,...][&additional_params] ================================================ FILE: go.mod ================================================ module github.com/analogj/scrutiny go 1.25 require ( github.com/analogj/go-util v0.0.0-20210417161720-39b497cca03b github.com/fatih/color v1.18.0 github.com/gin-gonic/gin v1.11.0 github.com/glebarez/sqlite v1.11.0 github.com/go-gormigrate/gormigrate/v2 v2.1.5 github.com/go-viper/mapstructure/v2 v2.5.0 github.com/influxdata/influxdb-client-go/v2 v2.14.0 github.com/jaypipes/ghw v0.21.2 github.com/nicholas-fedor/shoutrrr v0.13.2 github.com/samber/lo v1.52.0 github.com/sirupsen/logrus v1.9.4 github.com/spf13/viper v1.21.0 github.com/stretchr/testify v1.11.1 github.com/urfave/cli/v2 v2.27.7 go.uber.org/mock v0.6.0 golang.org/x/sync v0.19.0 gorm.io/gorm v1.31.1 ) require ( github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/bytedance/gopkg v0.1.3 // indirect github.com/bytedance/sonic v1.15.0 // indirect github.com/bytedance/sonic/loader v0.5.0 // indirect github.com/cloudwego/base64x v0.1.6 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/gabriel-vasile/mimetype v1.4.13 // indirect github.com/gin-contrib/sse v1.1.0 // indirect github.com/glebarez/go-sqlite v1.22.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.30.1 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/goccy/go-yaml v1.19.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect github.com/jaypipes/pcidb v1.1.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/kvz/logstreamer v0.0.0-20221024075423-bf5cfbd32e39 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/ncruces/go-strftime v1.0.0 // indirect github.com/oapi-codegen/runtime v1.1.2 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/quic-go/qpack v0.6.0 // indirect github.com/quic-go/quic-go v0.59.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sagikazarmark/locafero v0.12.0 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/spf13/pflag v1.0.10 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.3.1 // indirect github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/arch v0.23.0 // indirect golang.org/x/crypto v0.47.0 // indirect golang.org/x/exp v0.0.0-20260112195511-716be5621a96 // indirect golang.org/x/net v0.49.0 // indirect golang.org/x/sys v0.40.0 // indirect golang.org/x/term v0.39.0 // indirect golang.org/x/text v0.33.0 // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect howett.net/plist v1.0.2-0.20250314012144-ee69052608d9 // indirect modernc.org/libc v1.67.7 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect modernc.org/sqlite v1.44.3 // indirect ) ================================================ FILE: go.sum ================================================ github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/analogj/go-util v0.0.0-20210417161720-39b497cca03b h1:Y/+MfmdKPPpVY7C6ggt/FpltFSitlpUtyJEdcQyFXQg= github.com/analogj/go-util v0.0.0-20210417161720-39b497cca03b/go.mod h1:bRSzJXgXnT5+Ihah7RSC7Cvp16UmoLn3wq6ROciS1Ow= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= github.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE= github.com/bytedance/sonic v1.15.0/go.mod h1:tFkWrPz0/CUCLEF4ri4UkHekCIcdnkqXw9VduqpJh0k= github.com/bytedance/sonic/loader v0.5.0 h1:gXH3KVnatgY7loH5/TkeVyXPfESoqSBSBEiDd5VjlgE= github.com/bytedance/sonic/loader v0.5.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9Ufpk2AcUM= github.com/gabriel-vasile/mimetype v1.4.13/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk= github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls= github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw= github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ= github.com/go-gormigrate/gormigrate/v2 v2.1.5 h1:1OyorA5LtdQw12cyJDEHuTrEV3GiXiIhS4/QTTa/SM8= github.com/go-gormigrate/gormigrate/v2 v2.1.5/go.mod h1:mj9ekk/7CPF3VjopaFvWKN2v7fN3D9d3eEOAXRhi/+M= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w= github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc= github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/influxdata/influxdb-client-go/v2 v2.14.0 h1:AjbBfJuq+QoaXNcrova8smSjwJdUHnwvfjMF71M1iI4= github.com/influxdata/influxdb-client-go/v2 v2.14.0/go.mod h1:Ahpm3QXKMJslpXl3IftVLVezreAUtBOTZssDrjZEFHI= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jarcoal/httpmock v1.4.1 h1:0Ju+VCFuARfFlhVXFc2HxlcQkfB+Xq12/EotHko+x2A= github.com/jarcoal/httpmock v1.4.1/go.mod h1:ftW1xULwo+j0R0JJkJIIi7UKigZUXCLLanykgjwBXL0= github.com/jaypipes/ghw v0.21.2 h1:woW0lqNMPbYk59sur6thOVM8YFP9Hxxr8PM+JtpUrNU= github.com/jaypipes/ghw v0.21.2/go.mod h1:GPrvwbtPoxYUenr74+nAnWbardIZq600vJDD5HnPsPE= github.com/jaypipes/pcidb v1.1.1 h1:QmPhpsbmmnCwZmHeYAATxEaoRuiMAJusKYkUncMC0ro= github.com/jaypipes/pcidb v1.1.1/go.mod h1:x27LT2krrUgjf875KxQXKB0Ha/YXLdZRVmw6hH0G7g8= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kvz/logstreamer v0.0.0-20150507115422-a635b98146f0/go.mod h1:8/LTPeDLaklcUjgSQBHbhBF1ibKAFxzS5o+H7USfMSA= github.com/kvz/logstreamer v0.0.0-20221024075423-bf5cfbd32e39 h1:CBydX6UrnBjwD107XLBGulgvTezrrR38FAufUJr3dsk= github.com/kvz/logstreamer v0.0.0-20221024075423-bf5cfbd32e39/go.mod h1:8/LTPeDLaklcUjgSQBHbhBF1ibKAFxzS5o+H7USfMSA= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.6/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/nicholas-fedor/shoutrrr v0.13.2 h1:hfsYBIqSFYGg92pZP5CXk/g7/OJIkLYmiUnRl+AD1IA= github.com/nicholas-fedor/shoutrrr v0.13.2/go.mod h1:ZqzV3gY/Wj6AvWs1etlO7+yKbh4iptSbeL8avBpMQbA= github.com/oapi-codegen/runtime v1.1.2 h1:P2+CubHq8fO4Q6fV1tqDBZHCwpVpvPg7oKiYzQgXIyI= github.com/oapi-codegen/runtime v1.1.2/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= github.com/onsi/ginkgo/v2 v2.28.1 h1:S4hj+HbZp40fNKuLUQOYLDgZLwNUVn19N3Atb98NCyI= github.com/onsi/ginkgo/v2 v2.28.1/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE= github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28= github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII= github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw= github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4= github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI= github.com/samber/lo v1.52.0 h1:Rvi+3BFHES3A8meP33VPAxiBZX/Aws5RxrschYGjomw= github.com/samber/lo v1.52.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY= github.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU= github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4= github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 h1:FnBeRrxr7OU4VvAzt5X7s6266i6cSVkkFPS0TuXWbIg= github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/arch v0.23.0 h1:lKF64A2jF6Zd8L0knGltUnegD62JMFBiCPBmQpToHhg= golang.org/x/arch v0.23.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= golang.org/x/exp v0.0.0-20260112195511-716be5621a96 h1:Z/6YuSHTLOHfNFdb8zVZomZr7cqNgTJvA8+Qz75D8gU= golang.org/x/exp v0.0.0-20260112195511-716be5621a96/go.mod h1:nzimsREAkjBCIEFtHiYkrJyT+2uy9YZJB7H1k68CXZU= golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg= gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs= howett.net/plist v1.0.2-0.20250314012144-ee69052608d9 h1:eeH1AIcPvSc0Z25ThsYF+Xoqbn0CI/YnXVYoTLFdGQw= howett.net/plist v1.0.2-0.20250314012144-ee69052608d9/go.mod h1:fyFX5Hj5tP1Mpk8obqA9MZgXT416Q5711SDT7dQLTLk= modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis= modernc.org/cc/v4 v4.27.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= modernc.org/ccgo/v4 v4.30.1 h1:4r4U1J6Fhj98NKfSjnPUN7Ze2c6MnAdL0hWw6+LrJpc= modernc.org/ccgo/v4 v4.30.1/go.mod h1:bIOeI1JL54Utlxn+LwrFyjCx2n2RDiYEaJVSrgdrRfM= modernc.org/fileutil v1.3.40 h1:ZGMswMNc9JOCrcrakF1HrvmergNLAmxOPjizirpfqBA= modernc.org/fileutil v1.3.40/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= modernc.org/gc/v3 v3.1.1 h1:k8T3gkXWY9sEiytKhcgyiZ2L0DTyCQ/nvX+LoCljoRE= modernc.org/gc/v3 v3.1.1/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= modernc.org/libc v1.67.7 h1:H+gYQw2PyidyxwxQsGTwQw6+6H+xUk+plvOKW7+d3TI= modernc.org/libc v1.67.7/go.mod h1:UjCSJFl2sYbJbReVQeVpq/MgzlbmDM4cRHIYFelnaDk= modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= modernc.org/sqlite v1.44.3 h1:+39JvV/HWMcYslAwRxHb8067w+2zowvFOUrOWIy9PjY= modernc.org/sqlite v1.44.3/go.mod h1:CzbrU2lSB1DKUusvwGz7rqEKIq+NUd8GWuBBZDs9/nA= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= ================================================ FILE: packagr.yml ================================================ --- engine_enable_code_mutation: true mgr_keep_lock_file: true engine_version_metadata_path: 'webapp/backend/pkg/version/version.go' engine_golang_package_path: 'github.com/analogj/scrutiny' ================================================ FILE: rootfs/etc/cont-init.d/01-timezone ================================================ #!/command/with-contenv bash if [ -n "${TZ}" ] then ln -snf "/usr/share/zoneinfo/${TZ}" /etc/localtime echo "${TZ}" > /etc/timezone fi ================================================ FILE: rootfs/etc/cont-init.d/50-cron-config ================================================ #!/command/with-contenv bash # Cron runs in its own isolated environment (usually using only /etc/environment ) # So when the container starts up, we will do a dump of the runtime environment into a .env file that we # will then source into the crontab file (/etc/cron.d/scrutiny) (set -o posix; export -p) > /env.sh # adding ability to customize the cron schedule. COLLECTOR_CRON_SCHEDULE=${COLLECTOR_CRON_SCHEDULE:-"0 0 * * *"} # if the cron schedule has been overridden via env variable (eg docker-compose) we should make sure to strip quotes [[ "${COLLECTOR_CRON_SCHEDULE}" == \"*\" || "${COLLECTOR_CRON_SCHEDULE}" == \'*\' ]] && COLLECTOR_CRON_SCHEDULE="${COLLECTOR_CRON_SCHEDULE:1:-1}" # replace placeholder with correct value sed -i 's|{COLLECTOR_CRON_SCHEDULE}|'"${COLLECTOR_CRON_SCHEDULE}"'|g' /etc/cron.d/scrutiny ================================================ FILE: rootfs/etc/cron.d/scrutiny ================================================ MAILTO="" # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed # correctly route collector logs (STDOUT & STDERR) to Cron foreground (collectable by Docker STDOUT) # cron schedule to run daily at midnight: '0 0 * * *' # System environmental variables are stripped by cron, source our dump of the docker environmental variables before each command (/env.sh) {COLLECTOR_CRON_SCHEDULE} root . /env.sh; /opt/scrutiny/bin/scrutiny-collector-metrics run >/proc/1/fd/1 2>/proc/1/fd/2 # An empty line is required at the end of this file for a valid cron file. ================================================ FILE: rootfs/etc/services.d/collector-once/run ================================================ #!/command/with-contenv bash # ensure not run (successfully) before if [ -f /tmp/custom-init-performed ]; then echo 'INFO: custom init already performed' s6-svc -D /run/service/collector-once # prevent s6 from restarting service exit 0 fi echo "waiting for scrutiny service to start" s6-svwait -u /run/service/scrutiny # wait until scrutiny is "Ready" until $(curl --output /dev/null --silent --head --fail http://localhost:8080/api/health); do echo "scrutiny api not ready" && sleep 5; done echo "starting scrutiny collector (run-once mode. subsequent calls will be triggered via cron service)" /opt/scrutiny/bin/scrutiny-collector-metrics run # prevent script's core logic from running again touch /tmp/custom-init-performed # prevent s6 from restarting service s6-svc -D /run/service/collector-once exit 0 ================================================ FILE: rootfs/etc/services.d/cron/finish ================================================ #!/command/execlineb -S0 echo "cron exiting" s6-svscanctl -t /var/run/s6/services ================================================ FILE: rootfs/etc/services.d/cron/run ================================================ #!/command/with-contenv bash echo "starting cron" cron -f -L 15 ================================================ FILE: rootfs/etc/services.d/influxdb/run ================================================ #!/command/with-contenv bash mkdir -p /opt/scrutiny/influxdb/ if [ -f "/opt/scrutiny/influxdb/config.yaml" ]; then echo "influxdb config file already exists. skipping." else cat << 'EOF' > /opt/scrutiny/influxdb/config.yaml bolt-path: /opt/scrutiny/influxdb/influxd.bolt engine-path: /opt/scrutiny/influxdb/engine http-bind-address: ":8086" reporting-disabled: true EOF fi echo "starting influxdb" influxd run ================================================ FILE: rootfs/etc/services.d/scrutiny/run ================================================ #!/command/with-contenv bash echo "waiting for influxdb" until $(curl --output /dev/null --silent --head --fail http://localhost:8086/health); do echo "influxdb not ready" && sleep 5; done echo "starting scrutiny" scrutiny start ================================================ FILE: webapp/backend/cmd/scrutiny/scrutiny.go ================================================ package main import ( "encoding/json" "fmt" "io" "log" "os" "time" "github.com/analogj/scrutiny/webapp/backend/pkg/config" "github.com/analogj/scrutiny/webapp/backend/pkg/errors" "github.com/analogj/scrutiny/webapp/backend/pkg/version" "github.com/analogj/scrutiny/webapp/backend/pkg/web" "github.com/sirupsen/logrus" utils "github.com/analogj/go-util/utils" "github.com/fatih/color" "github.com/urfave/cli/v2" ) var goos string var goarch string func main() { config, err := config.Create() if err != nil { fmt.Printf("FATAL: %+v\n", err) os.Exit(1) } configFilePath := "/opt/scrutiny/config/scrutiny.yaml" configFilePathAlternative := "/opt/scrutiny/config/scrutiny.yml" if !utils.FileExists(configFilePath) && utils.FileExists(configFilePathAlternative) { configFilePath = configFilePathAlternative } //we're going to load the config file manually, since we need to validate it. err = config.ReadConfig(configFilePath) // Find and read the config file if _, ok := err.(errors.ConfigFileMissingError); ok { // Handle errors reading the config file //ignore "could not find config file" } else if err != nil { log.Print(color.HiRedString("CONFIG ERROR: %v", err)) os.Exit(1) } cli.CommandHelpTemplate = `NAME: {{.HelpName}} - {{.Usage}} USAGE: {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}} CATEGORY: {{.Category}}{{end}}{{if .Description}} DESCRIPTION: {{.Description}}{{end}}{{if .VisibleFlags}} OPTIONS: {{range .VisibleFlags}}{{.}} {{end}}{{end}} ` app := &cli.App{ Name: "scrutiny", Usage: "WebUI for smartd S.M.A.R.T monitoring", Version: version.VERSION, Compiled: time.Now(), Authors: []*cli.Author{ { Name: "Jason Kulatunga", Email: "jason@thesparktree.com", }, }, Before: func(c *cli.Context) error { scrutiny := "github.com/AnalogJ/scrutiny" var versionInfo string if len(goos) > 0 && len(goarch) > 0 { versionInfo = fmt.Sprintf("%s.%s-%s", goos, goarch, version.VERSION) } else { versionInfo = fmt.Sprintf("dev-%s", version.VERSION) } subtitle := scrutiny + utils.LeftPad2Len(versionInfo, " ", 65-len(scrutiny)) color.New(color.FgGreen).Fprintf(c.App.Writer, utils.StripIndent( ` ___ ___ ____ __ __ ____ ____ _ _ _ _ / __) / __)( _ \( )( )(_ _)(_ _)( \( )( \/ ) \__ \( (__ ) / )(__)( )( _)(_ ) ( \ / (___/ \___)(_)\_)(______) (__) (____)(_)\_) (__) %s `), subtitle) return nil }, Commands: []*cli.Command{ { Name: "start", Usage: "Start the scrutiny server", Action: func(c *cli.Context) error { fmt.Fprintln(c.App.Writer, c.Command.Usage) if c.IsSet("config") { err = config.ReadConfig(c.String("config")) // Find and read the config file if err != nil { // Handle errors reading the config file //ignore "could not find config file" fmt.Printf("Could not find config file at specified path: %s", c.String("config")) return err } } if c.Bool("debug") { config.Set("log.level", "DEBUG") } if c.IsSet("log-file") { config.Set("log.file", c.String("log-file")) } webLogger, logFile, err := CreateLogger(config) if logFile != nil { defer logFile.Close() } if err != nil { return err } settingsData, err := json.Marshal(config.AllSettings()) webLogger.Debug(string(settingsData), err) webServer := web.AppEngine{Config: config, Logger: webLogger} return webServer.Start() }, Flags: []cli.Flag{ &cli.StringFlag{ Name: "config", Usage: "Specify the path to the config file", }, &cli.StringFlag{ Name: "log-file", Usage: "Path to file for logging. Leave empty to use STDOUT", Value: "", EnvVars: []string{"SCRUTINY_LOG_FILE"}, }, &cli.BoolFlag{ Name: "debug", Usage: "Enable debug logging", EnvVars: []string{"SCRUTINY_DEBUG", "DEBUG"}, }, }, }, }, } err = app.Run(os.Args) if err != nil { log.Fatal(color.HiRedString("ERROR: %v", err)) } } func CreateLogger(appConfig config.Interface) (*logrus.Entry, *os.File, error) { logger := logrus.WithFields(logrus.Fields{ "type": "web", }) //set default log level if level, err := logrus.ParseLevel(appConfig.GetString("log.level")); err == nil { logger.Logger.SetLevel(level) } else { logger.Logger.SetLevel(logrus.InfoLevel) } var logFile *os.File var err error if appConfig.IsSet("log.file") && len(appConfig.GetString("log.file")) > 0 { logFile, err = os.OpenFile(appConfig.GetString("log.file"), os.O_CREATE|os.O_WRONLY, 0644) if err != nil { logger.Logger.Errorf("Failed to open log file %s for output: %s", appConfig.GetString("log.file"), err) return nil, logFile, err } logger.Logger.SetOutput(io.MultiWriter(os.Stderr, logFile)) } return logger, logFile, nil } ================================================ FILE: webapp/backend/pkg/config/config.go ================================================ package config import ( "github.com/analogj/go-util/utils" "github.com/analogj/scrutiny/webapp/backend/pkg/errors" "github.com/spf13/viper" "log" "os" "strings" ) const DB_USER_SETTINGS_SUBKEY = "user" // When initializing this class the following methods must be called: // Config.New // Config.Init // This is done automatically when created via the Factory. type configuration struct { *viper.Viper } //Viper uses the following precedence order. Each item takes precedence over the item below it: // explicit call to Set // flag // env // config // key/value store // default func (c *configuration) Init() error { c.Viper = viper.New() //set defaults c.SetDefault("web.listen.port", "8080") c.SetDefault("web.listen.host", "0.0.0.0") c.SetDefault("web.listen.basepath", "") c.SetDefault("web.src.frontend.path", "/opt/scrutiny/web") c.SetDefault("web.database.location", "/opt/scrutiny/config/scrutiny.db") c.SetDefault("log.level", "INFO") c.SetDefault("log.file", "") c.SetDefault("notify.urls", []string{}) c.SetDefault("web.influxdb.scheme", "http") c.SetDefault("web.influxdb.host", "localhost") c.SetDefault("web.influxdb.port", "8086") c.SetDefault("web.influxdb.org", "scrutiny") c.SetDefault("web.influxdb.bucket", "metrics") c.SetDefault("web.influxdb.init_username", "admin") c.SetDefault("web.influxdb.init_password", "password12345") c.SetDefault("web.influxdb.token", "scrutiny-default-admin-token") c.SetDefault("web.influxdb.tls.insecure_skip_verify", false) c.SetDefault("web.influxdb.retention_policy", true) //c.SetDefault("disks.include", []string{}) //c.SetDefault("disks.exclude", []string{}) //if you want to load a non-standard location system config file (~/drawbridge.yml), use ReadConfig c.SetConfigType("yaml") //c.SetConfigName("drawbridge") //c.AddConfigPath("$HOME/") //configure env variable parsing. c.SetEnvPrefix("SCRUTINY") c.SetEnvKeyReplacer(strings.NewReplacer("-", "_", ".", "_")) c.AutomaticEnv() //CLI options will be added via the `Set()` function return c.ValidateConfig() } func (c *configuration) SubKeys(key string) []string { return c.Sub(key).AllKeys() } func (c *configuration) Sub(key string) Interface { config := configuration{ Viper: c.Viper.Sub(key), } return &config } func (c *configuration) ReadConfig(configFilePath string) error { //make sure that we specify that this is the correct config path (for eventual WriteConfig() calls) c.SetConfigFile(configFilePath) configFilePath, err := utils.ExpandPath(configFilePath) if err != nil { return err } if !utils.FileExists(configFilePath) { log.Printf("No configuration file found at %v. Using Defaults.", configFilePath) return errors.ConfigFileMissingError("The configuration file could not be found.") } //validate config file contents //err = c.ValidateConfigFile(configFilePath) //if err != nil { // log.Printf("Config file at `%v` is invalid: %s", configFilePath, err) // return err //} log.Printf("Loading configuration file: %s", configFilePath) config_data, err := os.Open(configFilePath) if err != nil { log.Printf("Error reading configuration file: %s", err) return err } err = c.MergeConfig(config_data) if err != nil { return err } return c.ValidateConfig() } // This function ensures that the merged config works correctly. func (c *configuration) ValidateConfig() error { //the following keys are deprecated, and no longer supported /* - notify.filter_attributes (replaced by metrics.status.filter_attributes SETTING) - notify.level (replaced by metrics.notify.level and metrics.status.threshold SETTING) */ //TODO add docs and upgrade doc. if c.IsSet("notify.filter_attributes") { return errors.ConfigValidationError("`notify.filter_attributes` configuration option is deprecated. Replaced by option in Dashboard Settings page") } if c.IsSet("notify.level") { return errors.ConfigValidationError("`notify.level` configuration option is deprecated. Replaced by option in Dashboard Settings page") } return nil } ================================================ FILE: webapp/backend/pkg/config/config_test.go ================================================ package config import ( "github.com/spf13/viper" "github.com/stretchr/testify/require" "testing" ) func Test_MergeConfigMap(t *testing.T) { //setup testConfig := configuration{ Viper: viper.New(), } testConfig.Set("user.dashboard_display", "hello") testConfig.SetDefault("user.layout", "hello") mergeSettings := map[string]interface{}{ "user": map[string]interface{}{ "dashboard_display": "dashboard_display", "layout": "layout", }, } //test err := testConfig.MergeConfigMap(mergeSettings) //verify require.NoError(t, err) // if using Set, the MergeConfigMap functionality will not override // if using SetDefault, the MergeConfigMap will override correctly require.Equal(t, "hello", testConfig.GetString("user.dashboard_display")) require.Equal(t, "layout", testConfig.GetString("user.layout")) } ================================================ FILE: webapp/backend/pkg/config/factory.go ================================================ package config func Create() (Interface, error) { config := new(configuration) if err := config.Init(); err != nil { return nil, err } return config, nil } ================================================ FILE: webapp/backend/pkg/config/interface.go ================================================ package config import ( "github.com/spf13/viper" ) // Create mock using: // mockgen -source=webapp/backend/pkg/config/interface.go -destination=webapp/backend/pkg/config/mock/mock_config.go type Interface interface { Init() error ReadConfig(configFilePath string) error WriteConfig() error Set(key string, value interface{}) SetDefault(key string, value interface{}) MergeConfigMap(cfg map[string]interface{}) error Sub(key string) Interface AllSettings() map[string]interface{} AllKeys() []string SubKeys(key string) []string IsSet(key string) bool Get(key string) interface{} GetBool(key string) bool GetInt(key string) int GetInt64(key string) int64 GetString(key string) string GetStringSlice(key string) []string UnmarshalKey(key string, rawVal interface{}, decoderOpts ...viper.DecoderConfigOption) error } ================================================ FILE: webapp/backend/pkg/config/mock/mock_config.go ================================================ // Code generated by MockGen. DO NOT EDIT. // Source: webapp/backend/pkg/config/interface.go // Package mock_config is a generated GoMock package. package mock_config import ( reflect "reflect" config "github.com/analogj/scrutiny/webapp/backend/pkg/config" viper "github.com/spf13/viper" gomock "go.uber.org/mock/gomock" ) // MockInterface is a mock of Interface interface. type MockInterface struct { ctrl *gomock.Controller recorder *MockInterfaceMockRecorder } // MockInterfaceMockRecorder is the mock recorder for MockInterface. type MockInterfaceMockRecorder struct { mock *MockInterface } // NewMockInterface creates a new mock instance. func NewMockInterface(ctrl *gomock.Controller) *MockInterface { mock := &MockInterface{ctrl: ctrl} mock.recorder = &MockInterfaceMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use. func (m *MockInterface) EXPECT() *MockInterfaceMockRecorder { return m.recorder } // AllKeys mocks base method. func (m *MockInterface) AllKeys() []string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AllKeys") ret0, _ := ret[0].([]string) return ret0 } // AllKeys indicates an expected call of AllKeys. func (mr *MockInterfaceMockRecorder) AllKeys() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllKeys", reflect.TypeOf((*MockInterface)(nil).AllKeys)) } // AllSettings mocks base method. func (m *MockInterface) AllSettings() map[string]interface{} { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AllSettings") ret0, _ := ret[0].(map[string]interface{}) return ret0 } // AllSettings indicates an expected call of AllSettings. func (mr *MockInterfaceMockRecorder) AllSettings() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllSettings", reflect.TypeOf((*MockInterface)(nil).AllSettings)) } // Get mocks base method. func (m *MockInterface) Get(key string) interface{} { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Get", key) ret0, _ := ret[0].(interface{}) return ret0 } // Get indicates an expected call of Get. func (mr *MockInterfaceMockRecorder) Get(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockInterface)(nil).Get), key) } // GetBool mocks base method. func (m *MockInterface) GetBool(key string) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetBool", key) ret0, _ := ret[0].(bool) return ret0 } // GetBool indicates an expected call of GetBool. func (mr *MockInterfaceMockRecorder) GetBool(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBool", reflect.TypeOf((*MockInterface)(nil).GetBool), key) } // GetInt mocks base method. func (m *MockInterface) GetInt(key string) int { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetInt", key) ret0, _ := ret[0].(int) return ret0 } // GetInt indicates an expected call of GetInt. func (mr *MockInterfaceMockRecorder) GetInt(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetInt", reflect.TypeOf((*MockInterface)(nil).GetInt), key) } // GetInt64 mocks base method. func (m *MockInterface) GetInt64(key string) int64 { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetInt64", key) ret0, _ := ret[0].(int64) return ret0 } // GetInt64 indicates an expected call of GetInt64. func (mr *MockInterfaceMockRecorder) GetInt64(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetInt64", reflect.TypeOf((*MockInterface)(nil).GetInt64), key) } // GetString mocks base method. func (m *MockInterface) GetString(key string) string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetString", key) ret0, _ := ret[0].(string) return ret0 } // GetString indicates an expected call of GetString. func (mr *MockInterfaceMockRecorder) GetString(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetString", reflect.TypeOf((*MockInterface)(nil).GetString), key) } // GetStringSlice mocks base method. func (m *MockInterface) GetStringSlice(key string) []string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetStringSlice", key) ret0, _ := ret[0].([]string) return ret0 } // GetStringSlice indicates an expected call of GetStringSlice. func (mr *MockInterfaceMockRecorder) GetStringSlice(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStringSlice", reflect.TypeOf((*MockInterface)(nil).GetStringSlice), key) } // Init mocks base method. func (m *MockInterface) Init() error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Init") ret0, _ := ret[0].(error) return ret0 } // Init indicates an expected call of Init. func (mr *MockInterfaceMockRecorder) Init() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Init", reflect.TypeOf((*MockInterface)(nil).Init)) } // IsSet mocks base method. func (m *MockInterface) IsSet(key string) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "IsSet", key) ret0, _ := ret[0].(bool) return ret0 } // IsSet indicates an expected call of IsSet. func (mr *MockInterfaceMockRecorder) IsSet(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSet", reflect.TypeOf((*MockInterface)(nil).IsSet), key) } // MergeConfigMap mocks base method. func (m *MockInterface) MergeConfigMap(cfg map[string]interface{}) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "MergeConfigMap", cfg) ret0, _ := ret[0].(error) return ret0 } // MergeConfigMap indicates an expected call of MergeConfigMap. func (mr *MockInterfaceMockRecorder) MergeConfigMap(cfg interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MergeConfigMap", reflect.TypeOf((*MockInterface)(nil).MergeConfigMap), cfg) } // ReadConfig mocks base method. func (m *MockInterface) ReadConfig(configFilePath string) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ReadConfig", configFilePath) ret0, _ := ret[0].(error) return ret0 } // ReadConfig indicates an expected call of ReadConfig. func (mr *MockInterfaceMockRecorder) ReadConfig(configFilePath interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadConfig", reflect.TypeOf((*MockInterface)(nil).ReadConfig), configFilePath) } // Set mocks base method. func (m *MockInterface) Set(key string, value interface{}) { m.ctrl.T.Helper() m.ctrl.Call(m, "Set", key, value) } // Set indicates an expected call of Set. func (mr *MockInterfaceMockRecorder) Set(key, value interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Set", reflect.TypeOf((*MockInterface)(nil).Set), key, value) } // SetDefault mocks base method. func (m *MockInterface) SetDefault(key string, value interface{}) { m.ctrl.T.Helper() m.ctrl.Call(m, "SetDefault", key, value) } // SetDefault indicates an expected call of SetDefault. func (mr *MockInterfaceMockRecorder) SetDefault(key, value interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetDefault", reflect.TypeOf((*MockInterface)(nil).SetDefault), key, value) } // Sub mocks base method. func (m *MockInterface) Sub(key string) config.Interface { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Sub", key) ret0, _ := ret[0].(config.Interface) return ret0 } // Sub indicates an expected call of Sub. func (mr *MockInterfaceMockRecorder) Sub(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Sub", reflect.TypeOf((*MockInterface)(nil).Sub), key) } // SubKeys mocks base method. func (m *MockInterface) SubKeys(key string) []string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SubKeys", key) ret0, _ := ret[0].([]string) return ret0 } // SubKeys indicates an expected call of SubKeys. func (mr *MockInterfaceMockRecorder) SubKeys(key interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubKeys", reflect.TypeOf((*MockInterface)(nil).SubKeys), key) } // UnmarshalKey mocks base method. func (m *MockInterface) UnmarshalKey(key string, rawVal interface{}, decoderOpts ...viper.DecoderConfigOption) error { m.ctrl.T.Helper() varargs := []interface{}{key, rawVal} for _, a := range decoderOpts { varargs = append(varargs, a) } ret := m.ctrl.Call(m, "UnmarshalKey", varargs...) ret0, _ := ret[0].(error) return ret0 } // UnmarshalKey indicates an expected call of UnmarshalKey. func (mr *MockInterfaceMockRecorder) UnmarshalKey(key, rawVal interface{}, decoderOpts ...interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() varargs := append([]interface{}{key, rawVal}, decoderOpts...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnmarshalKey", reflect.TypeOf((*MockInterface)(nil).UnmarshalKey), varargs...) } // WriteConfig mocks base method. func (m *MockInterface) WriteConfig() error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "WriteConfig") ret0, _ := ret[0].(error) return ret0 } // WriteConfig indicates an expected call of WriteConfig. func (mr *MockInterfaceMockRecorder) WriteConfig() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteConfig", reflect.TypeOf((*MockInterface)(nil).WriteConfig)) } ================================================ FILE: webapp/backend/pkg/constants.go ================================================ package pkg const DeviceProtocolAta = "ATA" const DeviceProtocolScsi = "SCSI" const DeviceProtocolNvme = "NVMe" //go:generate stringer -type=AttributeStatus // AttributeStatus bitwise flag, 1,2,4,8,16,32,etc type AttributeStatus uint8 const ( AttributeStatusPassed AttributeStatus = 0 AttributeStatusFailedSmart AttributeStatus = 1 AttributeStatusWarningScrutiny AttributeStatus = 2 AttributeStatusFailedScrutiny AttributeStatus = 4 ) const AttributeWhenFailedFailingNow = "FAILING_NOW" const AttributeWhenFailedInThePast = "IN_THE_PAST" func AttributeStatusSet(b, flag AttributeStatus) AttributeStatus { return b | flag } func AttributeStatusClear(b, flag AttributeStatus) AttributeStatus { return b &^ flag } func AttributeStatusToggle(b, flag AttributeStatus) AttributeStatus { return b ^ flag } func AttributeStatusHas(b, flag AttributeStatus) bool { return b&flag != 0 } //go:generate stringer -type=DeviceStatus // DeviceStatus bitwise flag, 1,2,4,8,16,32,etc type DeviceStatus uint8 const ( DeviceStatusPassed DeviceStatus = 0 DeviceStatusFailedSmart DeviceStatus = 1 DeviceStatusFailedScrutiny DeviceStatus = 2 ) func DeviceStatusSet(b, flag DeviceStatus) DeviceStatus { return b | flag } func DeviceStatusClear(b, flag DeviceStatus) DeviceStatus { return b &^ flag } func DeviceStatusToggle(b, flag DeviceStatus) DeviceStatus { return b ^ flag } func DeviceStatusHas(b, flag DeviceStatus) bool { return b&flag != 0 } // Metrics Specific Filtering & Threshold Constants type MetricsNotifyLevel int64 const ( MetricsNotifyLevelWarn MetricsNotifyLevel = 1 MetricsNotifyLevelFail MetricsNotifyLevel = 2 ) type MetricsStatusFilterAttributes int64 const ( MetricsStatusFilterAttributesAll MetricsStatusFilterAttributes = 0 MetricsStatusFilterAttributesCritical MetricsStatusFilterAttributes = 1 ) // MetricsStatusThreshold bitwise flag, 1,2,4,8,16,32,etc type MetricsStatusThreshold int64 const ( MetricsStatusThresholdSmart MetricsStatusThreshold = 1 MetricsStatusThresholdScrutiny MetricsStatusThreshold = 2 //shortcut MetricsStatusThresholdBoth MetricsStatusThreshold = 3 ) ================================================ FILE: webapp/backend/pkg/database/interface.go ================================================ package database import ( "context" "github.com/analogj/scrutiny/webapp/backend/pkg" "github.com/analogj/scrutiny/webapp/backend/pkg/models" "github.com/analogj/scrutiny/webapp/backend/pkg/models/collector" "github.com/analogj/scrutiny/webapp/backend/pkg/models/measurements" ) // Create mock using: // mockgen -source=webapp/backend/pkg/database/interface.go -destination=webapp/backend/pkg/database/mock/mock_database.go type DeviceRepo interface { Close() error HealthCheck(ctx context.Context) error RegisterDevice(ctx context.Context, dev models.Device) error GetDevices(ctx context.Context) ([]models.Device, error) UpdateDevice(ctx context.Context, wwn string, collectorSmartData collector.SmartInfo) (models.Device, error) UpdateDeviceStatus(ctx context.Context, wwn string, status pkg.DeviceStatus) (models.Device, error) GetDeviceDetails(ctx context.Context, wwn string) (models.Device, error) UpdateDeviceArchived(ctx context.Context, wwn string, archived bool) error DeleteDevice(ctx context.Context, wwn string) error SaveSmartAttributes(ctx context.Context, wwn string, collectorSmartData collector.SmartInfo) (measurements.Smart, error) GetSmartAttributeHistory(ctx context.Context, wwn string, durationKey string, selectEntries int, selectEntriesOffset int, attributes []string) ([]measurements.Smart, error) SaveSmartTemperature(ctx context.Context, wwn string, deviceProtocol string, collectorSmartData collector.SmartInfo, discardSCTTempHistory bool) error GetSummary(ctx context.Context) (map[string]*models.DeviceSummary, error) GetSmartTemperatureHistory(ctx context.Context, durationKey string) (map[string][]measurements.SmartTemperature, error) LoadSettings(ctx context.Context) (*models.Settings, error) SaveSettings(ctx context.Context, settings models.Settings) error } ================================================ FILE: webapp/backend/pkg/database/migrations/m20201107210306/device.go ================================================ package m20201107210306 import ( "time" ) // Deprecated: m20201107210306.Device is deprecated, only used by db migrations type Device struct { //GORM attributes, see: http://gorm.io/docs/conventions.html CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time WWN string `json:"wwn" gorm:"primary_key"` HostId string `json:"host_id"` DeviceName string `json:"device_name"` Manufacturer string `json:"manufacturer"` ModelName string `json:"model_name"` InterfaceType string `json:"interface_type"` InterfaceSpeed string `json:"interface_speed"` SerialNumber string `json:"serial_number"` Firmware string `json:"firmware"` RotationSpeed int `json:"rotational_speed"` Capacity int64 `json:"capacity"` FormFactor string `json:"form_factor"` SmartSupport bool `json:"smart_support"` DeviceProtocol string `json:"device_protocol"` //protocol determines which smart attribute types are available (ATA, NVMe, SCSI) DeviceType string `json:"device_type"` //device type is used for querying with -d/t flag, should only be used by collector. SmartResults []Smart `gorm:"foreignkey:DeviceWWN" json:"smart_results"` } const DeviceProtocolAta = "ATA" const DeviceProtocolScsi = "SCSI" const DeviceProtocolNvme = "NVMe" func (dv *Device) IsAta() bool { return dv.DeviceProtocol == DeviceProtocolAta } func (dv *Device) IsScsi() bool { return dv.DeviceProtocol == DeviceProtocolScsi } func (dv *Device) IsNvme() bool { return dv.DeviceProtocol == DeviceProtocolNvme } ================================================ FILE: webapp/backend/pkg/database/migrations/m20201107210306/smart.go ================================================ package m20201107210306 import ( "gorm.io/gorm" "time" ) // Deprecated: m20201107210306.Smart is deprecated, only used by db migrations type Smart struct { gorm.Model DeviceWWN string `json:"device_wwn"` Device Device `json:"-" gorm:"foreignkey:DeviceWWN"` // use DeviceWWN as foreign key TestDate time.Time `json:"date"` SmartStatus string `json:"smart_status"` // SmartStatusPassed or SmartStatusFailed //Metrics Temp int64 `json:"temp"` PowerOnHours int64 `json:"power_on_hours"` PowerCycleCount int64 `json:"power_cycle_count"` AtaAttributes []SmartAtaAttribute `json:"ata_attributes" gorm:"foreignkey:SmartId"` NvmeAttributes []SmartNvmeAttribute `json:"nvme_attributes" gorm:"foreignkey:SmartId"` ScsiAttributes []SmartScsiAttribute `json:"scsi_attributes" gorm:"foreignkey:SmartId"` } ================================================ FILE: webapp/backend/pkg/database/migrations/m20201107210306/smart_ata_attribute.go ================================================ package m20201107210306 import "gorm.io/gorm" // Deprecated: m20201107210306.SmartAtaAttribute is deprecated, only used by db migrations type SmartAtaAttribute struct { gorm.Model SmartId int `json:"smart_id"` Smart Device `json:"-" gorm:"foreignkey:SmartId"` // use SmartId as foreign key AttributeId int `json:"attribute_id"` Name string `json:"name"` Value int `json:"value"` Worst int `json:"worst"` Threshold int `json:"thresh"` RawValue int64 `json:"raw_value"` RawString string `json:"raw_string"` WhenFailed string `json:"when_failed"` TransformedValue int64 `json:"transformed_value"` Status string `gorm:"-" json:"status,omitempty"` StatusReason string `gorm:"-" json:"status_reason,omitempty"` FailureRate float64 `gorm:"-" json:"failure_rate,omitempty"` History []SmartAtaAttribute `gorm:"-" json:"history,omitempty"` } ================================================ FILE: webapp/backend/pkg/database/migrations/m20201107210306/smart_nvme_attribute.go ================================================ package m20201107210306 import "gorm.io/gorm" // Deprecated: m20201107210306.SmartNvmeAttribute is deprecated, only used by db migrations type SmartNvmeAttribute struct { gorm.Model SmartId int `json:"smart_id"` Smart Device `json:"-" gorm:"foreignkey:SmartId"` // use SmartId as foreign key AttributeId string `json:"attribute_id"` //json string from smartctl Name string `json:"name"` Value int `json:"value"` Threshold int `json:"thresh"` TransformedValue int64 `json:"transformed_value"` Status string `gorm:"-" json:"status,omitempty"` StatusReason string `gorm:"-" json:"status_reason,omitempty"` FailureRate float64 `gorm:"-" json:"failure_rate,omitempty"` History []SmartNvmeAttribute `gorm:"-" json:"history,omitempty"` } ================================================ FILE: webapp/backend/pkg/database/migrations/m20201107210306/smart_scsci_attribute.go ================================================ package m20201107210306 import "gorm.io/gorm" // Deprecated: m20201107210306.SmartScsiAttribute is deprecated, only used by db migrations type SmartScsiAttribute struct { gorm.Model SmartId int `json:"smart_id"` Smart Device `json:"-" gorm:"foreignkey:SmartId"` // use SmartId as foreign key AttributeId string `json:"attribute_id"` //json string from smartctl Name string `json:"name"` Value int `json:"value"` Threshold int `json:"thresh"` TransformedValue int64 `json:"transformed_value"` Status string `gorm:"-" json:"status,omitempty"` StatusReason string `gorm:"-" json:"status_reason,omitempty"` FailureRate float64 `gorm:"-" json:"failure_rate,omitempty"` History []SmartScsiAttribute `gorm:"-" json:"history,omitempty"` } ================================================ FILE: webapp/backend/pkg/database/migrations/m20220503120000/device.go ================================================ package m20220503120000 import ( "github.com/analogj/scrutiny/webapp/backend/pkg" "time" ) // Deprecated: m20220503120000.Device is deprecated, only used by db migrations type Device struct { //GORM attributes, see: http://gorm.io/docs/conventions.html CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time WWN string `json:"wwn" gorm:"primary_key"` DeviceName string `json:"device_name"` Manufacturer string `json:"manufacturer"` ModelName string `json:"model_name"` InterfaceType string `json:"interface_type"` InterfaceSpeed string `json:"interface_speed"` SerialNumber string `json:"serial_number"` Firmware string `json:"firmware"` RotationSpeed int `json:"rotational_speed"` Capacity int64 `json:"capacity"` FormFactor string `json:"form_factor"` SmartSupport bool `json:"smart_support"` DeviceProtocol string `json:"device_protocol"` //protocol determines which smart attribute types are available (ATA, NVMe, SCSI) DeviceType string `json:"device_type"` //device type is used for querying with -d/t flag, should only be used by collector. // User provided metadata Label string `json:"label"` HostId string `json:"host_id"` // Data set by Scrutiny DeviceStatus pkg.DeviceStatus `json:"device_status"` } ================================================ FILE: webapp/backend/pkg/database/migrations/m20220509170100/device.go ================================================ package m20220509170100 import ( "github.com/analogj/scrutiny/webapp/backend/pkg" "time" ) // Deprecated: m20220509170100.Device is deprecated, only used by db migrations type Device struct { //GORM attributes, see: http://gorm.io/docs/conventions.html CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time WWN string `json:"wwn" gorm:"primary_key"` DeviceName string `json:"device_name"` DeviceUUID string `json:"device_uuid"` DeviceSerialID string `json:"device_serial_id"` DeviceLabel string `json:"device_label"` Manufacturer string `json:"manufacturer"` ModelName string `json:"model_name"` InterfaceType string `json:"interface_type"` InterfaceSpeed string `json:"interface_speed"` SerialNumber string `json:"serial_number"` Firmware string `json:"firmware"` RotationSpeed int `json:"rotational_speed"` Capacity int64 `json:"capacity"` FormFactor string `json:"form_factor"` SmartSupport bool `json:"smart_support"` DeviceProtocol string `json:"device_protocol"` //protocol determines which smart attribute types are available (ATA, NVMe, SCSI) DeviceType string `json:"device_type"` //device type is used for querying with -d/t flag, should only be used by collector. // User provided metadata Label string `json:"label"` HostId string `json:"host_id"` // Data set by Scrutiny DeviceStatus pkg.DeviceStatus `json:"device_status"` } ================================================ FILE: webapp/backend/pkg/database/migrations/m20220716214900/setting.go ================================================ package m20220716214900 import ( "gorm.io/gorm" ) type Setting struct { //GORM attributes, see: http://gorm.io/docs/conventions.html gorm.Model SettingKeyName string `json:"setting_key_name"` SettingKeyDescription string `json:"setting_key_description"` SettingDataType string `json:"setting_data_type"` SettingValueNumeric int `json:"setting_value_numeric"` SettingValueString string `json:"setting_value_string"` SettingValueBool bool `json:"setting_value_bool"` } ================================================ FILE: webapp/backend/pkg/database/migrations/m20250221084400/device.go ================================================ package m20250221084400 import ( "github.com/analogj/scrutiny/webapp/backend/pkg" "time" ) type Device struct { Archived bool `json:"archived"` //GORM attributes, see: http://gorm.io/docs/conventions.html CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time WWN string `json:"wwn" gorm:"primary_key"` DeviceName string `json:"device_name"` DeviceUUID string `json:"device_uuid"` DeviceSerialID string `json:"device_serial_id"` DeviceLabel string `json:"device_label"` Manufacturer string `json:"manufacturer"` ModelName string `json:"model_name"` InterfaceType string `json:"interface_type"` InterfaceSpeed string `json:"interface_speed"` SerialNumber string `json:"serial_number"` Firmware string `json:"firmware"` RotationSpeed int `json:"rotational_speed"` Capacity int64 `json:"capacity"` FormFactor string `json:"form_factor"` SmartSupport bool `json:"smart_support"` DeviceProtocol string `json:"device_protocol"` //protocol determines which smart attribute types are available (ATA, NVMe, SCSI) DeviceType string `json:"device_type"` //device type is used for querying with -d/t flag, should only be used by collector. // User provided metadata Label string `json:"label"` HostId string `json:"host_id"` // Data set by Scrutiny DeviceStatus pkg.DeviceStatus `json:"device_status"` } ================================================ FILE: webapp/backend/pkg/database/mock/mock_database.go ================================================ // Code generated by MockGen. DO NOT EDIT. // Source: webapp/backend/pkg/database/interface.go // Package mock_database is a generated GoMock package. package mock_database import ( context "context" reflect "reflect" pkg "github.com/analogj/scrutiny/webapp/backend/pkg" models "github.com/analogj/scrutiny/webapp/backend/pkg/models" collector "github.com/analogj/scrutiny/webapp/backend/pkg/models/collector" measurements "github.com/analogj/scrutiny/webapp/backend/pkg/models/measurements" gomock "go.uber.org/mock/gomock" ) // MockDeviceRepo is a mock of DeviceRepo interface. type MockDeviceRepo struct { ctrl *gomock.Controller recorder *MockDeviceRepoMockRecorder } // MockDeviceRepoMockRecorder is the mock recorder for MockDeviceRepo. type MockDeviceRepoMockRecorder struct { mock *MockDeviceRepo } // NewMockDeviceRepo creates a new mock instance. func NewMockDeviceRepo(ctrl *gomock.Controller) *MockDeviceRepo { mock := &MockDeviceRepo{ctrl: ctrl} mock.recorder = &MockDeviceRepoMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use. func (m *MockDeviceRepo) EXPECT() *MockDeviceRepoMockRecorder { return m.recorder } // Close mocks base method. func (m *MockDeviceRepo) Close() error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Close") ret0, _ := ret[0].(error) return ret0 } // Close indicates an expected call of Close. func (mr *MockDeviceRepoMockRecorder) Close() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*MockDeviceRepo)(nil).Close)) } // UpdateDeviceArchived mocks base method. func (m *MockDeviceRepo) UpdateDeviceArchived(ctx context.Context, wwn string, archived bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UpdateDeviceArchived", ctx, wwn) ret0, _ := ret[0].(error) return ret0 } // UpdateDeviceArchived indicates an expected call of UpdateDeviceArchived. func (mr *MockDeviceRepoMockRecorder) UpdateDeviceArchived(ctx, wwn, archived interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDeviceArchived", reflect.TypeOf((*MockDeviceRepo)(nil).UpdateDeviceArchived), ctx, wwn, archived) } // DeleteDevice mocks base method. func (m *MockDeviceRepo) DeleteDevice(ctx context.Context, wwn string) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "DeleteDevice", ctx, wwn) ret0, _ := ret[0].(error) return ret0 } // DeleteDevice indicates an expected call of DeleteDevice. func (mr *MockDeviceRepoMockRecorder) DeleteDevice(ctx, wwn interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteDevice", reflect.TypeOf((*MockDeviceRepo)(nil).DeleteDevice), ctx, wwn) } // GetDeviceDetails mocks base method. func (m *MockDeviceRepo) GetDeviceDetails(ctx context.Context, wwn string) (models.Device, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetDeviceDetails", ctx, wwn) ret0, _ := ret[0].(models.Device) ret1, _ := ret[1].(error) return ret0, ret1 } // GetDeviceDetails indicates an expected call of GetDeviceDetails. func (mr *MockDeviceRepoMockRecorder) GetDeviceDetails(ctx, wwn interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDeviceDetails", reflect.TypeOf((*MockDeviceRepo)(nil).GetDeviceDetails), ctx, wwn) } // GetDevices mocks base method. func (m *MockDeviceRepo) GetDevices(ctx context.Context) ([]models.Device, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetDevices", ctx) ret0, _ := ret[0].([]models.Device) ret1, _ := ret[1].(error) return ret0, ret1 } // GetDevices indicates an expected call of GetDevices. func (mr *MockDeviceRepoMockRecorder) GetDevices(ctx interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDevices", reflect.TypeOf((*MockDeviceRepo)(nil).GetDevices), ctx) } // GetSmartAttributeHistory mocks base method. func (m *MockDeviceRepo) GetSmartAttributeHistory(ctx context.Context, wwn, durationKey string, selectEntries, selectEntriesOffset int, attributes []string) ([]measurements.Smart, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetSmartAttributeHistory", ctx, wwn, durationKey, selectEntries, selectEntriesOffset, attributes) ret0, _ := ret[0].([]measurements.Smart) ret1, _ := ret[1].(error) return ret0, ret1 } // GetSmartAttributeHistory indicates an expected call of GetSmartAttributeHistory. func (mr *MockDeviceRepoMockRecorder) GetSmartAttributeHistory(ctx, wwn, durationKey, selectEntries, selectEntriesOffset, attributes interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSmartAttributeHistory", reflect.TypeOf((*MockDeviceRepo)(nil).GetSmartAttributeHistory), ctx, wwn, durationKey, selectEntries, selectEntriesOffset, attributes) } // GetSmartTemperatureHistory mocks base method. func (m *MockDeviceRepo) GetSmartTemperatureHistory(ctx context.Context, durationKey string) (map[string][]measurements.SmartTemperature, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetSmartTemperatureHistory", ctx, durationKey) ret0, _ := ret[0].(map[string][]measurements.SmartTemperature) ret1, _ := ret[1].(error) return ret0, ret1 } // GetSmartTemperatureHistory indicates an expected call of GetSmartTemperatureHistory. func (mr *MockDeviceRepoMockRecorder) GetSmartTemperatureHistory(ctx, durationKey interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSmartTemperatureHistory", reflect.TypeOf((*MockDeviceRepo)(nil).GetSmartTemperatureHistory), ctx, durationKey) } // GetSummary mocks base method. func (m *MockDeviceRepo) GetSummary(ctx context.Context) (map[string]*models.DeviceSummary, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetSummary", ctx) ret0, _ := ret[0].(map[string]*models.DeviceSummary) ret1, _ := ret[1].(error) return ret0, ret1 } // GetSummary indicates an expected call of GetSummary. func (mr *MockDeviceRepoMockRecorder) GetSummary(ctx interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSummary", reflect.TypeOf((*MockDeviceRepo)(nil).GetSummary), ctx) } // HealthCheck mocks base method. func (m *MockDeviceRepo) HealthCheck(ctx context.Context) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "HealthCheck", ctx) ret0, _ := ret[0].(error) return ret0 } // HealthCheck indicates an expected call of HealthCheck. func (mr *MockDeviceRepoMockRecorder) HealthCheck(ctx interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HealthCheck", reflect.TypeOf((*MockDeviceRepo)(nil).HealthCheck), ctx) } // LoadSettings mocks base method. func (m *MockDeviceRepo) LoadSettings(ctx context.Context) (*models.Settings, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LoadSettings", ctx) ret0, _ := ret[0].(*models.Settings) ret1, _ := ret[1].(error) return ret0, ret1 } // LoadSettings indicates an expected call of LoadSettings. func (mr *MockDeviceRepoMockRecorder) LoadSettings(ctx interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LoadSettings", reflect.TypeOf((*MockDeviceRepo)(nil).LoadSettings), ctx) } // RegisterDevice mocks base method. func (m *MockDeviceRepo) RegisterDevice(ctx context.Context, dev models.Device) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "RegisterDevice", ctx, dev) ret0, _ := ret[0].(error) return ret0 } // RegisterDevice indicates an expected call of RegisterDevice. func (mr *MockDeviceRepoMockRecorder) RegisterDevice(ctx, dev interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterDevice", reflect.TypeOf((*MockDeviceRepo)(nil).RegisterDevice), ctx, dev) } // SaveSettings mocks base method. func (m *MockDeviceRepo) SaveSettings(ctx context.Context, settings models.Settings) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SaveSettings", ctx, settings) ret0, _ := ret[0].(error) return ret0 } // SaveSettings indicates an expected call of SaveSettings. func (mr *MockDeviceRepoMockRecorder) SaveSettings(ctx, settings interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SaveSettings", reflect.TypeOf((*MockDeviceRepo)(nil).SaveSettings), ctx, settings) } // SaveSmartAttributes mocks base method. func (m *MockDeviceRepo) SaveSmartAttributes(ctx context.Context, wwn string, collectorSmartData collector.SmartInfo) (measurements.Smart, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SaveSmartAttributes", ctx, wwn, collectorSmartData) ret0, _ := ret[0].(measurements.Smart) ret1, _ := ret[1].(error) return ret0, ret1 } // SaveSmartAttributes indicates an expected call of SaveSmartAttributes. func (mr *MockDeviceRepoMockRecorder) SaveSmartAttributes(ctx, wwn, collectorSmartData interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SaveSmartAttributes", reflect.TypeOf((*MockDeviceRepo)(nil).SaveSmartAttributes), ctx, wwn, collectorSmartData) } // SaveSmartTemperature mocks base method. func (m *MockDeviceRepo) SaveSmartTemperature(ctx context.Context, wwn, deviceProtocol string, collectorSmartData collector.SmartInfo, discardSCTTempHistory bool) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "SaveSmartTemperature", ctx, wwn, deviceProtocol, collectorSmartData, discardSCTTempHistory) ret0, _ := ret[0].(error) return ret0 } // SaveSmartTemperature indicates an expected call of SaveSmartTemperature. func (mr *MockDeviceRepoMockRecorder) SaveSmartTemperature(ctx, wwn, deviceProtocol, collectorSmartData, discardSCTTempHistory interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SaveSmartTemperature", reflect.TypeOf((*MockDeviceRepo)(nil).SaveSmartTemperature), ctx, wwn, deviceProtocol, collectorSmartData, discardSCTTempHistory) } // UpdateDevice mocks base method. func (m *MockDeviceRepo) UpdateDevice(ctx context.Context, wwn string, collectorSmartData collector.SmartInfo) (models.Device, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UpdateDevice", ctx, wwn, collectorSmartData) ret0, _ := ret[0].(models.Device) ret1, _ := ret[1].(error) return ret0, ret1 } // UpdateDevice indicates an expected call of UpdateDevice. func (mr *MockDeviceRepoMockRecorder) UpdateDevice(ctx, wwn, collectorSmartData interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDevice", reflect.TypeOf((*MockDeviceRepo)(nil).UpdateDevice), ctx, wwn, collectorSmartData) } // UpdateDeviceStatus mocks base method. func (m *MockDeviceRepo) UpdateDeviceStatus(ctx context.Context, wwn string, status pkg.DeviceStatus) (models.Device, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UpdateDeviceStatus", ctx, wwn, status) ret0, _ := ret[0].(models.Device) ret1, _ := ret[1].(error) return ret0, ret1 } // UpdateDeviceStatus indicates an expected call of UpdateDeviceStatus. func (mr *MockDeviceRepoMockRecorder) UpdateDeviceStatus(ctx, wwn, status interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDeviceStatus", reflect.TypeOf((*MockDeviceRepo)(nil).UpdateDeviceStatus), ctx, wwn, status) } ================================================ FILE: webapp/backend/pkg/database/scrutiny_repository.go ================================================ package database import ( "context" "crypto/tls" "encoding/json" "fmt" "io" "net/http" "net/url" "time" "github.com/analogj/scrutiny/webapp/backend/pkg/config" "github.com/analogj/scrutiny/webapp/backend/pkg/models" "github.com/glebarez/sqlite" influxdb2 "github.com/influxdata/influxdb-client-go/v2" "github.com/influxdata/influxdb-client-go/v2/api" "github.com/influxdata/influxdb-client-go/v2/domain" "github.com/sirupsen/logrus" "gorm.io/gorm" ) const ( // 60seconds * 60minutes * 24hours * 15 days RETENTION_PERIOD_15_DAYS_IN_SECONDS = 1_296_000 // 60seconds * 60minutes * 24hours * 7 days * 9 weeks RETENTION_PERIOD_9_WEEKS_IN_SECONDS = 5_443_200 // 60seconds * 60minutes * 24hours * 7 days * (52 + 52 + 4)weeks RETENTION_PERIOD_25_MONTHS_IN_SECONDS = 65_318_400 DURATION_KEY_DAY = "day" DURATION_KEY_WEEK = "week" DURATION_KEY_MONTH = "month" DURATION_KEY_YEAR = "year" DURATION_KEY_FOREVER = "forever" ) //// GormLogger is a custom logger for Gorm, making it use logrus. //type GormLogger struct{ Logger logrus.FieldLogger } // //// Print handles log events from Gorm for the custom logger. //func (gl *GormLogger) Print(v ...interface{}) { // switch v[0] { // case "sql": // gl.Logger.WithFields( // logrus.Fields{ // "module": "gorm", // "type": "sql", // "rows": v[5], // "src_ref": v[1], // "values": v[4], // }, // ).Debug(v[3]) // case "log": // gl.Logger.WithFields(logrus.Fields{"module": "gorm", "type": "log"}).Print(v[2]) // } //} func NewScrutinyRepository(appConfig config.Interface, globalLogger logrus.FieldLogger) (DeviceRepo, error) { backgroundContext := context.Background() //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Gorm/SQLite setup //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// globalLogger.Infof("Trying to connect to scrutiny sqlite db: %s\n", appConfig.GetString("web.database.location")) // When a transaction cannot lock the database, because it is already locked by another one, // SQLite by default throws an error: database is locked. This behavior is usually not appropriate when // concurrent access is needed, typically when multiple processes write to the same database. // PRAGMA busy_timeout lets you set a timeout or a handler for these events. When setting a timeout, // SQLite will try the transaction multiple times within this timeout. // fixes #341 // https://rsqlite.r-dbi.org/reference/sqlitesetbusyhandler // retrying for 30000 milliseconds, 30seconds - this would be unreasonable for a distributed multi-tenant application, // but should be fine for local usage. pragmaStr := sqlitePragmaString(map[string]string{ "busy_timeout": "30000", }) database, err := gorm.Open(sqlite.Open(appConfig.GetString("web.database.location")+pragmaStr), &gorm.Config{ //TODO: figure out how to log database queries again. //Logger: logger DisableForeignKeyConstraintWhenMigrating: true, }) if err != nil { return nil, fmt.Errorf("failed to connect to database! - %v", err) } globalLogger.Infof("Successfully connected to scrutiny sqlite db: %s\n", appConfig.GetString("web.database.location")) //database.SetLogger() //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // InfluxDB setup //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Create a new client using an InfluxDB server base URL and an authentication token influxdbUrl := fmt.Sprintf("%s://%s:%s", appConfig.GetString("web.influxdb.scheme"), appConfig.GetString("web.influxdb.host"), appConfig.GetString("web.influxdb.port")) globalLogger.Debugf("InfluxDB url: %s", influxdbUrl) tlsConfig := &tls.Config{ InsecureSkipVerify: appConfig.GetBool("web.influxdb.tls.insecure_skip_verify"), } globalLogger.Infof("InfluxDB certificate verification: %t\n", !tlsConfig.InsecureSkipVerify) client := influxdb2.NewClientWithOptions( influxdbUrl, appConfig.GetString("web.influxdb.token"), influxdb2.DefaultOptions().SetTLSConfig(tlsConfig), ) //if !appConfig.IsSet("web.influxdb.token") { globalLogger.Debugf("Determine Influxdb setup status...") influxSetupComplete, err := InfluxSetupComplete(influxdbUrl, tlsConfig) if err != nil { return nil, fmt.Errorf("failed to check influxdb setup status - %w", err) } if !influxSetupComplete { globalLogger.Debugf("Influxdb un-initialized, running first-time setup...") // if no token is provided, but we have a valid server, we're going to assume this is the first setup of our server. // we will initialize with a predetermined username & password, that you should change. // metrics bucket will have a retention period of 8 days (since it will be down-sampled once a week) // in seconds (60seconds * 60minutes * 24hours * 15 days) = 1_296_000 (see EnsureBucket() function) _, err := client.SetupWithToken( backgroundContext, appConfig.GetString("web.influxdb.init_username"), appConfig.GetString("web.influxdb.init_password"), appConfig.GetString("web.influxdb.org"), appConfig.GetString("web.influxdb.bucket"), 0, appConfig.GetString("web.influxdb.token"), ) if err != nil { return nil, err } } // Use blocking write client for writes to desired bucket writeAPI := client.WriteAPIBlocking(appConfig.GetString("web.influxdb.org"), appConfig.GetString("web.influxdb.bucket")) // Get query client queryAPI := client.QueryAPI(appConfig.GetString("web.influxdb.org")) // Get task client taskAPI := client.TasksAPI() if writeAPI == nil || queryAPI == nil || taskAPI == nil { return nil, fmt.Errorf("failed to connect to influxdb") } deviceRepo := scrutinyRepository{ appConfig: appConfig, logger: globalLogger, influxClient: client, influxWriteApi: writeAPI, influxQueryApi: queryAPI, influxTaskApi: taskAPI, gormClient: database, } orgInfo, err := client.OrganizationsAPI().FindOrganizationByName(backgroundContext, appConfig.GetString("web.influxdb.org")) if err != nil { return nil, err } // Initialize Buckets (if necessary) err = deviceRepo.EnsureBuckets(backgroundContext, orgInfo) if err != nil { return nil, err } // Initialize Background Tasks err = deviceRepo.EnsureTasks(backgroundContext, *orgInfo.Id) if err != nil { return nil, err } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // InfluxDB & SQLite migrations //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //database.AutoMigrate(&models.Device{}) err = deviceRepo.Migrate(backgroundContext) if err != nil { return nil, err } return &deviceRepo, nil } type scrutinyRepository struct { appConfig config.Interface logger logrus.FieldLogger influxWriteApi api.WriteAPIBlocking influxQueryApi api.QueryAPI influxTaskApi api.TasksAPI influxClient influxdb2.Client gormClient *gorm.DB } func (sr *scrutinyRepository) Close() error { sr.influxClient.Close() return nil } func (sr *scrutinyRepository) HealthCheck(ctx context.Context) error { //check influxdb status, err := sr.influxClient.Health(ctx) if err != nil { return fmt.Errorf("influxdb healthcheck failed: %w", err) } if status.Status != "pass" { return fmt.Errorf("influxdb healthcheckf failed: status=%s", status.Status) } //check sqlite db. database, err := sr.gormClient.DB() if err != nil { return fmt.Errorf("sqlite healthcheck failed: %w", err) } err = database.Ping() if err != nil { return fmt.Errorf("sqlite healthcheck failed during ping: %w", err) } return nil } func InfluxSetupComplete(influxEndpoint string, tlsConfig *tls.Config) (bool, error) { influxUri, err := url.Parse(influxEndpoint) if err != nil { return false, err } influxUri, err = influxUri.Parse("/api/v2/setup") if err != nil { return false, err } client := &http.Client{Transport: &http.Transport{TLSClientConfig: tlsConfig}} res, err := client.Get(influxUri.String()) if err != nil { return false, err } body, err := io.ReadAll(res.Body) if err != nil { return false, err } type SetupStatus struct { Allowed bool `json:"allowed"` } var data SetupStatus err = json.Unmarshal(body, &data) if err != nil { return false, err } return !data.Allowed, nil } func (sr *scrutinyRepository) EnsureBuckets(ctx context.Context, org *domain.Organization) error { var mainBucketRetentionRule domain.RetentionRule var weeklyBucketRetentionRule domain.RetentionRule var monthlyBucketRetentionRule domain.RetentionRule if sr.appConfig.GetBool("web.influxdb.retention_policy") { // in tests, we may not want to set a retention policy. If "false", we can set data with old timestamps, // then manually run the down sampling scripts. This should be true for production environments. mainBucketRetentionRule = domain.RetentionRule{EverySeconds: RETENTION_PERIOD_15_DAYS_IN_SECONDS} weeklyBucketRetentionRule = domain.RetentionRule{EverySeconds: RETENTION_PERIOD_9_WEEKS_IN_SECONDS} monthlyBucketRetentionRule = domain.RetentionRule{EverySeconds: RETENTION_PERIOD_25_MONTHS_IN_SECONDS} } mainBucket := sr.appConfig.GetString("web.influxdb.bucket") if foundMainBucket, foundErr := sr.influxClient.BucketsAPI().FindBucketByName(ctx, mainBucket); foundErr != nil { // metrics bucket will have a retention period of 15 days (since it will be down-sampled once a week) _, err := sr.influxClient.BucketsAPI().CreateBucketWithName(ctx, org, mainBucket, mainBucketRetentionRule) if err != nil { return err } } else if sr.appConfig.GetBool("web.influxdb.retention_policy") { //correctly set the retention period for the main bucket (cant do it during setup/creation) foundMainBucket.RetentionRules = domain.RetentionRules{mainBucketRetentionRule} sr.influxClient.BucketsAPI().UpdateBucket(ctx, foundMainBucket) } //create buckets (used for downsampling) weeklyBucket := fmt.Sprintf("%s_weekly", sr.appConfig.GetString("web.influxdb.bucket")) if foundWeeklyBucket, foundErr := sr.influxClient.BucketsAPI().FindBucketByName(ctx, weeklyBucket); foundErr != nil { // metrics_weekly bucket will have a retention period of 8+1 weeks (since it will be down-sampled once a month) _, err := sr.influxClient.BucketsAPI().CreateBucketWithName(ctx, org, weeklyBucket, weeklyBucketRetentionRule) if err != nil { return err } } else if sr.appConfig.GetBool("web.influxdb.retention_policy") { //correctly set the retention period for the bucket (may not be able to do it during setup/creation) foundWeeklyBucket.RetentionRules = domain.RetentionRules{weeklyBucketRetentionRule} sr.influxClient.BucketsAPI().UpdateBucket(ctx, foundWeeklyBucket) } monthlyBucket := fmt.Sprintf("%s_monthly", sr.appConfig.GetString("web.influxdb.bucket")) if foundMonthlyBucket, foundErr := sr.influxClient.BucketsAPI().FindBucketByName(ctx, monthlyBucket); foundErr != nil { // metrics_monthly bucket will have a retention period of 24+1 months (since it will be down-sampled once a year) _, err := sr.influxClient.BucketsAPI().CreateBucketWithName(ctx, org, monthlyBucket, monthlyBucketRetentionRule) if err != nil { return err } } else if sr.appConfig.GetBool("web.influxdb.retention_policy") { //correctly set the retention period for the bucket (may not be able to do it during setup/creation) foundMonthlyBucket.RetentionRules = domain.RetentionRules{monthlyBucketRetentionRule} sr.influxClient.BucketsAPI().UpdateBucket(ctx, foundMonthlyBucket) } yearlyBucket := fmt.Sprintf("%s_yearly", sr.appConfig.GetString("web.influxdb.bucket")) if _, foundErr := sr.influxClient.BucketsAPI().FindBucketByName(ctx, yearlyBucket); foundErr != nil { // metrics_yearly bucket will have an infinite retention period _, err := sr.influxClient.BucketsAPI().CreateBucketWithName(ctx, org, yearlyBucket) if err != nil { return err } } return nil } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DeviceSummary //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // get a map of all devices and associated SMART data func (sr *scrutinyRepository) GetSummary(ctx context.Context) (map[string]*models.DeviceSummary, error) { devices, err := sr.GetDevices(ctx) if err != nil { return nil, err } summaries := map[string]*models.DeviceSummary{} for _, device := range devices { summaries[device.WWN] = &models.DeviceSummary{Device: device} } // Get parser flux query result //appConfig.GetString("web.influxdb.bucket") queryStr := fmt.Sprintf(` import "influxdata/influxdb/schema" bucketBaseName = "%s" dailyData = from(bucket: bucketBaseName) |> range(start: -10y, stop: now()) |> filter(fn: (r) => r["_measurement"] == "smart" ) |> filter(fn: (r) => r["_field"] == "temp" or r["_field"] == "power_on_hours" or r["_field"] == "date") |> last() |> schema.fieldsAsCols() |> group(columns: ["device_wwn"]) weeklyData = from(bucket: bucketBaseName + "_weekly") |> range(start: -10y, stop: now()) |> filter(fn: (r) => r["_measurement"] == "smart" ) |> filter(fn: (r) => r["_field"] == "temp" or r["_field"] == "power_on_hours" or r["_field"] == "date") |> last() |> schema.fieldsAsCols() |> group(columns: ["device_wwn"]) monthlyData = from(bucket: bucketBaseName + "_monthly") |> range(start: -10y, stop: now()) |> filter(fn: (r) => r["_measurement"] == "smart" ) |> filter(fn: (r) => r["_field"] == "temp" or r["_field"] == "power_on_hours" or r["_field"] == "date") |> last() |> schema.fieldsAsCols() |> group(columns: ["device_wwn"]) yearlyData = from(bucket: bucketBaseName + "_yearly") |> range(start: -10y, stop: now()) |> filter(fn: (r) => r["_measurement"] == "smart" ) |> filter(fn: (r) => r["_field"] == "temp" or r["_field"] == "power_on_hours" or r["_field"] == "date") |> last() |> schema.fieldsAsCols() |> group(columns: ["device_wwn"]) union(tables: [dailyData, weeklyData, monthlyData, yearlyData]) |> sort(columns: ["_time"], desc: false) |> group(columns: ["device_wwn"]) |> last(column: "device_wwn") |> yield(name: "last") `, sr.appConfig.GetString("web.influxdb.bucket"), ) result, err := sr.influxQueryApi.Query(ctx, queryStr) if err == nil { // Use Next() to iterate over query result lines for result.Next() { // Observe when there is new grouping key producing new table if result.TableChanged() { //fmt.Printf("table: %s\n", result.TableMetadata().String()) } // read result //get summary data from Influxdb. //result.Record().Values() if deviceWWN, ok := result.Record().Values()["device_wwn"]; ok { //ensure summaries is intialized for this wwn if _, exists := summaries[deviceWWN.(string)]; !exists { summaries[deviceWWN.(string)] = &models.DeviceSummary{} } summaries[deviceWWN.(string)].SmartResults = &models.SmartSummary{ Temp: result.Record().Values()["temp"].(int64), PowerOnHours: result.Record().Values()["power_on_hours"].(int64), CollectorDate: result.Record().Values()["_time"].(time.Time), } } } if result.Err() != nil { fmt.Printf("Query error: %s\n", result.Err().Error()) } } else { return nil, err } deviceTempHistory, err := sr.GetSmartTemperatureHistory(ctx, DURATION_KEY_FOREVER) if err != nil { sr.logger.Printf("========================>>>>>>>>======================") sr.logger.Printf("========================>>>>>>>>======================") sr.logger.Printf("========================>>>>>>>>======================") sr.logger.Printf("========================>>>>>>>>======================") sr.logger.Printf("========================>>>>>>>>======================") sr.logger.Printf("Error: %v", err) } for wwn, tempHistory := range deviceTempHistory { summaries[wwn].TempHistory = tempHistory } return summaries, nil } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Helper Methods //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// func (sr *scrutinyRepository) lookupBucketName(durationKey string) string { switch durationKey { case DURATION_KEY_DAY: case DURATION_KEY_WEEK: //data stored in the last week return sr.appConfig.GetString("web.influxdb.bucket") case DURATION_KEY_MONTH: // data stored in the last month (after the first week) return fmt.Sprintf("%s_weekly", sr.appConfig.GetString("web.influxdb.bucket")) case DURATION_KEY_YEAR: // data stored in the last year (after the first month) return fmt.Sprintf("%s_monthly", sr.appConfig.GetString("web.influxdb.bucket")) case DURATION_KEY_FOREVER: //data stored before the last year return fmt.Sprintf("%s_yearly", sr.appConfig.GetString("web.influxdb.bucket")) } return sr.appConfig.GetString("web.influxdb.bucket") } func (sr *scrutinyRepository) lookupDuration(durationKey string) []string { switch durationKey { case DURATION_KEY_DAY: //data stored in the last day return []string{"-1d", "now()"} case DURATION_KEY_WEEK: //data stored in the last week return []string{"-1w", "now()"} case DURATION_KEY_MONTH: // data stored in the last month (after the first week) return []string{"-1mo", "-1w"} case DURATION_KEY_YEAR: // data stored in the last year (after the first month) return []string{"-1y", "-1mo"} case DURATION_KEY_FOREVER: //data stored before the last year return []string{"-10y", "-1y"} } return []string{"-1w", "now()"} } func (sr *scrutinyRepository) lookupResolution(durationKey string) string { switch durationKey { case DURATION_KEY_DAY: // Return data with higher resolution for daily summaries return "10m" default: // Return data with 1h resolution for other summaries return "1h" } } func (sr *scrutinyRepository) lookupNestedDurationKeys(durationKey string) []string { switch durationKey { case DURATION_KEY_DAY: //all data is stored in a single bucket, but we want a finer resolution return []string{DURATION_KEY_DAY} case DURATION_KEY_WEEK: //all data is stored in a single bucket return []string{DURATION_KEY_WEEK} case DURATION_KEY_MONTH: //data is stored in the week bucket and the month bucket return []string{DURATION_KEY_WEEK, DURATION_KEY_MONTH} case DURATION_KEY_YEAR: // data stored in the last year (after the first month) return []string{DURATION_KEY_WEEK, DURATION_KEY_MONTH, DURATION_KEY_YEAR} case DURATION_KEY_FOREVER: //data stored before the last year return []string{DURATION_KEY_WEEK, DURATION_KEY_MONTH, DURATION_KEY_YEAR, DURATION_KEY_FOREVER} } return []string{DURATION_KEY_WEEK} } func sqlitePragmaString(pragmas map[string]string) string { q := url.Values{} for key, val := range pragmas { q.Add("_pragma", key+"="+val) } queryStr := q.Encode() if len(queryStr) > 0 { return "?" + queryStr } return "" } ================================================ FILE: webapp/backend/pkg/database/scrutiny_repository_device.go ================================================ package database import ( "context" "fmt" "time" "github.com/analogj/scrutiny/webapp/backend/pkg" "github.com/analogj/scrutiny/webapp/backend/pkg/models" "github.com/analogj/scrutiny/webapp/backend/pkg/models/collector" "gorm.io/gorm/clause" ) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Device //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // insert device into DB (and update specified columns if device is already registered) // update device fields that may change: (DeviceType, HostID) func (sr *scrutinyRepository) RegisterDevice(ctx context.Context, dev models.Device) error { if err := sr.gormClient.WithContext(ctx).Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "wwn"}}, DoUpdates: clause.AssignmentColumns([]string{"host_id", "device_name", "device_type", "device_uuid", "device_serial_id", "device_label"}), }).Create(&dev).Error; err != nil { return err } return nil } // get a list of all devices (only device metadata, no SMART data) func (sr *scrutinyRepository) GetDevices(ctx context.Context) ([]models.Device, error) { //Get a list of all the active devices. devices := []models.Device{} if err := sr.gormClient.WithContext(ctx).Find(&devices).Error; err != nil { return nil, fmt.Errorf("could not get device summary from DB: %v", err) } return devices, nil } // update device (only metadata) from collector func (sr *scrutinyRepository) UpdateDevice(ctx context.Context, wwn string, collectorSmartData collector.SmartInfo) (models.Device, error) { var device models.Device if err := sr.gormClient.WithContext(ctx).Where("wwn = ?", wwn).First(&device).Error; err != nil { return device, fmt.Errorf("could not get device from DB: %v", err) } //TODO catch GormClient err err := device.UpdateFromCollectorSmartInfo(collectorSmartData) if err != nil { return device, err } return device, sr.gormClient.Model(&device).Updates(device).Error } // Update Device Status func (sr *scrutinyRepository) UpdateDeviceStatus(ctx context.Context, wwn string, status pkg.DeviceStatus) (models.Device, error) { var device models.Device if err := sr.gormClient.WithContext(ctx).Where("wwn = ?", wwn).First(&device).Error; err != nil { return device, fmt.Errorf("could not get device from DB: %v", err) } device.DeviceStatus = pkg.DeviceStatusSet(device.DeviceStatus, status) return device, sr.gormClient.Model(&device).Updates(device).Error } func (sr *scrutinyRepository) GetDeviceDetails(ctx context.Context, wwn string) (models.Device, error) { var device models.Device fmt.Println("GetDeviceDetails from GORM") if err := sr.gormClient.WithContext(ctx).Where("wwn = ?", wwn).First(&device).Error; err != nil { return models.Device{}, err } return device, nil } // Update Device Archived State func (sr *scrutinyRepository) UpdateDeviceArchived(ctx context.Context, wwn string, archived bool) error { var device models.Device if err := sr.gormClient.WithContext(ctx).Where("wwn = ?", wwn).First(&device).Error; err != nil { return fmt.Errorf("could not get device from DB: %v", err) } return sr.gormClient.Model(&device).Where("wwn = ?", wwn).Update("archived", archived).Error } func (sr *scrutinyRepository) DeleteDevice(ctx context.Context, wwn string) error { if err := sr.gormClient.WithContext(ctx).Where("wwn = ?", wwn).Delete(&models.Device{}).Error; err != nil { return err } //delete data from influxdb. buckets := []string{ sr.appConfig.GetString("web.influxdb.bucket"), fmt.Sprintf("%s_weekly", sr.appConfig.GetString("web.influxdb.bucket")), fmt.Sprintf("%s_monthly", sr.appConfig.GetString("web.influxdb.bucket")), fmt.Sprintf("%s_yearly", sr.appConfig.GetString("web.influxdb.bucket")), } for _, bucket := range buckets { sr.logger.Infof("Deleting data for %s in bucket: %s", wwn, bucket) if err := sr.influxClient.DeleteAPI().DeleteWithName( ctx, sr.appConfig.GetString("web.influxdb.org"), bucket, time.Now().AddDate(-10, 0, 0), time.Now(), fmt.Sprintf(`device_wwn="%s"`, wwn), ); err != nil { return err } } return nil } ================================================ FILE: webapp/backend/pkg/database/scrutiny_repository_device_smart_attributes.go ================================================ package database import ( "context" "fmt" "strings" "time" "github.com/analogj/scrutiny/webapp/backend/pkg/models/collector" "github.com/analogj/scrutiny/webapp/backend/pkg/models/measurements" influxdb2 "github.com/influxdata/influxdb-client-go/v2" "github.com/influxdata/influxdb-client-go/v2/api" log "github.com/sirupsen/logrus" ) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // SMART //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// func (sr *scrutinyRepository) SaveSmartAttributes(ctx context.Context, wwn string, collectorSmartData collector.SmartInfo) (measurements.Smart, error) { deviceSmartData := measurements.Smart{} err := deviceSmartData.FromCollectorSmartInfo(wwn, collectorSmartData) if err != nil { sr.logger.Errorln("Could not process SMART metrics", err) return measurements.Smart{}, err } tags, fields := deviceSmartData.Flatten() // write point immediately return deviceSmartData, sr.saveDatapoint(sr.influxWriteApi, "smart", tags, fields, deviceSmartData.Date, ctx) } // GetSmartAttributeHistory MUST return in sorted order, where newest entries are at the beginning of the list, and oldest are at the end. // When selectEntries is > 0, only the most recent selectEntries database entries are returned, starting from the selectEntriesOffset entry. // For example, with selectEntries = 5, selectEntries = 0, the most recent 5 are returned. With selectEntries = 3, selectEntries = 2, entries // 2 to 4 are returned (2 being the third newest, since it is zero-indexed) func (sr *scrutinyRepository) GetSmartAttributeHistory(ctx context.Context, wwn string, durationKey string, selectEntries int, selectEntriesOffset int, attributes []string) ([]measurements.Smart, error) { // Get SMartResults from InfluxDB //TODO: change the filter startrange to a real number. // Get parser flux query result //appConfig.GetString("web.influxdb.bucket") queryStr := sr.aggregateSmartAttributesQuery(wwn, durationKey, selectEntries, selectEntriesOffset, attributes) log.Infoln(queryStr) smartResults := []measurements.Smart{} result, err := sr.influxQueryApi.Query(ctx, queryStr) if err == nil { // Use Next() to iterate over query result lines for result.Next() { // Observe when there is new grouping key producing new table if result.TableChanged() { //fmt.Printf("table: %s\n", result.TableMetadata().String()) } smartData, err := measurements.NewSmartFromInfluxDB(result.Record().Values()) if err != nil { return nil, err } smartResults = append(smartResults, *smartData) } if result.Err() != nil { fmt.Printf("Query error: %s\n", result.Err().Error()) } } else { return nil, err } return smartResults, nil //if err := device.SquashHistory(); err != nil { // logger.Errorln("An error occurred while squashing device history", err) // c.JSON(http.StatusInternalServerError, gin.H{"success": false}) // return //} // //if err := device.ApplyMetadataRules(); err != nil { // logger.Errorln("An error occurred while applying scrutiny thresholds & rules", err) // c.JSON(http.StatusInternalServerError, gin.H{"success": false}) // return //} } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Helper Methods //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// func (sr *scrutinyRepository) saveDatapoint(influxWriteApi api.WriteAPIBlocking, measurement string, tags map[string]string, fields map[string]interface{}, date time.Time, ctx context.Context) error { //sr.logger.Debugf("Storing datapoint in measurement '%s'. tags: %d fields: %d", measurement, len(tags), len(fields)) p := influxdb2.NewPoint(measurement, tags, fields, date) // write point immediately return influxWriteApi.WritePoint(ctx, p) } func (sr *scrutinyRepository) aggregateSmartAttributesQuery(wwn string, durationKey string, selectEntries int, selectEntriesOffset int, attributes []string) string { /* import "influxdata/influxdb/schema" weekData = from(bucket: "metrics") |> range(start: -1w, stop: now()) |> filter(fn: (r) => r["_measurement"] == "smart" ) |> filter(fn: (r) => r["device_wwn"] == "0x5000c5002df89099" ) |> tail(n: 10, offset: 0) |> schema.fieldsAsCols() monthData = from(bucket: "metrics_weekly") |> range(start: -1mo, stop: -1w) |> filter(fn: (r) => r["_measurement"] == "smart" ) |> filter(fn: (r) => r["device_wwn"] == "0x5000c5002df89099" ) |> tail(n: 10, offset: 0) |> schema.fieldsAsCols() yearData = from(bucket: "metrics_monthly") |> range(start: -1y, stop: -1mo) |> filter(fn: (r) => r["_measurement"] == "smart" ) |> filter(fn: (r) => r["device_wwn"] == "0x5000c5002df89099" ) |> tail(n: 10, offset: 0) |> schema.fieldsAsCols() foreverData = from(bucket: "metrics_yearly") |> range(start: -10y, stop: -1y) |> filter(fn: (r) => r["_measurement"] == "smart" ) |> filter(fn: (r) => r["device_wwn"] == "0x5000c5002df89099" ) |> tail(n: 10, offset: 0) |> schema.fieldsAsCols() union(tables: [weekData, monthData, yearData, foreverData]) |> group() |> sort(columns: ["_time"], desc: true) |> tail(n: 6, offset: 4) |> yield(name: "last") */ partialQueryStr := []string{ `import "influxdata/influxdb/schema"`, } nestedDurationKeys := sr.lookupNestedDurationKeys(durationKey) if len(nestedDurationKeys) == 1 { //there's only one bucket being queried, no need to union, just aggregate the dataset and return partialQueryStr = append(partialQueryStr, []string{ sr.generateSmartAttributesSubquery(wwn, nestedDurationKeys[0], selectEntries, selectEntriesOffset, attributes), fmt.Sprintf(`%sData`, nestedDurationKeys[0]), `|> sort(columns: ["_time"], desc: true)`, `|> yield()`, }...) return strings.Join(partialQueryStr, "\n") } subQueries := []string{} subQueryNames := []string{} for _, nestedDurationKey := range nestedDurationKeys { subQueryNames = append(subQueryNames, fmt.Sprintf(`%sData`, nestedDurationKey)) if selectEntries > 0 { // We only need the last `n + offset` # of entries from each table to guarantee we can // get the last `n` # of entries starting from `offset` of the union subQueries = append(subQueries, sr.generateSmartAttributesSubquery(wwn, nestedDurationKey, selectEntries+selectEntriesOffset, 0, attributes)) } else { subQueries = append(subQueries, sr.generateSmartAttributesSubquery(wwn, nestedDurationKey, 0, 0, attributes)) } } partialQueryStr = append(partialQueryStr, subQueries...) partialQueryStr = append(partialQueryStr, []string{ fmt.Sprintf("union(tables: [%s])", strings.Join(subQueryNames, ", ")), `|> group()`, `|> sort(columns: ["_time"], desc: true)`, }...) if selectEntries > 0 { partialQueryStr = append(partialQueryStr, fmt.Sprintf(`|> limit(n: %d, offset: %d)`, selectEntries, selectEntriesOffset)) } partialQueryStr = append(partialQueryStr, `|> yield(name: "last")`) return strings.Join(partialQueryStr, "\n") } func (sr *scrutinyRepository) generateSmartAttributesSubquery(wwn string, durationKey string, selectEntries int, selectEntriesOffset int, attributes []string) string { bucketName := sr.lookupBucketName(durationKey) durationRange := sr.lookupDuration(durationKey) partialQueryStr := []string{ fmt.Sprintf(`%sData = from(bucket: "%s")`, durationKey, bucketName), fmt.Sprintf(`|> range(start: %s, stop: %s)`, durationRange[0], durationRange[1]), `|> filter(fn: (r) => r["_measurement"] == "smart" )`, fmt.Sprintf(`|> filter(fn: (r) => r["device_wwn"] == "%s" )`, wwn), } partialQueryStr = append(partialQueryStr, `|> aggregateWindow(every: 1d, fn: last, createEmpty: false)`) // ensure we are selecting the latest entries when paging partialQueryStr = append(partialQueryStr, `|> sort(columns: ["_time"], desc: true)`) if selectEntries > 0 { partialQueryStr = append(partialQueryStr, fmt.Sprintf(`|> limit(n: %d, offset: %d)`, selectEntries, selectEntriesOffset)) } partialQueryStr = append(partialQueryStr, "|> schema.fieldsAsCols()") return strings.Join(partialQueryStr, "\n") } ================================================ FILE: webapp/backend/pkg/database/scrutiny_repository_migrations.go ================================================ package database import ( "context" "errors" "fmt" "strconv" "time" "github.com/analogj/scrutiny/webapp/backend/pkg" "github.com/analogj/scrutiny/webapp/backend/pkg/database/migrations/m20201107210306" "github.com/analogj/scrutiny/webapp/backend/pkg/database/migrations/m20220503120000" "github.com/analogj/scrutiny/webapp/backend/pkg/database/migrations/m20220509170100" "github.com/analogj/scrutiny/webapp/backend/pkg/database/migrations/m20220716214900" "github.com/analogj/scrutiny/webapp/backend/pkg/database/migrations/m20250221084400" "github.com/analogj/scrutiny/webapp/backend/pkg/models" "github.com/analogj/scrutiny/webapp/backend/pkg/models/collector" "github.com/analogj/scrutiny/webapp/backend/pkg/models/measurements" _ "github.com/glebarez/sqlite" "github.com/go-gormigrate/gormigrate/v2" "github.com/influxdata/influxdb-client-go/v2/api/http" log "github.com/sirupsen/logrus" "gorm.io/gorm" ) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // SQLite migrations //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //database.AutoMigrate(&models.Device{}) func (sr *scrutinyRepository) Migrate(ctx context.Context) error { sr.logger.Infoln("Database migration starting. Please wait, this process may take a long time....") gormMigrateOptions := gormigrate.DefaultOptions gormMigrateOptions.UseTransaction = true m := gormigrate.New(sr.gormClient, gormMigrateOptions, []*gormigrate.Migration{ { ID: "20201107210306", // v0.3.13 (pre-influxdb schema). 9fac3c6308dc6cb6cd5bbc43a68cd93e8fb20b87 Migrate: func(tx *gorm.DB) error { // it's a good practice to copy the struct inside the function, return tx.AutoMigrate( &m20201107210306.Device{}, &m20201107210306.Smart{}, &m20201107210306.SmartAtaAttribute{}, &m20201107210306.SmartNvmeAttribute{}, &m20201107210306.SmartNvmeAttribute{}, ) }, }, { ID: "20220503113100", // backwards compatible - influxdb schema Migrate: func(tx *gorm.DB) error { // delete unnecessary table. err := tx.Migrator().DropTable("self_tests") if err != nil { return err } //add columns to the Device schema, so we can start adding data to the database & influxdb err = tx.Migrator().AddColumn(&models.Device{}, "Label") //Label string `json:"label"` if err != nil { return err } err = tx.Migrator().AddColumn(&models.Device{}, "DeviceStatus") //DeviceStatus pkg.DeviceStatus `json:"device_status"` if err != nil { return err } //TODO: migrate the data from GORM to influxdb. //get a list of all devices: // get a list of all smart scans in the last 2 weeks: // get a list of associated smart attribute data: // translate to a measurements.Smart{} object // call CUSTOM INFLUXDB SAVE FUNCTION (taking bucket as parameter) // get a list of all smart scans in the last 9 weeks: // do same as above (select 1 scan per week) // get a list of all smart scans in the last 25 months: // do same as above (select 1 scan per month) // get a list of all smart scans: // do same as above (select 1 scan per year) preDevices := []m20201107210306.Device{} //pre-migration device information if err = tx.Preload("SmartResults", func(db *gorm.DB) *gorm.DB { return db.Order("smarts.created_at ASC") //OLD: .Limit(devicesCount) }).Find(&preDevices).Error; err != nil { sr.logger.Errorln("Could not get device summary from DB", err) return err } //calculate bucket oldest dates today := time.Now() dailyBucketMax := today.Add(-RETENTION_PERIOD_15_DAYS_IN_SECONDS * time.Second) //15 days weeklyBucketMax := today.Add(-RETENTION_PERIOD_9_WEEKS_IN_SECONDS * time.Second) //9 weeks monthlyBucketMax := today.Add(-RETENTION_PERIOD_25_MONTHS_IN_SECONDS * time.Second) //25 weeks for _, preDevice := range preDevices { sr.logger.Debugf("====================================") sr.logger.Infof("begin processing device: %s", preDevice.WWN) //weekly, monthly, yearly lookup storage, so we don't add more data to the buckets than necessary. weeklyLookup := map[string]bool{} monthlyLookup := map[string]bool{} yearlyLookup := map[string]bool{} for _, preSmartResult := range preDevice.SmartResults { //pre-migration smart results //we're looping in ASC mode, so from oldest entry to most current. err, postSmartResults := m20201107210306_FromPreInfluxDBSmartResultsCreatePostInfluxDBSmartResults(tx, preDevice, preSmartResult) if err != nil { return err } smartTags, smartFields := postSmartResults.Flatten() err, postSmartTemp := m20201107210306_FromPreInfluxDBTempCreatePostInfluxDBTemp(preDevice, preSmartResult) if err != nil { return err } tempTags, tempFields := postSmartTemp.Flatten() tempTags["device_wwn"] = preDevice.WWN year, week := postSmartResults.Date.ISOWeek() month := postSmartResults.Date.Month() yearStr := strconv.Itoa(year) yearMonthStr := fmt.Sprintf("%d-%d", year, month) yearWeekStr := fmt.Sprintf("%d-%d", year, week) //write data to daily bucket if in the last 15 days if postSmartResults.Date.After(dailyBucketMax) { sr.logger.Debugf("device (%s) smart data added to bucket: daily", preDevice.WWN) // write point immediately err = sr.saveDatapoint( sr.influxClient.WriteAPIBlocking(sr.appConfig.GetString("web.influxdb.org"), sr.appConfig.GetString("web.influxdb.bucket")), "smart", smartTags, smartFields, postSmartResults.Date, ctx) if ignorePastRetentionPolicyError(err) != nil { return err } err = sr.saveDatapoint( sr.influxClient.WriteAPIBlocking(sr.appConfig.GetString("web.influxdb.org"), sr.appConfig.GetString("web.influxdb.bucket")), "temp", tempTags, tempFields, postSmartResults.Date, ctx) if ignorePastRetentionPolicyError(err) != nil { return err } } //write data to the weekly bucket if in the last 9 weeks, and week has not been processed yet if _, weekExists := weeklyLookup[yearWeekStr]; !weekExists && postSmartResults.Date.After(weeklyBucketMax) { sr.logger.Debugf("device (%s) smart data added to bucket: weekly", preDevice.WWN) //this week/year pair has not been processed weeklyLookup[yearWeekStr] = true // write point immediately err = sr.saveDatapoint( sr.influxClient.WriteAPIBlocking(sr.appConfig.GetString("web.influxdb.org"), fmt.Sprintf("%s_weekly", sr.appConfig.GetString("web.influxdb.bucket"))), "smart", smartTags, smartFields, postSmartResults.Date, ctx) if ignorePastRetentionPolicyError(err) != nil { return err } err = sr.saveDatapoint( sr.influxClient.WriteAPIBlocking(sr.appConfig.GetString("web.influxdb.org"), fmt.Sprintf("%s_weekly", sr.appConfig.GetString("web.influxdb.bucket"))), "temp", tempTags, tempFields, postSmartResults.Date, ctx) if ignorePastRetentionPolicyError(err) != nil { return err } } //write data to the monthly bucket if in the last 9 weeks, and week has not been processed yet if _, monthExists := monthlyLookup[yearMonthStr]; !monthExists && postSmartResults.Date.After(monthlyBucketMax) { sr.logger.Debugf("device (%s) smart data added to bucket: monthly", preDevice.WWN) //this month/year pair has not been processed monthlyLookup[yearMonthStr] = true // write point immediately err = sr.saveDatapoint( sr.influxClient.WriteAPIBlocking(sr.appConfig.GetString("web.influxdb.org"), fmt.Sprintf("%s_monthly", sr.appConfig.GetString("web.influxdb.bucket"))), "smart", smartTags, smartFields, postSmartResults.Date, ctx) if ignorePastRetentionPolicyError(err) != nil { return err } err = sr.saveDatapoint( sr.influxClient.WriteAPIBlocking(sr.appConfig.GetString("web.influxdb.org"), fmt.Sprintf("%s_monthly", sr.appConfig.GetString("web.influxdb.bucket"))), "temp", tempTags, tempFields, postSmartResults.Date, ctx) if ignorePastRetentionPolicyError(err) != nil { return err } } if _, yearExists := yearlyLookup[yearStr]; !yearExists && year != today.Year() { sr.logger.Debugf("device (%s) smart data added to bucket: yearly", preDevice.WWN) //this year has not been processed yearlyLookup[yearStr] = true // write point immediately err = sr.saveDatapoint( sr.influxClient.WriteAPIBlocking(sr.appConfig.GetString("web.influxdb.org"), fmt.Sprintf("%s_yearly", sr.appConfig.GetString("web.influxdb.bucket"))), "smart", smartTags, smartFields, postSmartResults.Date, ctx) if ignorePastRetentionPolicyError(err) != nil { return err } err = sr.saveDatapoint( sr.influxClient.WriteAPIBlocking(sr.appConfig.GetString("web.influxdb.org"), fmt.Sprintf("%s_yearly", sr.appConfig.GetString("web.influxdb.bucket"))), "temp", tempTags, tempFields, postSmartResults.Date, ctx) if ignorePastRetentionPolicyError(err) != nil { return err } } } sr.logger.Infof("finished processing device %s. weekly: %d, monthly: %d, yearly: %d", preDevice.WWN, len(weeklyLookup), len(monthlyLookup), len(yearlyLookup)) } return nil }, }, { ID: "20220503120000", // cleanup - v0.4.0 - influxdb schema Migrate: func(tx *gorm.DB) error { // delete unnecessary tables. err := tx.Migrator().DropTable( &m20201107210306.Smart{}, &m20201107210306.SmartAtaAttribute{}, &m20201107210306.SmartNvmeAttribute{}, &m20201107210306.SmartScsiAttribute{}, ) if err != nil { return err } //migrate the device database return tx.AutoMigrate(m20220503120000.Device{}) }, }, { ID: "m20220509170100", // addl udev device data Migrate: func(tx *gorm.DB) error { //migrate the device database. // adding addl columns (device_label, device_uuid, device_serial_id) return tx.AutoMigrate(m20220509170100.Device{}) }, }, { ID: "m20220709181300", Migrate: func(tx *gorm.DB) error { // delete devices with empty `wwn` field (they are impossible to delete manually), and are invalid. return tx.Where("wwn = ?", "").Delete(&models.Device{}).Error }, }, { ID: "m20220716214900", // add settings table. Migrate: func(tx *gorm.DB) error { // adding the settings table. err := tx.AutoMigrate(m20220716214900.Setting{}) if err != nil { return err } //add defaults. var defaultSettings = []m20220716214900.Setting{ { SettingKeyName: "theme", SettingKeyDescription: "Frontend theme ('light' | 'dark' | 'system')", SettingDataType: "string", SettingValueString: "system", // options: 'light' | 'dark' | 'system' }, { SettingKeyName: "layout", SettingKeyDescription: "Frontend layout ('material')", SettingDataType: "string", SettingValueString: "material", }, { SettingKeyName: "dashboard_display", SettingKeyDescription: "Frontend device display title ('name' | 'serial_id' | 'uuid' | 'label')", SettingDataType: "string", SettingValueString: "name", }, { SettingKeyName: "dashboard_sort", SettingKeyDescription: "Frontend device sort by ('status' | 'title' | 'age')", SettingDataType: "string", SettingValueString: "status", }, { SettingKeyName: "temperature_unit", SettingKeyDescription: "Frontend temperature unit ('celsius' | 'fahrenheit')", SettingDataType: "string", SettingValueString: "celsius", }, { SettingKeyName: "file_size_si_units", SettingKeyDescription: "File size in SI units (true | false)", SettingDataType: "bool", SettingValueBool: false, }, { SettingKeyName: "line_stroke", SettingKeyDescription: "Temperature chart line stroke ('smooth' | 'straight' | 'stepline')", SettingDataType: "string", SettingValueString: "smooth", }, { SettingKeyName: "metrics.notify_level", SettingKeyDescription: "Determines which device status will cause a notification (fail or warn)", SettingDataType: "numeric", SettingValueNumeric: int(pkg.MetricsNotifyLevelFail), // options: 'fail' or 'warn' }, { SettingKeyName: "metrics.status_filter_attributes", SettingKeyDescription: "Determines which attributes should impact device status", SettingDataType: "numeric", SettingValueNumeric: int(pkg.MetricsStatusFilterAttributesAll), // options: 'all' or 'critical' }, { SettingKeyName: "metrics.status_threshold", SettingKeyDescription: "Determines which threshold should impact device status", SettingDataType: "numeric", SettingValueNumeric: int(pkg.MetricsStatusThresholdBoth), // options: 'scrutiny', 'smart', 'both' }, } return tx.Create(&defaultSettings).Error }, }, { ID: "m20221115214900", // add line_stroke setting. Migrate: func(tx *gorm.DB) error { //add line_stroke setting default. var defaultSettings = []m20220716214900.Setting{ { SettingKeyName: "line_stroke", SettingKeyDescription: "Temperature chart line stroke ('smooth' | 'straight' | 'stepline')", SettingDataType: "string", SettingValueString: "smooth", }, } return tx.Create(&defaultSettings).Error }, }, { ID: "m20231123123300", // add repeat_notifications setting. Migrate: func(tx *gorm.DB) error { //add repeat_notifications setting default. var defaultSettings = []m20220716214900.Setting{ { SettingKeyName: "metrics.repeat_notifications", SettingKeyDescription: "Whether to repeat all notifications or just when values change (true | false)", SettingDataType: "bool", SettingValueBool: true, }, } return tx.Create(&defaultSettings).Error }, }, { ID: "m20240722082740", // add powered_on_hours_unit setting. Migrate: func(tx *gorm.DB) error { //add powered_on_hours_unit setting default. var defaultSettings = []m20220716214900.Setting{ { SettingKeyName: "powered_on_hours_unit", SettingKeyDescription: "Presentation format for device powered on time ('humanize' | 'device_hours')", SettingDataType: "string", SettingValueString: "humanize", }, } return tx.Create(&defaultSettings).Error }, }, { ID: "m20250221084400", // add archived to device data Migrate: func(tx *gorm.DB) error { //migrate the device database. // adding column (archived) return tx.AutoMigrate(m20250221084400.Device{}) }, }, { ID: "m20260105083200", // add discard_sct_temp_history setting. Migrate: func(tx *gorm.DB) error { //add discard_sct_temp_history setting default. var defaultSettings = []m20220716214900.Setting{ { SettingKeyName: "collector.discard_sct_temp_history", SettingKeyDescription: "Whether to discard SCT Temperature history (true | false)", SettingDataType: "bool", SettingValueBool: false, }, } return tx.Create(&defaultSettings).Error }, }, }) if err := m.Migrate(); err != nil { sr.logger.Errorf("Database migration failed with error. \n Please open a github issue at https://github.com/AnalogJ/scrutiny and attach a copy of your scrutiny.db file. \n %v", err) return err } sr.logger.Infoln("Database migration completed successfully") //these migrations cannot be done within a transaction, so they are done as a separate group, with `UseTransaction = false` sr.logger.Infoln("SQLite global configuration migrations starting. Please wait....") globalMigrateOptions := gormigrate.DefaultOptions globalMigrateOptions.UseTransaction = false gm := gormigrate.New(sr.gormClient, globalMigrateOptions, []*gormigrate.Migration{ { ID: "g20220802211500", Migrate: func(tx *gorm.DB) error { //shrink the Database (maybe necessary after 20220503113100) if err := tx.Exec("VACUUM;").Error; err != nil { return err } return nil }, }, }) if err := gm.Migrate(); err != nil { sr.logger.Errorf("SQLite global configuration migrations failed with error. \n Please open a github issue at https://github.com/AnalogJ/scrutiny and attach a copy of your scrutiny.db file. \n %v", err) return err } sr.logger.Infoln("SQLite global configuration migrations completed successfully") return nil } // helpers // When adding data to influxdb, an error may be returned if the data point is outside the range of the retention policy. // This function will ignore retention policy errors, and allow the migration to continue. func ignorePastRetentionPolicyError(err error) error { var influxDbWriteError *http.Error if errors.As(err, &influxDbWriteError) { if influxDbWriteError.StatusCode == 422 { log.Infoln("ignoring error: attempted to writePoint past retention period duration") return nil } } return err } // Deprecated func m20201107210306_FromPreInfluxDBTempCreatePostInfluxDBTemp(preDevice m20201107210306.Device, preSmartResult m20201107210306.Smart) (error, measurements.SmartTemperature) { //extract temperature data for every datapoint postSmartTemp := measurements.SmartTemperature{ Date: preSmartResult.TestDate, Temp: preSmartResult.Temp, } return nil, postSmartTemp } // Deprecated func m20201107210306_FromPreInfluxDBSmartResultsCreatePostInfluxDBSmartResults(database *gorm.DB, preDevice m20201107210306.Device, preSmartResult m20201107210306.Smart) (error, measurements.Smart) { //create a measurements.Smart object (which we will then push to the InfluxDB) postDeviceSmartData := measurements.Smart{ Date: preSmartResult.TestDate, DeviceWWN: preDevice.WWN, DeviceProtocol: preDevice.DeviceProtocol, Temp: preSmartResult.Temp, PowerOnHours: preSmartResult.PowerOnHours, PowerCycleCount: preSmartResult.PowerCycleCount, // this needs to be populated using measurements.Smart.ProcessAtaSmartInfo, ProcessScsiSmartInfo or ProcessNvmeSmartInfo // because those functions will take into account thresholds (which we didn't consider correctly previously) Attributes: map[string]measurements.SmartAttribute{}, } result := database.Preload("AtaAttributes").Preload("NvmeAttributes").Preload("ScsiAttributes").Find(&preSmartResult) if result.Error != nil { return result.Error, postDeviceSmartData } if preDevice.IsAta() { preAtaSmartAttributesTable := []collector.AtaSmartAttributesTableItem{} for _, preAtaAttribute := range preSmartResult.AtaAttributes { preAtaSmartAttributesTable = append(preAtaSmartAttributesTable, collector.AtaSmartAttributesTableItem{ ID: preAtaAttribute.AttributeId, Name: preAtaAttribute.Name, Value: int64(preAtaAttribute.Value), Worst: int64(preAtaAttribute.Worst), Thresh: int64(preAtaAttribute.Threshold), WhenFailed: preAtaAttribute.WhenFailed, Flags: struct { Value int `json:"value"` String string `json:"string"` Prefailure bool `json:"prefailure"` UpdatedOnline bool `json:"updated_online"` Performance bool `json:"performance"` ErrorRate bool `json:"error_rate"` EventCount bool `json:"event_count"` AutoKeep bool `json:"auto_keep"` }{ Value: 0, String: "", Prefailure: false, UpdatedOnline: false, Performance: false, ErrorRate: false, EventCount: false, AutoKeep: false, }, Raw: struct { Value int64 `json:"value"` String string `json:"string"` }{ Value: preAtaAttribute.RawValue, String: preAtaAttribute.RawString, }, }) } postDeviceSmartData.ProcessAtaSmartInfo(preAtaSmartAttributesTable) } else if preDevice.IsNvme() { //info collector.SmartInfo postNvmeSmartHealthInformation := collector.NvmeSmartHealthInformationLog{} for _, preNvmeAttribute := range preSmartResult.NvmeAttributes { switch preNvmeAttribute.AttributeId { case "critical_warning": postNvmeSmartHealthInformation.CriticalWarning = int64(preNvmeAttribute.Value) case "temperature": postNvmeSmartHealthInformation.Temperature = int64(preNvmeAttribute.Value) case "available_spare": postNvmeSmartHealthInformation.AvailableSpare = int64(preNvmeAttribute.Value) case "available_spare_threshold": postNvmeSmartHealthInformation.AvailableSpareThreshold = int64(preNvmeAttribute.Value) case "percentage_used": postNvmeSmartHealthInformation.PercentageUsed = int64(preNvmeAttribute.Value) case "data_units_read": postNvmeSmartHealthInformation.DataUnitsWritten = int64(preNvmeAttribute.Value) case "data_units_written": postNvmeSmartHealthInformation.DataUnitsWritten = int64(preNvmeAttribute.Value) case "host_reads": postNvmeSmartHealthInformation.HostReads = int64(preNvmeAttribute.Value) case "host_writes": postNvmeSmartHealthInformation.HostWrites = int64(preNvmeAttribute.Value) case "controller_busy_time": postNvmeSmartHealthInformation.ControllerBusyTime = int64(preNvmeAttribute.Value) case "power_cycles": postNvmeSmartHealthInformation.PowerCycles = int64(preNvmeAttribute.Value) case "power_on_hours": postNvmeSmartHealthInformation.PowerOnHours = int64(preNvmeAttribute.Value) case "unsafe_shutdowns": postNvmeSmartHealthInformation.UnsafeShutdowns = int64(preNvmeAttribute.Value) case "media_errors": postNvmeSmartHealthInformation.MediaErrors = int64(preNvmeAttribute.Value) case "num_err_log_entries": postNvmeSmartHealthInformation.NumErrLogEntries = int64(preNvmeAttribute.Value) case "warning_temp_time": postNvmeSmartHealthInformation.WarningTempTime = int64(preNvmeAttribute.Value) case "critical_comp_time": postNvmeSmartHealthInformation.CriticalCompTime = int64(preNvmeAttribute.Value) } } postDeviceSmartData.ProcessNvmeSmartInfo(postNvmeSmartHealthInformation) } else if preDevice.IsScsi() { //info collector.SmartInfo var postScsiGrownDefectList int64 postScsiErrorCounterLog := collector.ScsiErrorCounterLog{ Read: struct { ErrorsCorrectedByEccfast int64 `json:"errors_corrected_by_eccfast"` ErrorsCorrectedByEccdelayed int64 `json:"errors_corrected_by_eccdelayed"` ErrorsCorrectedByRereadsRewrites int64 `json:"errors_corrected_by_rereads_rewrites"` TotalErrorsCorrected int64 `json:"total_errors_corrected"` CorrectionAlgorithmInvocations int64 `json:"correction_algorithm_invocations"` GigabytesProcessed string `json:"gigabytes_processed"` TotalUncorrectedErrors int64 `json:"total_uncorrected_errors"` }{}, Write: struct { ErrorsCorrectedByEccfast int64 `json:"errors_corrected_by_eccfast"` ErrorsCorrectedByEccdelayed int64 `json:"errors_corrected_by_eccdelayed"` ErrorsCorrectedByRereadsRewrites int64 `json:"errors_corrected_by_rereads_rewrites"` TotalErrorsCorrected int64 `json:"total_errors_corrected"` CorrectionAlgorithmInvocations int64 `json:"correction_algorithm_invocations"` GigabytesProcessed string `json:"gigabytes_processed"` TotalUncorrectedErrors int64 `json:"total_uncorrected_errors"` }{}, } for _, preScsiAttribute := range preSmartResult.ScsiAttributes { switch preScsiAttribute.AttributeId { case "scsi_grown_defect_list": postScsiGrownDefectList = int64(preScsiAttribute.Value) case "read.errors_corrected_by_eccfast": postScsiErrorCounterLog.Read.ErrorsCorrectedByEccfast = int64(preScsiAttribute.Value) case "read.errors_corrected_by_eccdelayed": postScsiErrorCounterLog.Read.ErrorsCorrectedByEccdelayed = int64(preScsiAttribute.Value) case "read.errors_corrected_by_rereads_rewrites": postScsiErrorCounterLog.Read.ErrorsCorrectedByRereadsRewrites = int64(preScsiAttribute.Value) case "read.total_errors_corrected": postScsiErrorCounterLog.Read.TotalErrorsCorrected = int64(preScsiAttribute.Value) case "read.correction_algorithm_invocations": postScsiErrorCounterLog.Read.CorrectionAlgorithmInvocations = int64(preScsiAttribute.Value) case "read.total_uncorrected_errors": postScsiErrorCounterLog.Read.TotalUncorrectedErrors = int64(preScsiAttribute.Value) case "write.errors_corrected_by_eccfast": postScsiErrorCounterLog.Write.ErrorsCorrectedByEccfast = int64(preScsiAttribute.Value) case "write.errors_corrected_by_eccdelayed": postScsiErrorCounterLog.Write.ErrorsCorrectedByEccdelayed = int64(preScsiAttribute.Value) case "write.errors_corrected_by_rereads_rewrites": postScsiErrorCounterLog.Write.ErrorsCorrectedByRereadsRewrites = int64(preScsiAttribute.Value) case "write.total_errors_corrected": postScsiErrorCounterLog.Write.TotalErrorsCorrected = int64(preScsiAttribute.Value) case "write.correction_algorithm_invocations": postScsiErrorCounterLog.Write.CorrectionAlgorithmInvocations = int64(preScsiAttribute.Value) case "write.total_uncorrected_errors": postScsiErrorCounterLog.Write.TotalUncorrectedErrors = int64(preScsiAttribute.Value) } } postDeviceSmartData.ProcessScsiSmartInfo(postScsiGrownDefectList, postScsiErrorCounterLog) } else { return fmt.Errorf("unknown device protocol: %s", preDevice.DeviceProtocol), postDeviceSmartData } return nil, postDeviceSmartData } ================================================ FILE: webapp/backend/pkg/database/scrutiny_repository_settings.go ================================================ package database import ( "context" "fmt" "strings" "github.com/analogj/scrutiny/webapp/backend/pkg/config" "github.com/analogj/scrutiny/webapp/backend/pkg/models" "github.com/go-viper/mapstructure/v2" ) // LoadSettings will retrieve settings from the database, store them in the AppConfig object, and return a Settings struct func (sr *scrutinyRepository) LoadSettings(ctx context.Context) (*models.Settings, error) { settingsEntries := []models.SettingEntry{} if err := sr.gormClient.WithContext(ctx).Find(&settingsEntries).Error; err != nil { return nil, fmt.Errorf("could not get settings from DB: %v", err) } // store retrieved settings in the AppConfig obj for _, settingsEntry := range settingsEntries { configKey := fmt.Sprintf("%s.%s", config.DB_USER_SETTINGS_SUBKEY, settingsEntry.SettingKeyName) if settingsEntry.SettingDataType == "numeric" { sr.appConfig.SetDefault(configKey, settingsEntry.SettingValueNumeric) } else if settingsEntry.SettingDataType == "string" { sr.appConfig.SetDefault(configKey, settingsEntry.SettingValueString) } else if settingsEntry.SettingDataType == "bool" { sr.appConfig.SetDefault(configKey, settingsEntry.SettingValueBool) } } // unmarshal the dbsetting object data to a settings object. var settings models.Settings err := sr.appConfig.UnmarshalKey(config.DB_USER_SETTINGS_SUBKEY, &settings) if err != nil { return nil, err } return &settings, nil } // testing // curl -d '{"metrics": { "notify_level": 5, "status_filter_attributes": 5, "status_threshold": 5 }}' -H "Content-Type: application/json" -X POST http://localhost:9090/api/settings // SaveSettings will update settings in AppConfig object, then save the settings to the database. func (sr *scrutinyRepository) SaveSettings(ctx context.Context, settings models.Settings) error { //save the entries to the appconfig settingsMap := &map[string]interface{}{} err := mapstructure.Decode(settings, &settingsMap) if err != nil { return err } settingsWrapperMap := map[string]interface{}{} settingsWrapperMap[config.DB_USER_SETTINGS_SUBKEY] = *settingsMap err = sr.appConfig.MergeConfigMap(settingsWrapperMap) if err != nil { return err } sr.logger.Debugf("after merge settings: %v", sr.appConfig.AllSettings()) //retrieve current settings from the database settingsEntries := []models.SettingEntry{} if err := sr.gormClient.WithContext(ctx).Find(&settingsEntries).Error; err != nil { return fmt.Errorf("could not get settings from DB: %v", err) } //update settingsEntries for ndx, settingsEntry := range settingsEntries { configKey := fmt.Sprintf("%s.%s", config.DB_USER_SETTINGS_SUBKEY, strings.ToLower(settingsEntry.SettingKeyName)) if settingsEntry.SettingDataType == "numeric" { settingsEntries[ndx].SettingValueNumeric = sr.appConfig.GetInt(configKey) } else if settingsEntry.SettingDataType == "string" { settingsEntries[ndx].SettingValueString = sr.appConfig.GetString(configKey) } else if settingsEntry.SettingDataType == "bool" { settingsEntries[ndx].SettingValueBool = sr.appConfig.GetBool(configKey) } // store in database. //TODO: this should be `sr.gormClient.Updates(&settingsEntries).Error` err := sr.gormClient.Model(&models.SettingEntry{}).Where([]uint{settingsEntry.ID}).Select("setting_value_numeric", "setting_value_string", "setting_value_bool").Updates(settingsEntries[ndx]).Error if err != nil { return err } } return nil } ================================================ FILE: webapp/backend/pkg/database/scrutiny_repository_tasks.go ================================================ package database import ( "context" "fmt" "github.com/influxdata/influxdb-client-go/v2/api" ) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Tasks //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// func (sr *scrutinyRepository) EnsureTasks(ctx context.Context, orgID string) error { weeklyTaskName := "tsk-weekly-aggr" weeklyTaskScript := sr.DownsampleScript("weekly", weeklyTaskName, "0 1 * * 0") if found, findErr := sr.influxTaskApi.FindTasks(ctx, &api.TaskFilter{Name: weeklyTaskName}); findErr == nil && len(found) == 0 { //weekly on Sunday at 1:00am _, err := sr.influxTaskApi.CreateTaskByFlux(ctx, weeklyTaskScript, orgID) if err != nil { return err } } else if len(found) == 1 { //check if we should update task := &found[0] if weeklyTaskScript != task.Flux { sr.logger.Infoln("updating weekly task script") task.Flux = weeklyTaskScript _, err := sr.influxTaskApi.UpdateTask(ctx, task) if err != nil { return err } } } monthlyTaskName := "tsk-monthly-aggr" monthlyTaskScript := sr.DownsampleScript("monthly", monthlyTaskName, "30 1 1 * *") if found, findErr := sr.influxTaskApi.FindTasks(ctx, &api.TaskFilter{Name: monthlyTaskName}); findErr == nil && len(found) == 0 { //monthly on first day of the month at 1:30am _, err := sr.influxTaskApi.CreateTaskByFlux(ctx, monthlyTaskScript, orgID) if err != nil { return err } } else if len(found) == 1 { //check if we should update task := &found[0] if monthlyTaskScript != task.Flux { sr.logger.Infoln("updating monthly task script") task.Flux = monthlyTaskScript _, err := sr.influxTaskApi.UpdateTask(ctx, task) if err != nil { return err } } } yearlyTaskName := "tsk-yearly-aggr" yearlyTaskScript := sr.DownsampleScript("yearly", yearlyTaskName, "0 2 1 1 *") if found, findErr := sr.influxTaskApi.FindTasks(ctx, &api.TaskFilter{Name: yearlyTaskName}); findErr == nil && len(found) == 0 { //yearly on the first day of the year at 2:00am _, err := sr.influxTaskApi.CreateTaskByFlux(ctx, yearlyTaskScript, orgID) if err != nil { return err } } else if len(found) == 1 { //check if we should update task := &found[0] if yearlyTaskScript != task.Flux { sr.logger.Infoln("updating yearly task script") task.Flux = yearlyTaskScript _, err := sr.influxTaskApi.UpdateTask(ctx, task) if err != nil { return err } } } return nil } func (sr *scrutinyRepository) DownsampleScript(aggregationType string, name string, cron string) string { var sourceBucket string // the source of the data var destBucket string // the destination for the aggregated data var rangeStart string var rangeEnd string var aggWindow string switch aggregationType { case "weekly": sourceBucket = sr.appConfig.GetString("web.influxdb.bucket") destBucket = fmt.Sprintf("%s_weekly", sr.appConfig.GetString("web.influxdb.bucket")) rangeStart = "-2w" rangeEnd = "-1w" aggWindow = "1w" case "monthly": sourceBucket = fmt.Sprintf("%s_weekly", sr.appConfig.GetString("web.influxdb.bucket")) destBucket = fmt.Sprintf("%s_monthly", sr.appConfig.GetString("web.influxdb.bucket")) rangeStart = "-2mo" rangeEnd = "-1mo" aggWindow = "1mo" case "yearly": sourceBucket = fmt.Sprintf("%s_monthly", sr.appConfig.GetString("web.influxdb.bucket")) destBucket = fmt.Sprintf("%s_yearly", sr.appConfig.GetString("web.influxdb.bucket")) rangeStart = "-2y" rangeEnd = "-1y" aggWindow = "1y" } // TODO: using "last" function for aggregation. This should eventually be replaced with a more accurate represenation /* import "types" smart_data = from(bucket: sourceBucket) |> range(start: rangeStart, stop: rangeEnd) |> filter(fn: (r) => r["_measurement"] == "smart" ) |> group(columns: ["device_wwn", "_field"]) non_numeric_smart_data = smart_data |> filter(fn: (r) => types.isType(v: r._value, type: "string") or types.isType(v: r._value, type: "bool")) |> aggregateWindow(every: aggWindow, fn: last, createEmpty: false) numeric_smart_data = smart_data |> filter(fn: (r) => types.isType(v: r._value, type: "int") or types.isType(v: r._value, type: "float")) |> aggregateWindow(every: aggWindow, fn: mean, createEmpty: false) union(tables: [non_numeric_smart_data, numeric_smart_data]) |> to(bucket: destBucket, org: destOrg) */ return fmt.Sprintf(` option task = { name: "%s", cron: "%s", } sourceBucket = "%s" rangeStart = %s rangeEnd = %s aggWindow = %s destBucket = "%s" destOrg = "%s" from(bucket: sourceBucket) |> range(start: rangeStart, stop: rangeEnd) |> filter(fn: (r) => r["_measurement"] == "smart" ) |> group(columns: ["device_wwn", "_field"]) |> aggregateWindow(every: aggWindow, fn: last, createEmpty: false) |> to(bucket: destBucket, org: destOrg) from(bucket: sourceBucket) |> range(start: rangeStart, stop: rangeEnd) |> filter(fn: (r) => r["_measurement"] == "temp") |> group(columns: ["device_wwn"]) |> toInt() |> aggregateWindow(fn: mean, every: aggWindow, createEmpty: false) |> set(key: "_measurement", value: "temp") |> set(key: "_field", value: "temp") |> to(bucket: destBucket, org: destOrg) `, name, cron, sourceBucket, rangeStart, rangeEnd, aggWindow, destBucket, sr.appConfig.GetString("web.influxdb.org"), ) } ================================================ FILE: webapp/backend/pkg/database/scrutiny_repository_tasks_test.go ================================================ package database import ( "testing" mock_config "github.com/analogj/scrutiny/webapp/backend/pkg/config/mock" "github.com/stretchr/testify/require" "go.uber.org/mock/gomock" ) func Test_DownsampleScript_Weekly(t *testing.T) { t.Parallel() //setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() deviceRepo := scrutinyRepository{ appConfig: fakeConfig, } aggregationType := "weekly" //test influxDbScript := deviceRepo.DownsampleScript(aggregationType, "tsk-weekly-aggr", "0 1 * * 0") //assert require.Equal(t, ` option task = { name: "tsk-weekly-aggr", cron: "0 1 * * 0", } sourceBucket = "metrics" rangeStart = -2w rangeEnd = -1w aggWindow = 1w destBucket = "metrics_weekly" destOrg = "scrutiny" from(bucket: sourceBucket) |> range(start: rangeStart, stop: rangeEnd) |> filter(fn: (r) => r["_measurement"] == "smart" ) |> group(columns: ["device_wwn", "_field"]) |> aggregateWindow(every: aggWindow, fn: last, createEmpty: false) |> to(bucket: destBucket, org: destOrg) from(bucket: sourceBucket) |> range(start: rangeStart, stop: rangeEnd) |> filter(fn: (r) => r["_measurement"] == "temp") |> group(columns: ["device_wwn"]) |> toInt() |> aggregateWindow(fn: mean, every: aggWindow, createEmpty: false) |> set(key: "_measurement", value: "temp") |> set(key: "_field", value: "temp") |> to(bucket: destBucket, org: destOrg) `, influxDbScript) } func Test_DownsampleScript_Monthly(t *testing.T) { t.Parallel() //setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() deviceRepo := scrutinyRepository{ appConfig: fakeConfig, } aggregationType := "monthly" //test influxDbScript := deviceRepo.DownsampleScript(aggregationType, "tsk-monthly-aggr", "30 1 1 * *") //assert require.Equal(t, ` option task = { name: "tsk-monthly-aggr", cron: "30 1 1 * *", } sourceBucket = "metrics_weekly" rangeStart = -2mo rangeEnd = -1mo aggWindow = 1mo destBucket = "metrics_monthly" destOrg = "scrutiny" from(bucket: sourceBucket) |> range(start: rangeStart, stop: rangeEnd) |> filter(fn: (r) => r["_measurement"] == "smart" ) |> group(columns: ["device_wwn", "_field"]) |> aggregateWindow(every: aggWindow, fn: last, createEmpty: false) |> to(bucket: destBucket, org: destOrg) from(bucket: sourceBucket) |> range(start: rangeStart, stop: rangeEnd) |> filter(fn: (r) => r["_measurement"] == "temp") |> group(columns: ["device_wwn"]) |> toInt() |> aggregateWindow(fn: mean, every: aggWindow, createEmpty: false) |> set(key: "_measurement", value: "temp") |> set(key: "_field", value: "temp") |> to(bucket: destBucket, org: destOrg) `, influxDbScript) } func Test_DownsampleScript_Yearly(t *testing.T) { t.Parallel() //setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() deviceRepo := scrutinyRepository{ appConfig: fakeConfig, } aggregationType := "yearly" //test influxDbScript := deviceRepo.DownsampleScript(aggregationType, "tsk-yearly-aggr", "0 2 1 1 *") //assert require.Equal(t, ` option task = { name: "tsk-yearly-aggr", cron: "0 2 1 1 *", } sourceBucket = "metrics_monthly" rangeStart = -2y rangeEnd = -1y aggWindow = 1y destBucket = "metrics_yearly" destOrg = "scrutiny" from(bucket: sourceBucket) |> range(start: rangeStart, stop: rangeEnd) |> filter(fn: (r) => r["_measurement"] == "smart" ) |> group(columns: ["device_wwn", "_field"]) |> aggregateWindow(every: aggWindow, fn: last, createEmpty: false) |> to(bucket: destBucket, org: destOrg) from(bucket: sourceBucket) |> range(start: rangeStart, stop: rangeEnd) |> filter(fn: (r) => r["_measurement"] == "temp") |> group(columns: ["device_wwn"]) |> toInt() |> aggregateWindow(fn: mean, every: aggWindow, createEmpty: false) |> set(key: "_measurement", value: "temp") |> set(key: "_field", value: "temp") |> to(bucket: destBucket, org: destOrg) `, influxDbScript) } ================================================ FILE: webapp/backend/pkg/database/scrutiny_repository_temperature.go ================================================ package database import ( "context" "fmt" "strings" "time" "github.com/analogj/scrutiny/webapp/backend/pkg/models/collector" "github.com/analogj/scrutiny/webapp/backend/pkg/models/measurements" influxdb2 "github.com/influxdata/influxdb-client-go/v2" ) // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Temperature Data // ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// func (sr *scrutinyRepository) SaveSmartTemperature(ctx context.Context, wwn string, deviceProtocol string, collectorSmartData collector.SmartInfo, discardSCTTempHistory bool) error { if len(collectorSmartData.AtaSctTemperatureHistory.Table) > 0 && !discardSCTTempHistory { for ndx, temp := range collectorSmartData.AtaSctTemperatureHistory.Table { //temp value may be null, we must skip/ignore them. See #393 if temp == 0 { continue } intervalSec := collectorSmartData.AtaSctTemperatureHistory.LoggingIntervalMinutes * 60 datapointTime := collectorSmartData.LocalTime.TimeT - int64(ndx) * intervalSec alignedDatapointTime := datapointTime - datapointTime % intervalSec smartTemp := measurements.SmartTemperature{ Date: time.Unix(alignedDatapointTime, 0), Temp: temp, } tags, fields := smartTemp.Flatten() tags["device_wwn"] = wwn p := influxdb2.NewPoint("temp", tags, fields, smartTemp.Date) err := sr.influxWriteApi.WritePoint(ctx, p) if err != nil { return err } } } // Even if ata_sct_temperature_history is present, also add current temperature. See #824 smartTemp := measurements.SmartTemperature{ Date: time.Unix(collectorSmartData.LocalTime.TimeT, 0), Temp: collectorSmartData.Temperature.Current, } tags, fields := smartTemp.Flatten() tags["device_wwn"] = wwn p := influxdb2.NewPoint("temp", tags, fields, smartTemp.Date) return sr.influxWriteApi.WritePoint(ctx, p) } func (sr *scrutinyRepository) GetSmartTemperatureHistory(ctx context.Context, durationKey string) (map[string][]measurements.SmartTemperature, error) { //we can get temp history for "week", "month", DURATION_KEY_YEAR, "forever" deviceTempHistory := map[string][]measurements.SmartTemperature{} //TODO: change the query range to a variable. queryStr := sr.aggregateTempQuery(durationKey) result, err := sr.influxQueryApi.Query(ctx, queryStr) if err == nil { // Use Next() to iterate over query result lines for result.Next() { if deviceWWN, ok := result.Record().Values()["device_wwn"]; ok { //check if deviceWWN has been seen and initialized already if _, ok := deviceTempHistory[deviceWWN.(string)]; !ok { deviceTempHistory[deviceWWN.(string)] = []measurements.SmartTemperature{} } currentTempHistory := deviceTempHistory[deviceWWN.(string)] smartTemp := measurements.SmartTemperature{} for key, val := range result.Record().Values() { smartTemp.Inflate(key, val) } smartTemp.Date = result.Record().Values()["_time"].(time.Time) currentTempHistory = append(currentTempHistory, smartTemp) deviceTempHistory[deviceWWN.(string)] = currentTempHistory } } if result.Err() != nil { fmt.Printf("Query error: %s\n", result.Err().Error()) } } else { return nil, err } return deviceTempHistory, nil } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Helper Methods //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// func (sr *scrutinyRepository) aggregateTempQuery(durationKey string) string { /* import "influxdata/influxdb/schema" weekData = from(bucket: "metrics") |> range(start: -1w, stop: now()) |> filter(fn: (r) => r["_measurement"] == "temp" ) |> aggregateWindow(every: 1h, fn: mean, createEmpty: false) |> group(columns: ["device_wwn"]) |> toInt() monthData = from(bucket: "metrics_weekly") |> range(start: -1mo, stop: now()) |> filter(fn: (r) => r["_measurement"] == "temp" ) |> aggregateWindow(every: 1h, fn: mean, createEmpty: false) |> group(columns: ["device_wwn"]) |> toInt() union(tables: [weekData, monthData]) |> group(columns: ["device_wwn"]) |> sort(columns: ["_time"], desc: false) |> schema.fieldsAsCols() */ partialQueryStr := []string{ `import "influxdata/influxdb/schema"`, } nestedDurationKeys := sr.lookupNestedDurationKeys(durationKey) subQueryNames := []string{} for _, nestedDurationKey := range nestedDurationKeys { bucketName := sr.lookupBucketName(nestedDurationKey) durationRange := sr.lookupDuration(nestedDurationKey) durationResolution := sr.lookupResolution(nestedDurationKey) subQueryNames = append(subQueryNames, fmt.Sprintf(`%sData`, nestedDurationKey)) partialQueryStr = append(partialQueryStr, []string{ fmt.Sprintf(`%sData = from(bucket: "%s")`, nestedDurationKey, bucketName), fmt.Sprintf(`|> range(start: %s, stop: %s)`, durationRange[0], durationRange[1]), `|> filter(fn: (r) => r["_measurement"] == "temp" )`, fmt.Sprintf(`|> aggregateWindow(every: %s, fn: mean, createEmpty: false)`, durationResolution), `|> group(columns: ["device_wwn"])`, `|> toInt()`, "", }...) } if len(subQueryNames) == 1 { //there's only one bucket being queried, no need to union, just aggregate the dataset and return partialQueryStr = append(partialQueryStr, []string{ subQueryNames[0], "|> schema.fieldsAsCols()", "|> yield()", }...) } else { partialQueryStr = append(partialQueryStr, []string{ fmt.Sprintf("union(tables: [%s])", strings.Join(subQueryNames, ", ")), `|> group(columns: ["device_wwn"])`, `|> sort(columns: ["_time"], desc: false)`, "|> schema.fieldsAsCols()", }...) } return strings.Join(partialQueryStr, "\n") } ================================================ FILE: webapp/backend/pkg/database/scrutiny_repository_temperature_test.go ================================================ package database import ( "testing" mock_config "github.com/analogj/scrutiny/webapp/backend/pkg/config/mock" "github.com/stretchr/testify/require" "go.uber.org/mock/gomock" ) func Test_aggregateTempQuery_Week(t *testing.T) { t.Parallel() //setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() deviceRepo := scrutinyRepository{ appConfig: fakeConfig, } aggregationType := DURATION_KEY_WEEK //test influxDbScript := deviceRepo.aggregateTempQuery(aggregationType) //assert require.Equal(t, `import "influxdata/influxdb/schema" weekData = from(bucket: "metrics") |> range(start: -1w, stop: now()) |> filter(fn: (r) => r["_measurement"] == "temp" ) |> aggregateWindow(every: 1h, fn: mean, createEmpty: false) |> group(columns: ["device_wwn"]) |> toInt() weekData |> schema.fieldsAsCols() |> yield()`, influxDbScript) } func Test_aggregateTempQuery_Month(t *testing.T) { t.Parallel() //setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() deviceRepo := scrutinyRepository{ appConfig: fakeConfig, } aggregationType := DURATION_KEY_MONTH //test influxDbScript := deviceRepo.aggregateTempQuery(aggregationType) //assert require.Equal(t, `import "influxdata/influxdb/schema" weekData = from(bucket: "metrics") |> range(start: -1w, stop: now()) |> filter(fn: (r) => r["_measurement"] == "temp" ) |> aggregateWindow(every: 1h, fn: mean, createEmpty: false) |> group(columns: ["device_wwn"]) |> toInt() monthData = from(bucket: "metrics_weekly") |> range(start: -1mo, stop: -1w) |> filter(fn: (r) => r["_measurement"] == "temp" ) |> aggregateWindow(every: 1h, fn: mean, createEmpty: false) |> group(columns: ["device_wwn"]) |> toInt() union(tables: [weekData, monthData]) |> group(columns: ["device_wwn"]) |> sort(columns: ["_time"], desc: false) |> schema.fieldsAsCols()`, influxDbScript) } func Test_aggregateTempQuery_Year(t *testing.T) { t.Parallel() //setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() deviceRepo := scrutinyRepository{ appConfig: fakeConfig, } aggregationType := DURATION_KEY_YEAR //test influxDbScript := deviceRepo.aggregateTempQuery(aggregationType) //assert require.Equal(t, `import "influxdata/influxdb/schema" weekData = from(bucket: "metrics") |> range(start: -1w, stop: now()) |> filter(fn: (r) => r["_measurement"] == "temp" ) |> aggregateWindow(every: 1h, fn: mean, createEmpty: false) |> group(columns: ["device_wwn"]) |> toInt() monthData = from(bucket: "metrics_weekly") |> range(start: -1mo, stop: -1w) |> filter(fn: (r) => r["_measurement"] == "temp" ) |> aggregateWindow(every: 1h, fn: mean, createEmpty: false) |> group(columns: ["device_wwn"]) |> toInt() yearData = from(bucket: "metrics_monthly") |> range(start: -1y, stop: -1mo) |> filter(fn: (r) => r["_measurement"] == "temp" ) |> aggregateWindow(every: 1h, fn: mean, createEmpty: false) |> group(columns: ["device_wwn"]) |> toInt() union(tables: [weekData, monthData, yearData]) |> group(columns: ["device_wwn"]) |> sort(columns: ["_time"], desc: false) |> schema.fieldsAsCols()`, influxDbScript) } func Test_aggregateTempQuery_Forever(t *testing.T) { t.Parallel() //setup mockCtrl := gomock.NewController(t) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() deviceRepo := scrutinyRepository{ appConfig: fakeConfig, } aggregationType := DURATION_KEY_FOREVER //test influxDbScript := deviceRepo.aggregateTempQuery(aggregationType) //assert require.Equal(t, `import "influxdata/influxdb/schema" weekData = from(bucket: "metrics") |> range(start: -1w, stop: now()) |> filter(fn: (r) => r["_measurement"] == "temp" ) |> aggregateWindow(every: 1h, fn: mean, createEmpty: false) |> group(columns: ["device_wwn"]) |> toInt() monthData = from(bucket: "metrics_weekly") |> range(start: -1mo, stop: -1w) |> filter(fn: (r) => r["_measurement"] == "temp" ) |> aggregateWindow(every: 1h, fn: mean, createEmpty: false) |> group(columns: ["device_wwn"]) |> toInt() yearData = from(bucket: "metrics_monthly") |> range(start: -1y, stop: -1mo) |> filter(fn: (r) => r["_measurement"] == "temp" ) |> aggregateWindow(every: 1h, fn: mean, createEmpty: false) |> group(columns: ["device_wwn"]) |> toInt() foreverData = from(bucket: "metrics_yearly") |> range(start: -10y, stop: -1y) |> filter(fn: (r) => r["_measurement"] == "temp" ) |> aggregateWindow(every: 1h, fn: mean, createEmpty: false) |> group(columns: ["device_wwn"]) |> toInt() union(tables: [weekData, monthData, yearData, foreverData]) |> group(columns: ["device_wwn"]) |> sort(columns: ["_time"], desc: false) |> schema.fieldsAsCols()`, influxDbScript) } ================================================ FILE: webapp/backend/pkg/errors/errors.go ================================================ package errors import ( "fmt" ) // Raised when config file is missing type ConfigFileMissingError string func (str ConfigFileMissingError) Error() string { return fmt.Sprintf("ConfigFileMissingError: %q", string(str)) } // Raised when the config file doesnt match schema type ConfigValidationError string func (str ConfigValidationError) Error() string { return fmt.Sprintf("ConfigValidationError: %q", string(str)) } // Raised when a dependency (like smartd or ssh-agent) is missing type DependencyMissingError string func (str DependencyMissingError) Error() string { return fmt.Sprintf("DependencyMissingError: %q", string(str)) } // Raised when the notification system is incorrectly configured type NotificationValidationError string func (str NotificationValidationError) Error() string { return fmt.Sprintf("NotificationValidationError: %q", string(str)) } ================================================ FILE: webapp/backend/pkg/errors/errors_test.go ================================================ package errors_test import ( "github.com/analogj/scrutiny/webapp/backend/pkg/errors" "github.com/stretchr/testify/require" "testing" ) //func TestCheckErr_WithoutError(t *testing.T) { // t.Parallel() // // //assert // require.NotPanics(t, func() { // errors.CheckErr(nil) // }) //} //func TestCheckErr_Error(t *testing.T) { // t.Parallel() // // //assert // require.Panics(t, func() { // errors.CheckErr(stderrors.New("This is an error")) // }) //} func TestErrors(t *testing.T) { t.Parallel() //assert require.Implements(t, (*error)(nil), errors.ConfigFileMissingError("test"), "should implement the error interface") require.Implements(t, (*error)(nil), errors.ConfigValidationError("test"), "should implement the error interface") require.Implements(t, (*error)(nil), errors.DependencyMissingError("test"), "should implement the error interface") } ================================================ FILE: webapp/backend/pkg/models/collector/smart.go ================================================ package collector type SmartInfo struct { JSONFormatVersion []int `json:"json_format_version"` Smartctl struct { Version []int `json:"version"` SvnRevision string `json:"svn_revision"` PlatformInfo string `json:"platform_info"` BuildInfo string `json:"build_info"` Argv []string `json:"argv"` ExitStatus int `json:"exit_status"` Messages []struct { String string `json:"string"` Severity string `json:"severity"` } `json:"messages"` } `json:"smartctl"` Device struct { Name string `json:"name"` InfoName string `json:"info_name"` Type string `json:"type"` Protocol string `json:"protocol"` } `json:"device"` ModelName string `json:"model_name"` SerialNumber string `json:"serial_number"` Wwn struct { Naa uint64 `json:"naa"` Oui uint64 `json:"oui"` ID uint64 `json:"id"` } `json:"wwn"` FirmwareVersion string `json:"firmware_version"` UserCapacity UserCapacity `json:"user_capacity"` LogicalBlockSize int `json:"logical_block_size"` PhysicalBlockSize int `json:"physical_block_size"` RotationRate int `json:"rotation_rate"` FormFactor struct { AtaValue int `json:"ata_value"` Name string `json:"name"` } `json:"form_factor"` InSmartctlDatabase bool `json:"in_smartctl_database"` AtaVersion struct { String string `json:"string"` MajorValue int `json:"major_value"` MinorValue int `json:"minor_value"` } `json:"ata_version"` SataVersion struct { String string `json:"string"` Value int `json:"value"` } `json:"sata_version"` InterfaceSpeed struct { Max struct { SataValue int `json:"sata_value"` String string `json:"string"` UnitsPerSecond int `json:"units_per_second"` BitsPerUnit int `json:"bits_per_unit"` } `json:"max"` Current struct { SataValue int `json:"sata_value"` String string `json:"string"` UnitsPerSecond int `json:"units_per_second"` BitsPerUnit int `json:"bits_per_unit"` } `json:"current"` } `json:"interface_speed"` LocalTime struct { TimeT int64 `json:"time_t"` Asctime string `json:"asctime"` } `json:"local_time"` SmartStatus struct { Passed bool `json:"passed"` } `json:"smart_status"` PowerOnTime struct { Hours int64 `json:"hours"` } `json:"power_on_time"` PowerCycleCount int64 `json:"power_cycle_count"` Temperature struct { Current int64 `json:"current"` } `json:"temperature"` // ATA Protocol Specific Fields AtaSmartData struct { OfflineDataCollection struct { Status struct { Value int `json:"value"` String string `json:"string"` Passed bool `json:"passed"` } `json:"status"` CompletionSeconds int `json:"completion_seconds"` } `json:"offline_data_collection"` SelfTest struct { Status struct { Value int `json:"value"` String string `json:"string"` RemainingPercent int `json:"remaining_percent"` } `json:"status"` PollingMinutes struct { Short int `json:"short"` Extended int `json:"extended"` } `json:"polling_minutes"` } `json:"self_test"` Capabilities struct { Values []int `json:"values"` ExecOfflineImmediateSupported bool `json:"exec_offline_immediate_supported"` OfflineIsAbortedUponNewCmd bool `json:"offline_is_aborted_upon_new_cmd"` OfflineSurfaceScanSupported bool `json:"offline_surface_scan_supported"` SelfTestsSupported bool `json:"self_tests_supported"` ConveyanceSelfTestSupported bool `json:"conveyance_self_test_supported"` SelectiveSelfTestSupported bool `json:"selective_self_test_supported"` AttributeAutosaveEnabled bool `json:"attribute_autosave_enabled"` ErrorLoggingSupported bool `json:"error_logging_supported"` GpLoggingSupported bool `json:"gp_logging_supported"` } `json:"capabilities"` } `json:"ata_smart_data"` AtaSctCapabilities struct { Value int `json:"value"` ErrorRecoveryControlSupported bool `json:"error_recovery_control_supported"` FeatureControlSupported bool `json:"feature_control_supported"` DataTableSupported bool `json:"data_table_supported"` } `json:"ata_sct_capabilities"` AtaSctTemperatureHistory struct { Version int `json:"version"` SamplingPeriodMinutes int64 `json:"sampling_period_minutes"` LoggingIntervalMinutes int64 `json:"logging_interval_minutes"` Temperature struct { OpLimitMin int `json:"op_limit_min"` OpLimitMax int `json:"op_limit_max"` LimitMin int `json:"limit_min"` LimitMax int `json:"limit_max"` } `json:"temperature"` Size int `json:"size"` Index int `json:"index"` Table []int64 `json:"table"` } `json:"ata_sct_temperature_history"` AtaSmartAttributes struct { Revision int `json:"revision"` Table []AtaSmartAttributesTableItem `json:"table"` } `json:"ata_smart_attributes"` AtaSmartErrorLog struct { Summary struct { Revision int `json:"revision"` Count int `json:"count"` LoggedCount int `json:"logged_count"` Table []struct { ErrorNumber int `json:"error_number"` LifetimeHours int `json:"lifetime_hours"` CompletionRegisters struct { Error int `json:"error"` Status int `json:"status"` Count int `json:"count"` Lba uint64 `json:"lba"` Device int `json:"device"` } `json:"completion_registers"` ErrorDescription string `json:"error_description"` PreviousCommands []struct { Registers struct { Command int `json:"command"` Features int `json:"features"` Count int `json:"count"` Lba uint64 `json:"lba"` Device int `json:"device"` DeviceControl int `json:"device_control"` } `json:"registers"` PowerupMilliseconds int `json:"powerup_milliseconds"` CommandName string `json:"command_name"` } `json:"previous_commands"` } `json:"table"` } `json:"summary"` } `json:"ata_smart_error_log"` AtaSmartSelfTestLog struct { Standard struct { Revision int `json:"revision"` Table []struct { Type struct { Value int `json:"value"` String string `json:"string"` } `json:"type"` Status struct { Value int `json:"value"` String string `json:"string"` Passed bool `json:"passed"` } `json:"status"` LifetimeHours int `json:"lifetime_hours"` } `json:"table"` Count int `json:"count"` ErrorCountTotal int `json:"error_count_total"` ErrorCountOutdated int `json:"error_count_outdated"` } `json:"standard"` } `json:"ata_smart_self_test_log"` AtaSmartSelectiveSelfTestLog struct { Revision int `json:"revision"` Table []struct { LbaMin uint64 `json:"lba_min"` LbaMax uint64 `json:"lba_max"` Status struct { Value int `json:"value"` String string `json:"string"` } `json:"status"` } `json:"table"` Flags struct { Value int `json:"value"` RemainderScanEnabled bool `json:"remainder_scan_enabled"` } `json:"flags"` PowerUpScanResumeMinutes int `json:"power_up_scan_resume_minutes"` } `json:"ata_smart_selective_self_test_log"` // NVME Protocol Specific Fields NvmePciVendor struct { ID int `json:"id"` SubsystemID int `json:"subsystem_id"` } `json:"nvme_pci_vendor"` NvmeIeeeOuiIdentifier int `json:"nvme_ieee_oui_identifier"` NvmeTotalCapacity int64 `json:"nvme_total_capacity"` NvmeControllerID int `json:"nvme_controller_id"` NvmeNumberOfNamespaces int `json:"nvme_number_of_namespaces"` NvmeNamespaces []struct { ID int `json:"id"` Size struct { Blocks int `json:"blocks"` Bytes int64 `json:"bytes"` } `json:"size"` Capacity struct { Blocks int `json:"blocks"` Bytes int64 `json:"bytes"` } `json:"capacity"` Utilization struct { Blocks int `json:"blocks"` Bytes int64 `json:"bytes"` } `json:"utilization"` FormattedLbaSize int `json:"formatted_lba_size"` } `json:"nvme_namespaces"` NvmeSmartHealthInformationLog NvmeSmartHealthInformationLog `json:"nvme_smart_health_information_log"` // SCSI Protocol Specific Fields Vendor string `json:"vendor"` Product string `json:"product"` ScsiVersion string `json:"scsi_version"` ScsiGrownDefectList int64 `json:"scsi_grown_defect_list"` ScsiErrorCounterLog ScsiErrorCounterLog `json:"scsi_error_counter_log"` } // Capacity finds the total capacity of the device in bytes, or 0 if unknown. func (s *SmartInfo) Capacity() int64 { switch { case s.NvmeTotalCapacity > 0: return s.NvmeTotalCapacity case s.UserCapacity.Bytes > 0: return s.UserCapacity.Bytes } return 0 } type UserCapacity struct { Blocks int64 `json:"blocks"` Bytes int64 `json:"bytes"` } // Primary Attribute Structs type AtaSmartAttributesTableItem struct { ID int `json:"id"` Name string `json:"name"` Value int64 `json:"value"` Worst int64 `json:"worst"` Thresh int64 `json:"thresh"` WhenFailed string `json:"when_failed"` Flags struct { Value int `json:"value"` String string `json:"string"` Prefailure bool `json:"prefailure"` UpdatedOnline bool `json:"updated_online"` Performance bool `json:"performance"` ErrorRate bool `json:"error_rate"` EventCount bool `json:"event_count"` AutoKeep bool `json:"auto_keep"` } `json:"flags"` Raw struct { Value int64 `json:"value"` String string `json:"string"` } `json:"raw"` } type NvmeSmartHealthInformationLog struct { CriticalWarning int64 `json:"critical_warning"` Temperature int64 `json:"temperature"` AvailableSpare int64 `json:"available_spare"` AvailableSpareThreshold int64 `json:"available_spare_threshold"` PercentageUsed int64 `json:"percentage_used"` DataUnitsRead int64 `json:"data_units_read"` DataUnitsWritten int64 `json:"data_units_written"` HostReads int64 `json:"host_reads"` HostWrites int64 `json:"host_writes"` ControllerBusyTime int64 `json:"controller_busy_time"` PowerCycles int64 `json:"power_cycles"` PowerOnHours int64 `json:"power_on_hours"` UnsafeShutdowns int64 `json:"unsafe_shutdowns"` MediaErrors int64 `json:"media_errors"` NumErrLogEntries int64 `json:"num_err_log_entries"` WarningTempTime int64 `json:"warning_temp_time"` CriticalCompTime int64 `json:"critical_comp_time"` } type ScsiErrorCounterLog struct { Read struct { ErrorsCorrectedByEccfast int64 `json:"errors_corrected_by_eccfast"` ErrorsCorrectedByEccdelayed int64 `json:"errors_corrected_by_eccdelayed"` ErrorsCorrectedByRereadsRewrites int64 `json:"errors_corrected_by_rereads_rewrites"` TotalErrorsCorrected int64 `json:"total_errors_corrected"` CorrectionAlgorithmInvocations int64 `json:"correction_algorithm_invocations"` GigabytesProcessed string `json:"gigabytes_processed"` TotalUncorrectedErrors int64 `json:"total_uncorrected_errors"` } `json:"read"` Write struct { ErrorsCorrectedByEccfast int64 `json:"errors_corrected_by_eccfast"` ErrorsCorrectedByEccdelayed int64 `json:"errors_corrected_by_eccdelayed"` ErrorsCorrectedByRereadsRewrites int64 `json:"errors_corrected_by_rereads_rewrites"` TotalErrorsCorrected int64 `json:"total_errors_corrected"` CorrectionAlgorithmInvocations int64 `json:"correction_algorithm_invocations"` GigabytesProcessed string `json:"gigabytes_processed"` TotalUncorrectedErrors int64 `json:"total_uncorrected_errors"` } `json:"write"` } ================================================ FILE: webapp/backend/pkg/models/collector/smart_test.go ================================================ package collector import ( "testing" "github.com/stretchr/testify/assert" ) func TestSmartInfo_Capacity(t *testing.T) { t.Run("should report nvme capacity", func(t *testing.T) { smartInfo := SmartInfo{ UserCapacity: UserCapacity{ Bytes: 1234, }, NvmeTotalCapacity: 5678, } assert.Equal(t, int64(5678), smartInfo.Capacity()) }) t.Run("should report user capacity", func(t *testing.T) { smartInfo := SmartInfo{ UserCapacity: UserCapacity{ Bytes: 1234, }, } assert.Equal(t, int64(1234), smartInfo.Capacity()) }) t.Run("should report 0 for unknown capacities", func(t *testing.T) { var smartInfo SmartInfo assert.Zero(t, smartInfo.Capacity()) }) } ================================================ FILE: webapp/backend/pkg/models/device.go ================================================ package models import ( "github.com/analogj/scrutiny/webapp/backend/pkg" "github.com/analogj/scrutiny/webapp/backend/pkg/models/collector" "time" ) type DeviceWrapper struct { Success bool `json:"success"` Errors []error `json:"errors"` Data []Device `json:"data"` } type Device struct { //GORM attributes, see: http://gorm.io/docs/conventions.html Archived bool `json:"archived"` CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time WWN string `json:"wwn" gorm:"primary_key"` DeviceName string `json:"device_name"` DeviceUUID string `json:"device_uuid"` DeviceSerialID string `json:"device_serial_id"` DeviceLabel string `json:"device_label"` Manufacturer string `json:"manufacturer"` ModelName string `json:"model_name"` InterfaceType string `json:"interface_type"` InterfaceSpeed string `json:"interface_speed"` SerialNumber string `json:"serial_number"` Firmware string `json:"firmware"` RotationSpeed int `json:"rotational_speed"` Capacity int64 `json:"capacity"` FormFactor string `json:"form_factor"` SmartSupport bool `json:"smart_support"` DeviceProtocol string `json:"device_protocol"` //protocol determines which smart attribute types are available (ATA, NVMe, SCSI) DeviceType string `json:"device_type"` //device type is used for querying with -d/t flag, should only be used by collector. // User provided metadata Label string `json:"label"` HostId string `json:"host_id"` // Data set by Scrutiny DeviceStatus pkg.DeviceStatus `json:"device_status"` } func (dv *Device) IsAta() bool { return dv.DeviceProtocol == pkg.DeviceProtocolAta } func (dv *Device) IsScsi() bool { return dv.DeviceProtocol == pkg.DeviceProtocolScsi } func (dv *Device) IsNvme() bool { return dv.DeviceProtocol == pkg.DeviceProtocolNvme } // ////This method requires a device with an array of SmartResults. ////It will remove all SmartResults other than the first (the latest one) ////All removed SmartResults, will be processed, grouping SmartAtaAttribute by attribute_id //// and adding theme to an array called History. //func (dv *Device) SquashHistory() error { // if len(dv.SmartResults) <= 1 { // return nil //no ataHistory found. ignore // } // // latestSmartResultSlice := dv.SmartResults[0:1] // historicalSmartResultSlice := dv.SmartResults[1:] // // //re-assign the latest slice to the SmartResults field // dv.SmartResults = latestSmartResultSlice // // //process the historical slice for ATA data // if len(dv.SmartResults[0].AtaAttributes) > 0 { // ataHistory := map[int][]SmartAtaAttribute{} // for _, smartResult := range historicalSmartResultSlice { // for _, smartAttribute := range smartResult.AtaAttributes { // if _, ok := ataHistory[smartAttribute.AttributeId]; !ok { // ataHistory[smartAttribute.AttributeId] = []SmartAtaAttribute{} // } // ataHistory[smartAttribute.AttributeId] = append(ataHistory[smartAttribute.AttributeId], smartAttribute) // } // } // // //now assign the historical slices to the AtaAttributes in the latest SmartResults // for sandx, smartAttribute := range dv.SmartResults[0].AtaAttributes { // if attributeHistory, ok := ataHistory[smartAttribute.AttributeId]; ok { // dv.SmartResults[0].AtaAttributes[sandx].History = attributeHistory // } // } // } // // //process the historical slice for Nvme data // if len(dv.SmartResults[0].NvmeAttributes) > 0 { // nvmeHistory := map[string][]SmartNvmeAttribute{} // for _, smartResult := range historicalSmartResultSlice { // for _, smartAttribute := range smartResult.NvmeAttributes { // if _, ok := nvmeHistory[smartAttribute.AttributeId]; !ok { // nvmeHistory[smartAttribute.AttributeId] = []SmartNvmeAttribute{} // } // nvmeHistory[smartAttribute.AttributeId] = append(nvmeHistory[smartAttribute.AttributeId], smartAttribute) // } // } // // //now assign the historical slices to the AtaAttributes in the latest SmartResults // for sandx, smartAttribute := range dv.SmartResults[0].NvmeAttributes { // if attributeHistory, ok := nvmeHistory[smartAttribute.AttributeId]; ok { // dv.SmartResults[0].NvmeAttributes[sandx].History = attributeHistory // } // } // } // //process the historical slice for Scsi data // if len(dv.SmartResults[0].ScsiAttributes) > 0 { // scsiHistory := map[string][]SmartScsiAttribute{} // for _, smartResult := range historicalSmartResultSlice { // for _, smartAttribute := range smartResult.ScsiAttributes { // if _, ok := scsiHistory[smartAttribute.AttributeId]; !ok { // scsiHistory[smartAttribute.AttributeId] = []SmartScsiAttribute{} // } // scsiHistory[smartAttribute.AttributeId] = append(scsiHistory[smartAttribute.AttributeId], smartAttribute) // } // } // // //now assign the historical slices to the AtaAttributes in the latest SmartResults // for sandx, smartAttribute := range dv.SmartResults[0].ScsiAttributes { // if attributeHistory, ok := scsiHistory[smartAttribute.AttributeId]; ok { // dv.SmartResults[0].ScsiAttributes[sandx].History = attributeHistory // } // } // } // return nil //} // //func (dv *Device) ApplyMetadataRules() error { // // //embed metadata in the latest smart attributes object // if len(dv.SmartResults) > 0 { // for ndx, attr := range dv.SmartResults[0].AtaAttributes { // attr.PopulateAttributeStatus() // dv.SmartResults[0].AtaAttributes[ndx] = attr // } // // for ndx, attr := range dv.SmartResults[0].NvmeAttributes { // attr.PopulateAttributeStatus() // dv.SmartResults[0].NvmeAttributes[ndx] = attr // // } // // for ndx, attr := range dv.SmartResults[0].ScsiAttributes { // attr.PopulateAttributeStatus() // dv.SmartResults[0].ScsiAttributes[ndx] = attr // // } // } // return nil //} // This function is called every time the collector sends SMART data to the API. // It can be used to update device data that can change over time. func (dv *Device) UpdateFromCollectorSmartInfo(info collector.SmartInfo) error { dv.Firmware = info.FirmwareVersion dv.DeviceProtocol = info.Device.Protocol if !info.SmartStatus.Passed { dv.DeviceStatus = pkg.DeviceStatusSet(dv.DeviceStatus, pkg.DeviceStatusFailedSmart) } return nil } ================================================ FILE: webapp/backend/pkg/models/device_summary.go ================================================ package models import ( "github.com/analogj/scrutiny/webapp/backend/pkg/models/measurements" "time" ) type DeviceSummaryWrapper struct { Success bool `json:"success"` Errors []error `json:"errors"` Data struct { Summary map[string]*DeviceSummary `json:"summary"` } `json:"data"` } type DeviceSummary struct { Device Device `json:"device"` SmartResults *SmartSummary `json:"smart,omitempty"` TempHistory []measurements.SmartTemperature `json:"temp_history,omitempty"` } type SmartSummary struct { // Collector Summary Data CollectorDate time.Time `json:"collector_date,omitempty"` Temp int64 `json:"temp,omitempty"` PowerOnHours int64 `json:"power_on_hours,omitempty"` } ================================================ FILE: webapp/backend/pkg/models/measurements/smart.go ================================================ package measurements import ( "fmt" "log" "strconv" "strings" "time" "github.com/analogj/scrutiny/webapp/backend/pkg" "github.com/analogj/scrutiny/webapp/backend/pkg/models/collector" "github.com/analogj/scrutiny/webapp/backend/pkg/thresholds" ) type Smart struct { Date time.Time `json:"date"` DeviceWWN string `json:"device_wwn"` //(tag) DeviceProtocol string `json:"device_protocol"` //Metrics (fields) Temp int64 `json:"temp"` PowerOnHours int64 `json:"power_on_hours"` PowerCycleCount int64 `json:"power_cycle_count"` //Attributes (fields) Attributes map[string]SmartAttribute `json:"attrs"` //status Status pkg.DeviceStatus } func (sm *Smart) Flatten() (tags map[string]string, fields map[string]interface{}) { tags = map[string]string{ "device_wwn": sm.DeviceWWN, "device_protocol": sm.DeviceProtocol, } fields = map[string]interface{}{ "temp": sm.Temp, "power_on_hours": sm.PowerOnHours, "power_cycle_count": sm.PowerCycleCount, } for _, attr := range sm.Attributes { for attrKey, attrVal := range attr.Flatten() { fields[attrKey] = attrVal } } return tags, fields } func NewSmartFromInfluxDB(attrs map[string]interface{}) (*Smart, error) { //go though the massive map returned from influxdb. If a key is associated with the Smart struct, assign it. If it starts with "attr.*" group it by attributeId, and pass to attribute inflate. sm := Smart{ //required fields Date: attrs["_time"].(time.Time), DeviceWWN: attrs["device_wwn"].(string), DeviceProtocol: attrs["device_protocol"].(string), Attributes: map[string]SmartAttribute{}, } for key, val := range attrs { switch key { case "temp": temp, tempOk := val.(int64) if tempOk { sm.Temp = temp } else { log.Printf("unable to parse temp information: %v", val) } case "power_on_hours": powerOn, powerOnOk := val.(int64) if powerOnOk { sm.PowerOnHours = powerOn } else { log.Printf("unable to parse power_on_hours information: %v", val) } case "power_cycle_count": powerCycle, powerCycleOk := val.(int64) if powerCycleOk { sm.PowerCycleCount = powerCycle } else { log.Printf("unable to parse power_cycle_count information: %v", val) } default: // this key is unknown. if !strings.HasPrefix(key, "attr.") { continue } //this is a attribute, lets group it with its related "siblings", populating a SmartAttribute object keyParts := strings.Split(key, ".") attributeId := keyParts[1] if _, ok := sm.Attributes[attributeId]; !ok { // init the attribute group if sm.DeviceProtocol == pkg.DeviceProtocolAta { sm.Attributes[attributeId] = &SmartAtaAttribute{} } else if sm.DeviceProtocol == pkg.DeviceProtocolNvme { sm.Attributes[attributeId] = &SmartNvmeAttribute{} } else if sm.DeviceProtocol == pkg.DeviceProtocolScsi { sm.Attributes[attributeId] = &SmartScsiAttribute{} } else { return nil, fmt.Errorf("unknown Device Protocol: %s", sm.DeviceProtocol) } } sm.Attributes[attributeId].Inflate(key, val) } } log.Printf("Found Smart Device (%s) Attributes (%v)", sm.DeviceWWN, len(sm.Attributes)) return &sm, nil } // Parse Collector SMART data results and create Smart object (and associated SmartAtaAttribute entries) func (sm *Smart) FromCollectorSmartInfo(wwn string, info collector.SmartInfo) error { sm.DeviceWWN = wwn sm.Date = time.Unix(info.LocalTime.TimeT, 0) //smart metrics sm.Temp = info.Temperature.Current sm.PowerCycleCount = info.PowerCycleCount sm.PowerOnHours = info.PowerOnTime.Hours if !info.SmartStatus.Passed { sm.Status = pkg.DeviceStatusSet(sm.Status, pkg.DeviceStatusFailedSmart) } sm.DeviceProtocol = info.Device.Protocol // process ATA/NVME/SCSI protocol data sm.Attributes = map[string]SmartAttribute{} if sm.DeviceProtocol == pkg.DeviceProtocolAta { sm.ProcessAtaSmartInfo(info.AtaSmartAttributes.Table) } else if sm.DeviceProtocol == pkg.DeviceProtocolNvme { sm.ProcessNvmeSmartInfo(info.NvmeSmartHealthInformationLog) } else if sm.DeviceProtocol == pkg.DeviceProtocolScsi { sm.ProcessScsiSmartInfo(info.ScsiGrownDefectList, info.ScsiErrorCounterLog) } return nil } // generate SmartAtaAttribute entries from Scrutiny Collector Smart data. func (sm *Smart) ProcessAtaSmartInfo(tableItems []collector.AtaSmartAttributesTableItem) { for _, collectorAttr := range tableItems { attrModel := SmartAtaAttribute{ AttributeId: collectorAttr.ID, Value: collectorAttr.Value, Worst: collectorAttr.Worst, Threshold: collectorAttr.Thresh, RawValue: collectorAttr.Raw.Value, RawString: collectorAttr.Raw.String, WhenFailed: collectorAttr.WhenFailed, } //now that we've parsed the data from the smartctl response, lets match it against our metadata rules and add additional Scrutiny specific data. if smartMetadata, ok := thresholds.AtaMetadata[collectorAttr.ID]; ok { if smartMetadata.Transform != nil { attrModel.TransformedValue = smartMetadata.Transform(attrModel.Value, attrModel.RawValue, attrModel.RawString) } } attrModel.PopulateAttributeStatus() sm.Attributes[strconv.Itoa(collectorAttr.ID)] = &attrModel if pkg.AttributeStatusHas(attrModel.Status, pkg.AttributeStatusFailedScrutiny) { sm.Status = pkg.DeviceStatusSet(sm.Status, pkg.DeviceStatusFailedScrutiny) } } } // generate SmartNvmeAttribute entries from Scrutiny Collector Smart data. func (sm *Smart) ProcessNvmeSmartInfo(nvmeSmartHealthInformationLog collector.NvmeSmartHealthInformationLog) { sm.Attributes = map[string]SmartAttribute{ "critical_warning": (&SmartNvmeAttribute{AttributeId: "critical_warning", Value: nvmeSmartHealthInformationLog.CriticalWarning, Threshold: 0}).PopulateAttributeStatus(), "temperature": (&SmartNvmeAttribute{AttributeId: "temperature", Value: nvmeSmartHealthInformationLog.Temperature, Threshold: -1}).PopulateAttributeStatus(), "available_spare": (&SmartNvmeAttribute{AttributeId: "available_spare", Value: nvmeSmartHealthInformationLog.AvailableSpare, Threshold: nvmeSmartHealthInformationLog.AvailableSpareThreshold}).PopulateAttributeStatus(), "percentage_used": (&SmartNvmeAttribute{AttributeId: "percentage_used", Value: nvmeSmartHealthInformationLog.PercentageUsed, Threshold: 100}).PopulateAttributeStatus(), "data_units_read": (&SmartNvmeAttribute{AttributeId: "data_units_read", Value: nvmeSmartHealthInformationLog.DataUnitsRead, Threshold: -1}).PopulateAttributeStatus(), "data_units_written": (&SmartNvmeAttribute{AttributeId: "data_units_written", Value: nvmeSmartHealthInformationLog.DataUnitsWritten, Threshold: -1}).PopulateAttributeStatus(), "host_reads": (&SmartNvmeAttribute{AttributeId: "host_reads", Value: nvmeSmartHealthInformationLog.HostReads, Threshold: -1}).PopulateAttributeStatus(), "host_writes": (&SmartNvmeAttribute{AttributeId: "host_writes", Value: nvmeSmartHealthInformationLog.HostWrites, Threshold: -1}).PopulateAttributeStatus(), "controller_busy_time": (&SmartNvmeAttribute{AttributeId: "controller_busy_time", Value: nvmeSmartHealthInformationLog.ControllerBusyTime, Threshold: -1}).PopulateAttributeStatus(), "power_cycles": (&SmartNvmeAttribute{AttributeId: "power_cycles", Value: nvmeSmartHealthInformationLog.PowerCycles, Threshold: -1}).PopulateAttributeStatus(), "power_on_hours": (&SmartNvmeAttribute{AttributeId: "power_on_hours", Value: nvmeSmartHealthInformationLog.PowerOnHours, Threshold: -1}).PopulateAttributeStatus(), "unsafe_shutdowns": (&SmartNvmeAttribute{AttributeId: "unsafe_shutdowns", Value: nvmeSmartHealthInformationLog.UnsafeShutdowns, Threshold: -1}).PopulateAttributeStatus(), "media_errors": (&SmartNvmeAttribute{AttributeId: "media_errors", Value: nvmeSmartHealthInformationLog.MediaErrors, Threshold: 0}).PopulateAttributeStatus(), "num_err_log_entries": (&SmartNvmeAttribute{AttributeId: "num_err_log_entries", Value: nvmeSmartHealthInformationLog.NumErrLogEntries, Threshold: -1}).PopulateAttributeStatus(), "warning_temp_time": (&SmartNvmeAttribute{AttributeId: "warning_temp_time", Value: nvmeSmartHealthInformationLog.WarningTempTime, Threshold: -1}).PopulateAttributeStatus(), "critical_comp_time": (&SmartNvmeAttribute{AttributeId: "critical_comp_time", Value: nvmeSmartHealthInformationLog.CriticalCompTime, Threshold: -1}).PopulateAttributeStatus(), } //find analyzed attribute status for _, val := range sm.Attributes { if pkg.AttributeStatusHas(val.GetStatus(), pkg.AttributeStatusFailedScrutiny) { sm.Status = pkg.DeviceStatusSet(sm.Status, pkg.DeviceStatusFailedScrutiny) } } } // generate SmartScsiAttribute entries from Scrutiny Collector Smart data. func (sm *Smart) ProcessScsiSmartInfo(defectGrownList int64, scsiErrorCounterLog collector.ScsiErrorCounterLog) { sm.Attributes = map[string]SmartAttribute{ "scsi_grown_defect_list": (&SmartScsiAttribute{AttributeId: "scsi_grown_defect_list", Value: defectGrownList, Threshold: 0}).PopulateAttributeStatus(), "read_errors_corrected_by_eccfast": (&SmartScsiAttribute{AttributeId: "read_errors_corrected_by_eccfast", Value: scsiErrorCounterLog.Read.ErrorsCorrectedByEccfast, Threshold: -1}).PopulateAttributeStatus(), "read_errors_corrected_by_eccdelayed": (&SmartScsiAttribute{AttributeId: "read_errors_corrected_by_eccdelayed", Value: scsiErrorCounterLog.Read.ErrorsCorrectedByEccdelayed, Threshold: -1}).PopulateAttributeStatus(), "read_errors_corrected_by_rereads_rewrites": (&SmartScsiAttribute{AttributeId: "read_errors_corrected_by_rereads_rewrites", Value: scsiErrorCounterLog.Read.ErrorsCorrectedByRereadsRewrites, Threshold: 0}).PopulateAttributeStatus(), "read_total_errors_corrected": (&SmartScsiAttribute{AttributeId: "read_total_errors_corrected", Value: scsiErrorCounterLog.Read.TotalErrorsCorrected, Threshold: -1}).PopulateAttributeStatus(), "read_correction_algorithm_invocations": (&SmartScsiAttribute{AttributeId: "read_correction_algorithm_invocations", Value: scsiErrorCounterLog.Read.CorrectionAlgorithmInvocations, Threshold: -1}).PopulateAttributeStatus(), "read_total_uncorrected_errors": (&SmartScsiAttribute{AttributeId: "read_total_uncorrected_errors", Value: scsiErrorCounterLog.Read.TotalUncorrectedErrors, Threshold: 0}).PopulateAttributeStatus(), "write_errors_corrected_by_eccfast": (&SmartScsiAttribute{AttributeId: "write_errors_corrected_by_eccfast", Value: scsiErrorCounterLog.Write.ErrorsCorrectedByEccfast, Threshold: -1}).PopulateAttributeStatus(), "write_errors_corrected_by_eccdelayed": (&SmartScsiAttribute{AttributeId: "write_errors_corrected_by_eccdelayed", Value: scsiErrorCounterLog.Write.ErrorsCorrectedByEccdelayed, Threshold: -1}).PopulateAttributeStatus(), "write_errors_corrected_by_rereads_rewrites": (&SmartScsiAttribute{AttributeId: "write_errors_corrected_by_rereads_rewrites", Value: scsiErrorCounterLog.Write.ErrorsCorrectedByRereadsRewrites, Threshold: 0}).PopulateAttributeStatus(), "write_total_errors_corrected": (&SmartScsiAttribute{AttributeId: "write_total_errors_corrected", Value: scsiErrorCounterLog.Write.TotalErrorsCorrected, Threshold: -1}).PopulateAttributeStatus(), "write_correction_algorithm_invocations": (&SmartScsiAttribute{AttributeId: "write_correction_algorithm_invocations", Value: scsiErrorCounterLog.Write.CorrectionAlgorithmInvocations, Threshold: -1}).PopulateAttributeStatus(), "write_total_uncorrected_errors": (&SmartScsiAttribute{AttributeId: "write_total_uncorrected_errors", Value: scsiErrorCounterLog.Write.TotalUncorrectedErrors, Threshold: 0}).PopulateAttributeStatus(), } //find analyzed attribute status for _, val := range sm.Attributes { if pkg.AttributeStatusHas(val.GetStatus(), pkg.AttributeStatusFailedScrutiny) { sm.Status = pkg.DeviceStatusSet(sm.Status, pkg.DeviceStatusFailedScrutiny) } } } ================================================ FILE: webapp/backend/pkg/models/measurements/smart_ata_attribute.go ================================================ package measurements import ( "fmt" "strconv" "strings" "github.com/analogj/scrutiny/webapp/backend/pkg" "github.com/analogj/scrutiny/webapp/backend/pkg/thresholds" ) type SmartAtaAttribute struct { AttributeId int `json:"attribute_id"` Value int64 `json:"value"` Threshold int64 `json:"thresh"` Worst int64 `json:"worst"` RawValue int64 `json:"raw_value"` RawString string `json:"raw_string"` WhenFailed string `json:"when_failed"` //Generated data TransformedValue int64 `json:"transformed_value"` Status pkg.AttributeStatus `json:"status"` StatusReason string `json:"status_reason,omitempty"` FailureRate float64 `json:"failure_rate,omitempty"` } func (sa *SmartAtaAttribute) GetTransformedValue() int64 { return sa.TransformedValue } func (sa *SmartAtaAttribute) GetStatus() pkg.AttributeStatus { return sa.Status } func (sa *SmartAtaAttribute) Flatten() map[string]interface{} { idString := strconv.Itoa(sa.AttributeId) return map[string]interface{}{ fmt.Sprintf("attr.%s.attribute_id", idString): idString, fmt.Sprintf("attr.%s.value", idString): sa.Value, fmt.Sprintf("attr.%s.worst", idString): sa.Worst, fmt.Sprintf("attr.%s.thresh", idString): sa.Threshold, fmt.Sprintf("attr.%s.raw_value", idString): sa.RawValue, fmt.Sprintf("attr.%s.raw_string", idString): sa.RawString, fmt.Sprintf("attr.%s.when_failed", idString): sa.WhenFailed, //Generated Data fmt.Sprintf("attr.%s.transformed_value", idString): sa.TransformedValue, fmt.Sprintf("attr.%s.status", idString): int64(sa.Status), fmt.Sprintf("attr.%s.status_reason", idString): sa.StatusReason, fmt.Sprintf("attr.%s.failure_rate", idString): sa.FailureRate, } } func (sa *SmartAtaAttribute) Inflate(key string, val interface{}) { if val == nil { return } keyParts := strings.Split(key, ".") switch keyParts[2] { case "attribute_id": attrId, err := strconv.Atoi(val.(string)) if err == nil { sa.AttributeId = attrId } case "value": sa.Value = val.(int64) case "worst": sa.Worst = val.(int64) case "thresh": sa.Threshold = val.(int64) case "raw_value": sa.RawValue = val.(int64) case "raw_string": sa.RawString = val.(string) case "when_failed": sa.WhenFailed = val.(string) //generated case "transformed_value": sa.TransformedValue = val.(int64) case "status": sa.Status = pkg.AttributeStatus(val.(int64)) case "status_reason": sa.StatusReason = val.(string) case "failure_rate": sa.FailureRate = val.(float64) } } // populate attribute status, using SMART Thresholds & Observed Metadata // Chainable func (sa *SmartAtaAttribute) PopulateAttributeStatus() *SmartAtaAttribute { if strings.ToUpper(sa.WhenFailed) == pkg.AttributeWhenFailedFailingNow { //this attribute has previously failed sa.Status = pkg.AttributeStatusSet(sa.Status, pkg.AttributeStatusFailedSmart) sa.StatusReason += "Attribute is failing manufacturer SMART threshold" //if the Smart Status is failed, we should exit early, no need to look at thresholds. return sa } else if strings.ToUpper(sa.WhenFailed) == pkg.AttributeWhenFailedInThePast { sa.Status = pkg.AttributeStatusSet(sa.Status, pkg.AttributeStatusWarningScrutiny) sa.StatusReason += "Attribute has previously failed manufacturer SMART threshold" } if smartMetadata, ok := thresholds.AtaMetadata[sa.AttributeId]; ok { sa.ValidateThreshold(smartMetadata) } return sa } // compare the attribute (raw, normalized, transformed) value to observed thresholds, and update status if necessary func (sa *SmartAtaAttribute) ValidateThreshold(smartMetadata thresholds.AtaAttributeMetadata) { //TODO: multiple rules // try to predict the failure rates for observed thresholds that have 0 failure rate and error bars. // - if the attribute is critical // - the failure rate is over 10 - set to failed // - the attribute does not match any threshold, set to warn // - if the attribute is not critical // - if failure rate is above 20 - set to failed // - if failure rate is above 10 but below 20 - set to warn //update the smart attribute status based on Observed thresholds. var value int64 if smartMetadata.DisplayType == thresholds.AtaSmartAttributeDisplayTypeNormalized { value = int64(sa.Value) } else if smartMetadata.DisplayType == thresholds.AtaSmartAttributeDisplayTypeTransformed { value = sa.TransformedValue } else { value = sa.RawValue } for _, obsThresh := range smartMetadata.ObservedThresholds { //check if "value" is in this bucket if ((obsThresh.Low == obsThresh.High) && value == obsThresh.Low) || (obsThresh.Low < value && value <= obsThresh.High) { sa.FailureRate = obsThresh.AnnualFailureRate if smartMetadata.Critical { if obsThresh.AnnualFailureRate >= 0.10 { sa.Status = pkg.AttributeStatusSet(sa.Status, pkg.AttributeStatusFailedScrutiny) sa.StatusReason += "Observed Failure Rate for Critical Attribute is greater than 10%" } } else { if obsThresh.AnnualFailureRate >= 0.20 { sa.Status = pkg.AttributeStatusSet(sa.Status, pkg.AttributeStatusFailedScrutiny) sa.StatusReason += "Observed Failure Rate for Non-Critical Attribute is greater than 20%" } else if obsThresh.AnnualFailureRate >= 0.10 { sa.Status = pkg.AttributeStatusSet(sa.Status, pkg.AttributeStatusWarningScrutiny) sa.StatusReason += "Observed Failure Rate for Non-Critical Attribute is greater than 10%" } } //we've found the correct bucket, we can drop out of this loop return } } // no bucket found if smartMetadata.Critical { sa.Status = pkg.AttributeStatusSet(sa.Status, pkg.AttributeStatusWarningScrutiny) sa.StatusReason = "Could not determine Observed Failure Rate for Critical Attribute" } } ================================================ FILE: webapp/backend/pkg/models/measurements/smart_attribute.go ================================================ package measurements import "github.com/analogj/scrutiny/webapp/backend/pkg" type SmartAttribute interface { Flatten() (fields map[string]interface{}) Inflate(key string, val interface{}) GetStatus() pkg.AttributeStatus GetTransformedValue() int64 } ================================================ FILE: webapp/backend/pkg/models/measurements/smart_nvme_attribute.go ================================================ package measurements import ( "fmt" "strings" "github.com/analogj/scrutiny/webapp/backend/pkg" "github.com/analogj/scrutiny/webapp/backend/pkg/thresholds" ) type SmartNvmeAttribute struct { AttributeId string `json:"attribute_id"` //json string from smartctl Value int64 `json:"value"` Threshold int64 `json:"thresh"` TransformedValue int64 `json:"transformed_value"` Status pkg.AttributeStatus `json:"status"` StatusReason string `json:"status_reason,omitempty"` FailureRate float64 `json:"failure_rate,omitempty"` } func (sa *SmartNvmeAttribute) GetTransformedValue() int64 { return sa.TransformedValue } func (sa *SmartNvmeAttribute) GetStatus() pkg.AttributeStatus { return sa.Status } func (sa *SmartNvmeAttribute) Flatten() map[string]interface{} { return map[string]interface{}{ fmt.Sprintf("attr.%s.attribute_id", sa.AttributeId): sa.AttributeId, fmt.Sprintf("attr.%s.value", sa.AttributeId): sa.Value, fmt.Sprintf("attr.%s.thresh", sa.AttributeId): sa.Threshold, //Generated Data fmt.Sprintf("attr.%s.transformed_value", sa.AttributeId): sa.TransformedValue, fmt.Sprintf("attr.%s.status", sa.AttributeId): int64(sa.Status), fmt.Sprintf("attr.%s.status_reason", sa.AttributeId): sa.StatusReason, fmt.Sprintf("attr.%s.failure_rate", sa.AttributeId): sa.FailureRate, } } func (sa *SmartNvmeAttribute) Inflate(key string, val interface{}) { if val == nil { return } keyParts := strings.Split(key, ".") switch keyParts[2] { case "attribute_id": sa.AttributeId = val.(string) case "value": sa.Value = val.(int64) case "thresh": sa.Threshold = val.(int64) //generated case "transformed_value": sa.TransformedValue = val.(int64) case "status": sa.Status = pkg.AttributeStatus(val.(int64)) case "status_reason": sa.StatusReason = val.(string) case "failure_rate": sa.FailureRate = val.(float64) } } //populate attribute status, using SMART Thresholds & Observed Metadata // Chainable func (sa *SmartNvmeAttribute) PopulateAttributeStatus() *SmartNvmeAttribute { //-1 is a special number meaning no threshold. if sa.Threshold != -1 { if smartMetadata, ok := thresholds.NmveMetadata[sa.AttributeId]; ok { //check what the ideal is. Ideal tells us if we our recorded value needs to be above, or below the threshold if (smartMetadata.Ideal == "low" && sa.Value > sa.Threshold) || (smartMetadata.Ideal == "high" && sa.Value < sa.Threshold) { sa.Status = pkg.AttributeStatusSet(sa.Status, pkg.AttributeStatusFailedScrutiny) sa.StatusReason += "Attribute is failing recommended SMART threshold" } } } //TODO: eventually figure out the critical_warning bits and determine correct error messages here. return sa } ================================================ FILE: webapp/backend/pkg/models/measurements/smart_scsci_attribute.go ================================================ package measurements import ( "fmt" "strings" "github.com/analogj/scrutiny/webapp/backend/pkg" "github.com/analogj/scrutiny/webapp/backend/pkg/thresholds" ) type SmartScsiAttribute struct { AttributeId string `json:"attribute_id"` //json string from smartctl Value int64 `json:"value"` Threshold int64 `json:"thresh"` TransformedValue int64 `json:"transformed_value"` Status pkg.AttributeStatus `json:"status"` StatusReason string `json:"status_reason,omitempty"` FailureRate float64 `json:"failure_rate,omitempty"` } func (sa *SmartScsiAttribute) GetTransformedValue() int64 { return sa.TransformedValue } func (sa *SmartScsiAttribute) GetStatus() pkg.AttributeStatus { return sa.Status } func (sa *SmartScsiAttribute) Flatten() map[string]interface{} { return map[string]interface{}{ fmt.Sprintf("attr.%s.attribute_id", sa.AttributeId): sa.AttributeId, fmt.Sprintf("attr.%s.value", sa.AttributeId): sa.Value, fmt.Sprintf("attr.%s.thresh", sa.AttributeId): sa.Threshold, //Generated Data fmt.Sprintf("attr.%s.transformed_value", sa.AttributeId): sa.TransformedValue, fmt.Sprintf("attr.%s.status", sa.AttributeId): int64(sa.Status), fmt.Sprintf("attr.%s.status_reason", sa.AttributeId): sa.StatusReason, fmt.Sprintf("attr.%s.failure_rate", sa.AttributeId): sa.FailureRate, } } func (sa *SmartScsiAttribute) Inflate(key string, val interface{}) { if val == nil { return } keyParts := strings.Split(key, ".") switch keyParts[2] { case "attribute_id": sa.AttributeId = val.(string) case "value": sa.Value = val.(int64) case "thresh": sa.Threshold = val.(int64) //generated case "transformed_value": sa.TransformedValue = val.(int64) case "status": sa.Status = pkg.AttributeStatus(val.(int64)) case "status_reason": sa.StatusReason = val.(string) case "failure_rate": sa.FailureRate = val.(float64) } } // //populate attribute status, using SMART Thresholds & Observed Metadata //Chainable func (sa *SmartScsiAttribute) PopulateAttributeStatus() *SmartScsiAttribute { //-1 is a special number meaning no threshold. if sa.Threshold != -1 { if smartMetadata, ok := thresholds.NmveMetadata[sa.AttributeId]; ok { //check what the ideal is. Ideal tells us if we our recorded value needs to be above, or below the threshold if (smartMetadata.Ideal == "low" && sa.Value > sa.Threshold) || (smartMetadata.Ideal == "high" && sa.Value < sa.Threshold) { sa.Status = pkg.AttributeStatusSet(sa.Status, pkg.AttributeStatusFailedScrutiny) sa.StatusReason = "Attribute is failing recommended SMART threshold" } } } return sa } ================================================ FILE: webapp/backend/pkg/models/measurements/smart_temperature.go ================================================ package measurements import ( "time" ) type SmartTemperature struct { Date time.Time `json:"date"` Temp int64 `json:"temp"` } func (st *SmartTemperature) Flatten() (tags map[string]string, fields map[string]interface{}) { fields = map[string]interface{}{ "temp": st.Temp, } tags = map[string]string{} return tags, fields } func (st *SmartTemperature) Inflate(key string, val interface{}) { if val == nil { return } if key == "temp" { switch t := val.(type) { case int64: st.Temp = t case float64: st.Temp = int64(t) } } } ================================================ FILE: webapp/backend/pkg/models/measurements/smart_test.go ================================================ package measurements_test import ( "encoding/json" "io" "os" "testing" "time" "github.com/analogj/scrutiny/webapp/backend/pkg" "github.com/analogj/scrutiny/webapp/backend/pkg/models/collector" "github.com/analogj/scrutiny/webapp/backend/pkg/models/measurements" "github.com/stretchr/testify/require" ) func TestSmart_Flatten(t *testing.T) { //setup timeNow := time.Now() smart := measurements.Smart{ Date: timeNow, DeviceWWN: "test-wwn", DeviceProtocol: pkg.DeviceProtocolAta, Temp: 50, PowerOnHours: 10, PowerCycleCount: 10, Attributes: nil, Status: 0, } //test tags, fields := smart.Flatten() //assert require.Equal(t, map[string]string{"device_protocol": "ATA", "device_wwn": "test-wwn"}, tags) require.Equal(t, map[string]interface{}{"power_cycle_count": int64(10), "power_on_hours": int64(10), "temp": int64(50)}, fields) } func TestSmart_Flatten_ATA(t *testing.T) { //setup timeNow := time.Now() smart := measurements.Smart{ Date: timeNow, DeviceWWN: "test-wwn", DeviceProtocol: pkg.DeviceProtocolAta, Temp: 50, PowerOnHours: 10, PowerCycleCount: 10, Status: 0, Attributes: map[string]measurements.SmartAttribute{ "1": &measurements.SmartAtaAttribute{ AttributeId: 1, Value: 100, Threshold: 1, Worst: 100, RawValue: 0, RawString: "0", WhenFailed: "", }, "2": &measurements.SmartAtaAttribute{ AttributeId: 2, Value: 135, Threshold: 54, Worst: 135, RawValue: 108, RawString: "108", WhenFailed: "", }, }, } //test tags, fields := smart.Flatten() //assert require.Equal(t, map[string]string{"device_protocol": "ATA", "device_wwn": "test-wwn"}, tags) require.Equal(t, map[string]interface{}{ "attr.1.attribute_id": "1", "attr.1.failure_rate": float64(0), "attr.1.raw_string": "0", "attr.1.raw_value": int64(0), "attr.1.status": int64(0), "attr.1.status_reason": "", "attr.1.thresh": int64(1), "attr.1.transformed_value": int64(0), "attr.1.value": int64(100), "attr.1.when_failed": "", "attr.1.worst": int64(100), "attr.2.attribute_id": "2", "attr.2.failure_rate": float64(0), "attr.2.raw_string": "108", "attr.2.raw_value": int64(108), "attr.2.status": int64(0), "attr.2.status_reason": "", "attr.2.thresh": int64(54), "attr.2.transformed_value": int64(0), "attr.2.value": int64(135), "attr.2.when_failed": "", "attr.2.worst": int64(135), "power_cycle_count": int64(10), "power_on_hours": int64(10), "temp": int64(50), }, fields) } func TestSmart_Flatten_SCSI(t *testing.T) { //setup timeNow := time.Now() smart := measurements.Smart{ Date: timeNow, DeviceWWN: "test-wwn", DeviceProtocol: pkg.DeviceProtocolScsi, Temp: 50, PowerOnHours: 10, PowerCycleCount: 10, Status: 0, Attributes: map[string]measurements.SmartAttribute{ "read_errors_corrected_by_eccfast": &measurements.SmartScsiAttribute{ AttributeId: "read_errors_corrected_by_eccfast", Value: int64(300357663), }, }, } //test tags, fields := smart.Flatten() //assert require.Equal(t, map[string]string{"device_protocol": "SCSI", "device_wwn": "test-wwn"}, tags) require.Equal(t, map[string]interface{}{ "attr.read_errors_corrected_by_eccfast.attribute_id": "read_errors_corrected_by_eccfast", "attr.read_errors_corrected_by_eccfast.failure_rate": float64(0), "attr.read_errors_corrected_by_eccfast.status": int64(0), "attr.read_errors_corrected_by_eccfast.status_reason": "", "attr.read_errors_corrected_by_eccfast.thresh": int64(0), "attr.read_errors_corrected_by_eccfast.transformed_value": int64(0), "attr.read_errors_corrected_by_eccfast.value": int64(300357663), "power_cycle_count": int64(10), "power_on_hours": int64(10), "temp": int64(50)}, fields) } func TestSmart_Flatten_NVMe(t *testing.T) { //setup timeNow := time.Now() smart := measurements.Smart{ Date: timeNow, DeviceWWN: "test-wwn", DeviceProtocol: pkg.DeviceProtocolNvme, Temp: 50, PowerOnHours: 10, PowerCycleCount: 10, Status: 0, Attributes: map[string]measurements.SmartAttribute{ "available_spare": &measurements.SmartNvmeAttribute{ AttributeId: "available_spare", Value: int64(100), }, }, } //test tags, fields := smart.Flatten() //assert require.Equal(t, map[string]string{"device_protocol": "NVMe", "device_wwn": "test-wwn"}, tags) require.Equal(t, map[string]interface{}{ "attr.available_spare.attribute_id": "available_spare", "attr.available_spare.failure_rate": float64(0), "attr.available_spare.status": int64(0), "attr.available_spare.status_reason": "", "attr.available_spare.thresh": int64(0), "attr.available_spare.transformed_value": int64(0), "attr.available_spare.value": int64(100), "power_cycle_count": int64(10), "power_on_hours": int64(10), "temp": int64(50)}, fields) } func TestNewSmartFromInfluxDB_ATA(t *testing.T) { //setup timeNow := time.Now() attrs := map[string]interface{}{ "_time": timeNow, "device_wwn": "test-wwn", "device_protocol": pkg.DeviceProtocolAta, "attr.1.attribute_id": "1", "attr.1.failure_rate": float64(0), "attr.1.raw_string": "108", "attr.1.raw_value": int64(108), "attr.1.status": int64(0), "attr.1.status_reason": "", "attr.1.thresh": int64(54), "attr.1.transformed_value": int64(0), "attr.1.value": int64(135), "attr.1.when_failed": "", "attr.1.worst": int64(135), "power_cycle_count": int64(10), "power_on_hours": int64(10), "temp": int64(50), } //test smart, err := measurements.NewSmartFromInfluxDB(attrs) //assert require.NoError(t, err) require.Equal(t, &measurements.Smart{ Date: timeNow, DeviceWWN: "test-wwn", DeviceProtocol: "ATA", Temp: 50, PowerOnHours: 10, PowerCycleCount: 10, Attributes: map[string]measurements.SmartAttribute{ "1": &measurements.SmartAtaAttribute{ AttributeId: 1, Value: 135, Threshold: 54, Worst: 135, RawValue: 108, RawString: "108", WhenFailed: "", }, }, Status: 0}, smart) } func TestNewSmartFromInfluxDB_NVMe(t *testing.T) { //setup timeNow := time.Now() attrs := map[string]interface{}{ "_time": timeNow, "device_wwn": "test-wwn", "device_protocol": pkg.DeviceProtocolNvme, "attr.available_spare.attribute_id": "available_spare", "attr.available_spare.failure_rate": float64(0), "attr.available_spare.status": int64(0), "attr.available_spare.status_reason": "", "attr.available_spare.thresh": int64(0), "attr.available_spare.transformed_value": int64(0), "attr.available_spare.value": int64(100), "power_cycle_count": int64(10), "power_on_hours": int64(10), "temp": int64(50), } //test smart, err := measurements.NewSmartFromInfluxDB(attrs) //assert require.NoError(t, err) require.Equal(t, &measurements.Smart{ Date: timeNow, DeviceWWN: "test-wwn", DeviceProtocol: "NVMe", Temp: 50, PowerOnHours: 10, PowerCycleCount: 10, Attributes: map[string]measurements.SmartAttribute{ "available_spare": &measurements.SmartNvmeAttribute{ AttributeId: "available_spare", Value: int64(100), }, }, Status: 0}, smart) } func TestNewSmartFromInfluxDB_SCSI(t *testing.T) { //setup timeNow := time.Now() attrs := map[string]interface{}{ "_time": timeNow, "device_wwn": "test-wwn", "device_protocol": pkg.DeviceProtocolScsi, "attr.read_errors_corrected_by_eccfast.attribute_id": "read_errors_corrected_by_eccfast", "attr.read_errors_corrected_by_eccfast.failure_rate": float64(0), "attr.read_errors_corrected_by_eccfast.status": int64(0), "attr.read_errors_corrected_by_eccfast.status_reason": "", "attr.read_errors_corrected_by_eccfast.thresh": int64(0), "attr.read_errors_corrected_by_eccfast.transformed_value": int64(0), "attr.read_errors_corrected_by_eccfast.value": int64(300357663), "power_cycle_count": int64(10), "power_on_hours": int64(10), "temp": int64(50), } //test smart, err := measurements.NewSmartFromInfluxDB(attrs) //assert require.NoError(t, err) require.Equal(t, &measurements.Smart{ Date: timeNow, DeviceWWN: "test-wwn", DeviceProtocol: "SCSI", Temp: 50, PowerOnHours: 10, PowerCycleCount: 10, Attributes: map[string]measurements.SmartAttribute{ "read_errors_corrected_by_eccfast": &measurements.SmartScsiAttribute{ AttributeId: "read_errors_corrected_by_eccfast", Value: int64(300357663), }, }, Status: 0}, smart) } func TestFromCollectorSmartInfo(t *testing.T) { //setup smartDataFile, err := os.Open("../testdata/smart-ata.json") require.NoError(t, err) defer smartDataFile.Close() var smartJson collector.SmartInfo smartDataBytes, err := io.ReadAll(smartDataFile) require.NoError(t, err) err = json.Unmarshal(smartDataBytes, &smartJson) require.NoError(t, err) //test smartMdl := measurements.Smart{} err = smartMdl.FromCollectorSmartInfo("WWN-test", smartJson) //assert require.NoError(t, err) require.Equal(t, "WWN-test", smartMdl.DeviceWWN) require.Equal(t, pkg.DeviceStatusPassed, smartMdl.Status) require.Equal(t, 18, len(smartMdl.Attributes)) //check that temperature was correctly parsed require.Equal(t, int64(163210330144), smartMdl.Attributes["194"].(*measurements.SmartAtaAttribute).RawValue) require.Equal(t, int64(32), smartMdl.Attributes["194"].(*measurements.SmartAtaAttribute).TransformedValue) //ensure that Scrutiny warning for a non critical attribute does not set device status to failed. require.Equal(t, pkg.AttributeStatusWarningScrutiny, smartMdl.Attributes["3"].GetStatus()) } func TestFromCollectorSmartInfo_Fail_Smart(t *testing.T) { //setup smartDataFile, err := os.Open("../testdata/smart-fail.json") require.NoError(t, err) defer smartDataFile.Close() var smartJson collector.SmartInfo smartDataBytes, err := io.ReadAll(smartDataFile) require.NoError(t, err) err = json.Unmarshal(smartDataBytes, &smartJson) require.NoError(t, err) //test smartMdl := measurements.Smart{} err = smartMdl.FromCollectorSmartInfo("WWN-test", smartJson) //assert require.NoError(t, err) require.Equal(t, "WWN-test", smartMdl.DeviceWWN) require.Equal(t, pkg.DeviceStatusFailedSmart, smartMdl.Status) require.Equal(t, 0, len(smartMdl.Attributes)) } func TestFromCollectorSmartInfo_Fail_ScrutinySmart(t *testing.T) { //setup smartDataFile, err := os.Open("../testdata/smart-fail2.json") require.NoError(t, err) defer smartDataFile.Close() var smartJson collector.SmartInfo smartDataBytes, err := io.ReadAll(smartDataFile) require.NoError(t, err) err = json.Unmarshal(smartDataBytes, &smartJson) require.NoError(t, err) //test smartMdl := measurements.Smart{} err = smartMdl.FromCollectorSmartInfo("WWN-test", smartJson) //assert require.NoError(t, err) require.Equal(t, "WWN-test", smartMdl.DeviceWWN) require.Equal(t, pkg.DeviceStatusFailedScrutiny|pkg.DeviceStatusFailedSmart, smartMdl.Status) require.Equal(t, 17, len(smartMdl.Attributes)) } func TestFromCollectorSmartInfo_Fail_ScrutinyNonCriticalFailed(t *testing.T) { //setup smartDataFile, err := os.Open("../testdata/smart-ata-failed-scrutiny.json") require.NoError(t, err) defer smartDataFile.Close() var smartJson collector.SmartInfo smartDataBytes, err := io.ReadAll(smartDataFile) require.NoError(t, err) err = json.Unmarshal(smartDataBytes, &smartJson) require.NoError(t, err) //test smartMdl := measurements.Smart{} err = smartMdl.FromCollectorSmartInfo("WWN-test", smartJson) //assert require.NoError(t, err) require.Equal(t, "WWN-test", smartMdl.DeviceWWN) require.Equal(t, pkg.DeviceStatusFailedScrutiny, smartMdl.Status) require.Equal(t, pkg.AttributeStatusFailedScrutiny, smartMdl.Attributes["199"].GetStatus(), "scrutiny should detect that %d failed (status: %d, %s)", smartMdl.Attributes["199"].(*measurements.SmartAtaAttribute).AttributeId, smartMdl.Attributes["199"].GetStatus(), smartMdl.Attributes["199"].(*measurements.SmartAtaAttribute).StatusReason, ) require.Equal(t, 14, len(smartMdl.Attributes)) } //TODO: Scrutiny Warn //TODO: Smart + Scrutiny Warn func TestFromCollectorSmartInfo_NVMe_Fail_Scrutiny(t *testing.T) { //setup smartDataFile, err := os.Open("../testdata/smart-nvme-failed.json") require.NoError(t, err) defer smartDataFile.Close() var smartJson collector.SmartInfo smartDataBytes, err := io.ReadAll(smartDataFile) require.NoError(t, err) err = json.Unmarshal(smartDataBytes, &smartJson) require.NoError(t, err) //test smartMdl := measurements.Smart{} err = smartMdl.FromCollectorSmartInfo("WWN-test", smartJson) //assert require.NoError(t, err) require.Equal(t, "WWN-test", smartMdl.DeviceWWN) require.Equal(t, pkg.DeviceStatusFailedScrutiny, smartMdl.Status) require.Equal(t, pkg.AttributeStatusFailedScrutiny, smartMdl.Attributes["media_errors"].GetStatus(), "scrutiny should detect that %s failed (status: %d, %s)", smartMdl.Attributes["media_errors"].(*measurements.SmartNvmeAttribute).AttributeId, smartMdl.Attributes["media_errors"].GetStatus(), smartMdl.Attributes["media_errors"].(*measurements.SmartNvmeAttribute).StatusReason, ) require.Equal(t, 16, len(smartMdl.Attributes)) } func TestFromCollectorSmartInfo_Nvme(t *testing.T) { //setup smartDataFile, err := os.Open("../testdata/smart-nvme.json") require.NoError(t, err) defer smartDataFile.Close() var smartJson collector.SmartInfo smartDataBytes, err := io.ReadAll(smartDataFile) require.NoError(t, err) err = json.Unmarshal(smartDataBytes, &smartJson) require.NoError(t, err) //test smartMdl := measurements.Smart{} err = smartMdl.FromCollectorSmartInfo("WWN-test", smartJson) //assert require.NoError(t, err) require.Equal(t, "WWN-test", smartMdl.DeviceWWN) require.Equal(t, pkg.DeviceStatusPassed, smartMdl.Status) require.Equal(t, 16, len(smartMdl.Attributes)) require.Equal(t, int64(111303174), smartMdl.Attributes["host_reads"].(*measurements.SmartNvmeAttribute).Value) require.Equal(t, int64(83170961), smartMdl.Attributes["host_writes"].(*measurements.SmartNvmeAttribute).Value) } func TestFromCollectorSmartInfo_Scsi(t *testing.T) { //setup smartDataFile, err := os.Open("../testdata/smart-scsi.json") require.NoError(t, err) defer smartDataFile.Close() var smartJson collector.SmartInfo smartDataBytes, err := io.ReadAll(smartDataFile) require.NoError(t, err) err = json.Unmarshal(smartDataBytes, &smartJson) require.NoError(t, err) //test smartMdl := measurements.Smart{} err = smartMdl.FromCollectorSmartInfo("WWN-test", smartJson) //assert require.NoError(t, err) require.Equal(t, "WWN-test", smartMdl.DeviceWWN) require.Equal(t, pkg.DeviceStatusPassed, smartMdl.Status) require.Equal(t, 13, len(smartMdl.Attributes)) require.Equal(t, int64(56), smartMdl.Attributes["scsi_grown_defect_list"].(*measurements.SmartScsiAttribute).Value) require.Equal(t, int64(300357663), smartMdl.Attributes["read_errors_corrected_by_eccfast"].(*measurements.SmartScsiAttribute).Value) //total_errors_corrected } ================================================ FILE: webapp/backend/pkg/models/setting_entry.go ================================================ package models import ( "gorm.io/gorm" ) // SettingEntry matches a setting row in the database type SettingEntry struct { //GORM attributes, see: http://gorm.io/docs/conventions.html gorm.Model SettingKeyName string `json:"setting_key_name" gorm:"unique;not null"` SettingKeyDescription string `json:"setting_key_description"` SettingDataType string `json:"setting_data_type"` SettingValueNumeric int `json:"setting_value_numeric"` SettingValueString string `json:"setting_value_string"` SettingValueBool bool `json:"setting_value_bool"` } func (s SettingEntry) TableName() string { return "settings" } ================================================ FILE: webapp/backend/pkg/models/settings.go ================================================ package models // Settings is made up of parsed SettingEntry objects retrieved from the database //type Settings struct { // MetricsNotifyLevel pkg.MetricsNotifyLevel `json:"metrics.notify.level" mapstructure:"metrics.notify.level"` // MetricsStatusFilterAttributes pkg.MetricsStatusFilterAttributes `json:"metrics.status.filter_attributes" mapstructure:"metrics.status.filter_attributes"` // MetricsStatusThreshold pkg.MetricsStatusThreshold `json:"metrics.status.threshold" mapstructure:"metrics.status.threshold"` //} type Settings struct { Theme string `json:"theme" mapstructure:"theme"` Layout string `json:"layout" mapstructure:"layout"` DashboardDisplay string `json:"dashboard_display" mapstructure:"dashboard_display"` DashboardSort string `json:"dashboard_sort" mapstructure:"dashboard_sort"` TemperatureUnit string `json:"temperature_unit" mapstructure:"temperature_unit"` FileSizeSIUnits bool `json:"file_size_si_units" mapstructure:"file_size_si_units"` LineStroke string `json:"line_stroke" mapstructure:"line_stroke"` PoweredOnHoursUnit string `json:"powered_on_hours_unit" mapstructure:"powered_on_hours_unit"` Collector struct { DiscardSCTTempHistory bool `json:"discard_sct_temp_history" mapstructure:"discard_sct_temp_history"` } `json:"collector" mapstructure:"collector"` Metrics struct { NotifyLevel int `json:"notify_level" mapstructure:"notify_level"` StatusFilterAttributes int `json:"status_filter_attributes" mapstructure:"status_filter_attributes"` StatusThreshold int `json:"status_threshold" mapstructure:"status_threshold"` RepeatNotifications bool `json:"repeat_notifications" mapstructure:"repeat_notifications"` } `json:"metrics" mapstructure:"metrics"` } ================================================ FILE: webapp/backend/pkg/models/testdata/helper.go ================================================ package main import ( "bytes" "encoding/json" "fmt" "io" "log" "net/http" "os" "time" "github.com/analogj/scrutiny/webapp/backend/pkg/models/collector" ) func main() { //webapp/backend/pkg/web/testdata/register-devices-req.json devices := "webapp/backend/pkg/web/testdata/register-devices-req.json" smartData := map[string][]string{ "0x5000cca264eb01d7": {"webapp/backend/pkg/models/testdata/smart-ata.json", "webapp/backend/pkg/models/testdata/smart-ata-date.json", "webapp/backend/pkg/models/testdata/smart-ata-date2.json"}, "0x5000cca264ec3183": {"webapp/backend/pkg/models/testdata/smart-fail2.json"}, "0x5002538e40a22954": {"webapp/backend/pkg/models/testdata/smart-nvme.json"}, "0x5000cca252c859cc": {"webapp/backend/pkg/models/testdata/smart-scsi.json"}, "0x5000cca264ebc248": {"webapp/backend/pkg/models/testdata/smart-scsi2.json"}, } // send a post request to register devices file, err := os.Open(devices) if err != nil { log.Fatalf("ERROR %v", err) } defer file.Close() _, err = SendPostRequest("http://localhost:8080/api/devices/register", file) if err != nil { log.Fatalf("ERROR %v", err) } // for diskId, smartDataFileNames := range smartData { for _, smartDataFileName := range smartDataFileNames { for daysToSubtract := 0; daysToSubtract <= 30; daysToSubtract++ { //add 4 weeks worth of data smartDataReader, err := readSmartDataFileFixTimestamp(daysToSubtract, smartDataFileName) if err != nil { log.Fatalf("ERROR %v", err) } _, err = SendPostRequest(fmt.Sprintf("http://localhost:8080/api/device/%s/smart", diskId), smartDataReader) if err != nil { log.Fatalf("ERROR %v", err) } } } } } func SendPostRequest(url string, file io.Reader) ([]byte, error) { response, err := http.Post(url, "application/json", file) if err != nil { return nil, err } defer response.Body.Close() log.Printf("%v\n", response.Status) return io.ReadAll(response.Body) } // InfluxDB will throw an error/ignore any submitted data with a timestamp older than the // retention period. Lets fix this by opening test files, modifying the timestamp and returning an io.Reader func readSmartDataFileFixTimestamp(daysToSubtract int, smartDataFilepath string) (io.Reader, error) { metricsfile, err := os.Open(smartDataFilepath) if err != nil { return nil, err } metricsFileData, err := io.ReadAll(metricsfile) if err != nil { return nil, err } //unmarshal because we need to change the timestamp var smartData collector.SmartInfo err = json.Unmarshal(metricsFileData, &smartData) if err != nil { return nil, err } daysToSubtractInHours := time.Duration(-1 * 24 * daysToSubtract) smartData.LocalTime.TimeT = time.Now().Add(daysToSubtractInHours * time.Hour).Unix() updatedSmartDataBytes, err := json.Marshal(smartData) return bytes.NewReader(updatedSmartDataBytes), nil } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-ata-date.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-linux-4.19.128-flatcar", "build_info": "(local build)", "argv": [ "smartctl", "-j", "-a", "/dev/sdb" ], "exit_status": 0 }, "device": { "name": "/dev/sdb", "info_name": "/dev/sdb [SAT]", "type": "sat", "protocol": "ATA" }, "model_name": "WDC WD140EDFZ-11A0VA0", "serial_number": "9RK1XXXX", "wwn": { "naa": 5, "oui": 3274, "id": 10283057623 }, "firmware_version": "81.00A81", "user_capacity": { "blocks": 27344764928, "bytes": 14000519643136 }, "logical_block_size": 512, "physical_block_size": 4096, "rotation_rate": 5400, "form_factor": { "ata_value": 2, "name": "3.5 inches" }, "in_smartctl_database": false, "ata_version": { "string": "ACS-2, ATA8-ACS T13/1699-D revision 4", "major_value": 1020, "minor_value": 41 }, "sata_version": { "string": "SATA 3.2", "value": 255 }, "interface_speed": { "max": { "sata_value": 14, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 }, "current": { "sata_value": 3, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 } }, "local_time": { "time_t": 1637039918, "asctime": "Sun Jun 30 00:03:30 2021 UTC" }, "smart_status": { "passed": true }, "ata_smart_data": { "offline_data_collection": { "status": { "value": 130, "string": "was completed without error", "passed": true }, "completion_seconds": 101 }, "self_test": { "status": { "value": 241, "string": "in progress, 10% remaining", "remaining_percent": 10 }, "polling_minutes": { "short": 2, "extended": 1479 } }, "capabilities": { "values": [ 91, 3 ], "exec_offline_immediate_supported": true, "offline_is_aborted_upon_new_cmd": false, "offline_surface_scan_supported": true, "self_tests_supported": true, "conveyance_self_test_supported": false, "selective_self_test_supported": true, "attribute_autosave_enabled": true, "error_logging_supported": true, "gp_logging_supported": true } }, "ata_sct_capabilities": { "value": 61, "error_recovery_control_supported": true, "feature_control_supported": true, "data_table_supported": true }, "ata_smart_attributes": { "revision": 16, "table": [ { "id": 1, "name": "Raw_Read_Error_Rate", "value": 100, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 11, "string": "PO-R-- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 2, "name": "Throughput_Performance", "value": 135, "worst": 135, "thresh": 54, "when_failed": "", "flags": { "value": 4, "string": "--S--- ", "prefailure": false, "updated_online": false, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 108, "string": "108" } }, { "id": 3, "name": "Spin_Up_Time", "value": 81, "worst": 81, "thresh": 1, "when_failed": "", "flags": { "value": 7, "string": "POS--- ", "prefailure": true, "updated_online": true, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 30089675132, "string": "380 (Average 380)" } }, { "id": 4, "name": "Start_Stop_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 9, "string": "9" } }, { "id": 5, "name": "Reallocated_Sector_Ct", "value": 100, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 51, "string": "PO--CK ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 7, "name": "Seek_Error_Rate", "value": 100, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 10, "string": "-O-R-- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 8, "name": "Seek_Time_Performance", "value": 133, "worst": 133, "thresh": 20, "when_failed": "", "flags": { "value": 4, "string": "--S--- ", "prefailure": false, "updated_online": false, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 18, "string": "18" } }, { "id": 9, "name": "Power_On_Hours", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 1730, "string": "1730" } }, { "id": 10, "name": "Spin_Retry_Count", "value": 100, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 12, "name": "Power_Cycle_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 9, "string": "9" } }, { "id": 22, "name": "Unknown_Attribute", "value": 100, "worst": 100, "thresh": 25, "when_failed": "", "flags": { "value": 35, "string": "PO---K ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 100, "string": "100" } }, { "id": 192, "name": "Power-Off_Retract_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 329, "string": "329" } }, { "id": 193, "name": "Load_Cycle_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 329, "string": "329" } }, { "id": 194, "name": "Temperature_Celsius", "value": 51, "worst": 51, "thresh": 0, "when_failed": "", "flags": { "value": 2, "string": "-O---- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 163210330144, "string": "32 (Min/Max 24/38)" } }, { "id": 196, "name": "Reallocated_Event_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 197, "name": "Current_Pending_Sector", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 34, "string": "-O---K ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 198, "name": "Offline_Uncorrectable", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 8, "string": "---R-- ", "prefailure": false, "updated_online": false, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 199, "name": "UDMA_CRC_Error_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 10, "string": "-O-R-- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } } ] }, "power_on_time": { "hours": 1730 }, "power_cycle_count": 9, "temperature": { "current": 32 }, "ata_smart_error_log": { "summary": { "revision": 1, "count": 0 } }, "ata_smart_self_test_log": { "standard": { "revision": 1, "table": [ { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1708 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1684 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1661 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1636 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1624 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1541 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1517 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1493 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1469 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1445 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1439 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1373 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1349 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1325 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1301 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1277 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1253 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1252 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1205 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1181 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1157 } ], "count": 21, "error_count_total": 0, "error_count_outdated": 0 } }, "ata_smart_selective_self_test_log": { "revision": 1, "table": [ { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } } ], "flags": { "value": 0, "remainder_scan_enabled": false }, "power_up_scan_resume_minutes": 0 } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-ata-date2.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-linux-4.19.128-flatcar", "build_info": "(local build)", "argv": [ "smartctl", "-j", "-a", "/dev/sdb" ], "exit_status": 0 }, "device": { "name": "/dev/sdb", "info_name": "/dev/sdb [SAT]", "type": "sat", "protocol": "ATA" }, "model_name": "WDC WD140EDFZ-11A0VA0", "serial_number": "9RK1XXXX", "wwn": { "naa": 5, "oui": 3274, "id": 10283057623 }, "firmware_version": "81.00A81", "user_capacity": { "blocks": 27344764928, "bytes": 14000519643136 }, "logical_block_size": 512, "physical_block_size": 4096, "rotation_rate": 5400, "form_factor": { "ata_value": 2, "name": "3.5 inches" }, "in_smartctl_database": false, "ata_version": { "string": "ACS-2, ATA8-ACS T13/1699-D revision 4", "major_value": 1020, "minor_value": 41 }, "sata_version": { "string": "SATA 3.2", "value": 255 }, "interface_speed": { "max": { "sata_value": 14, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 }, "current": { "sata_value": 3, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 } }, "local_time": { "time_t": 1637039918, "asctime": "Tue Feb 23 00:03:30 2021 UTC" }, "smart_status": { "passed": true }, "ata_smart_data": { "offline_data_collection": { "status": { "value": 130, "string": "was completed without error", "passed": true }, "completion_seconds": 101 }, "self_test": { "status": { "value": 241, "string": "in progress, 10% remaining", "remaining_percent": 10 }, "polling_minutes": { "short": 2, "extended": 1479 } }, "capabilities": { "values": [ 91, 3 ], "exec_offline_immediate_supported": true, "offline_is_aborted_upon_new_cmd": false, "offline_surface_scan_supported": true, "self_tests_supported": true, "conveyance_self_test_supported": false, "selective_self_test_supported": true, "attribute_autosave_enabled": true, "error_logging_supported": true, "gp_logging_supported": true } }, "ata_sct_capabilities": { "value": 61, "error_recovery_control_supported": true, "feature_control_supported": true, "data_table_supported": true }, "ata_smart_attributes": { "revision": 16, "table": [ { "id": 1, "name": "Raw_Read_Error_Rate", "value": 90, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 11, "string": "PO-R-- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 10, "string": "0" } }, { "id": 2, "name": "Throughput_Performance", "value": 125, "worst": 135, "thresh": 54, "when_failed": "", "flags": { "value": 4, "string": "--S--- ", "prefailure": false, "updated_online": false, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 118, "string": "108" } }, { "id": 3, "name": "Spin_Up_Time", "value": 71, "worst": 81, "thresh": 1, "when_failed": "", "flags": { "value": 7, "string": "POS--- ", "prefailure": true, "updated_online": true, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 30089675142, "string": "380 (Average 380)" } }, { "id": 4, "name": "Start_Stop_Count", "value": 90, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 19, "string": "9" } }, { "id": 5, "name": "Reallocated_Sector_Ct", "value": 90, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 51, "string": "PO--CK ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 10, "string": "0" } }, { "id": 7, "name": "Seek_Error_Rate", "value": 90, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 10, "string": "-O-R-- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 10, "string": "0" } }, { "id": 8, "name": "Seek_Time_Performance", "value": 123, "worst": 133, "thresh": 20, "when_failed": "", "flags": { "value": 4, "string": "--S--- ", "prefailure": false, "updated_online": false, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 28, "string": "18" } }, { "id": 9, "name": "Power_On_Hours", "value": 90, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 1740, "string": "1730" } }, { "id": 10, "name": "Spin_Retry_Count", "value": 90, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 10, "string": "0" } }, { "id": 12, "name": "Power_Cycle_Count", "value": 90, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 19, "string": "9" } }, { "id": 22, "name": "Unknown_Attribute", "value": 90, "worst": 100, "thresh": 25, "when_failed": "", "flags": { "value": 35, "string": "PO---K ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 110, "string": "100" } }, { "id": 192, "name": "Power-Off_Retract_Count", "value": 90, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 339, "string": "329" } }, { "id": 193, "name": "Load_Cycle_Count", "value": 90, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 339, "string": "329" } }, { "id": 194, "name": "Temperature_Celsius", "value": 41, "worst": 51, "thresh": 0, "when_failed": "", "flags": { "value": 2, "string": "-O---- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 163210330154, "string": "32 (Min/Max 24/38)" } }, { "id": 196, "name": "Reallocated_Event_Count", "value": 90, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 10, "string": "0" } }, { "id": 197, "name": "Current_Pending_Sector", "value": 90, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 34, "string": "-O---K ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 10, "string": "0" } }, { "id": 198, "name": "Offline_Uncorrectable", "value": 90, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 8, "string": "---R-- ", "prefailure": false, "updated_online": false, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 10, "string": "0" } }, { "id": 199, "name": "UDMA_CRC_Error_Count", "value": 90, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 10, "string": "-O-R-- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 10, "string": "0" } } ] }, "power_on_time": { "hours": 3030 }, "power_cycle_count": 9, "temperature": { "current": 62 }, "ata_smart_error_log": { "summary": { "revision": 1, "count": 0 } }, "ata_smart_self_test_log": { "standard": { "revision": 1, "table": [ { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1708 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1684 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1661 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1636 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1624 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1541 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1517 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1493 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1469 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1445 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1439 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1373 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1349 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1325 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1301 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1277 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1253 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1252 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1205 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1181 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1157 } ], "count": 21, "error_count_total": 0, "error_count_outdated": 0 } }, "ata_smart_selective_self_test_log": { "revision": 1, "table": [ { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } } ], "flags": { "value": 0, "remainder_scan_enabled": false }, "power_up_scan_resume_minutes": 0 } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-ata-failed-scrutiny.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-linux-5.13.0-40-generic", "build_info": "(local build)", "argv": [ "smartctl", "-x", "-j", "/dev/sda" ], "exit_status": 0 }, "device": { "name": "/dev/sda", "info_name": "/dev/sda [SAT]", "type": "sat", "protocol": "ATA" }, "model_family": "Samsung based SSDs", "model_name": "Samsung SSD 840 Series", "serial_number": "S14LNEACC02756X", "wwn": { "naa": 5, "oui": 9528, "id": 22817852457 }, "firmware_version": "DXT06B0Q", "user_capacity": { "blocks": 976773168, "bytes": 500107862016 }, "logical_block_size": 512, "physical_block_size": 512, "rotation_rate": 0, "in_smartctl_database": true, "ata_version": { "string": "ACS-2, ATA8-ACS T13/1699-D revision 4c", "major_value": 1020, "minor_value": 57 }, "sata_version": { "string": "SATA 3.1", "value": 127 }, "interface_speed": { "max": { "sata_value": 14, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 }, "current": { "sata_value": 3, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 } }, "local_time": { "time_t": 1652219998, "asctime": "Tue May 10 21:59:58 2022 UTC" }, "read_lookahead": { "enabled": true }, "write_cache": { "enabled": true }, "ata_security": { "state": 41, "string": "Disabled, frozen [SEC2]", "enabled": false, "frozen": true }, "smart_status": { "passed": true }, "ata_smart_data": { "offline_data_collection": { "status": { "value": 0, "string": "was never started" }, "completion_seconds": 53956 }, "self_test": { "status": { "value": 0, "string": "completed without error", "passed": true }, "polling_minutes": { "short": 2, "extended": 70 } }, "capabilities": { "values": [ 83, 3 ], "exec_offline_immediate_supported": true, "offline_is_aborted_upon_new_cmd": false, "offline_surface_scan_supported": false, "self_tests_supported": true, "conveyance_self_test_supported": false, "selective_self_test_supported": true, "attribute_autosave_enabled": true, "error_logging_supported": true, "gp_logging_supported": true } }, "ata_sct_capabilities": { "value": 61, "error_recovery_control_supported": true, "feature_control_supported": true, "data_table_supported": true }, "ata_smart_attributes": { "revision": 1, "table": [ { "id": 5, "name": "Reallocated_Sector_Ct", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 51, "string": "PO--CK ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 9, "name": "Power_On_Hours", "value": 96, "worst": 96, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 19497, "string": "19497" } }, { "id": 12, "name": "Power_Cycle_Count", "value": 95, "worst": 95, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 4169, "string": "4169" } }, { "id": 177, "name": "Wear_Leveling_Count", "value": 98, "worst": 98, "thresh": 0, "when_failed": "", "flags": { "value": 19, "string": "PO--C- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 14, "string": "14" } }, { "id": 179, "name": "Used_Rsvd_Blk_Cnt_Tot", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 19, "string": "PO--C- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 181, "name": "Program_Fail_Cnt_Total", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 182, "name": "Erase_Fail_Count_Total", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 183, "name": "Runtime_Bad_Block", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 19, "string": "PO--C- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 187, "name": "Uncorrectable_Error_Cnt", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 190, "name": "Airflow_Temperature_Cel", "value": 67, "worst": 44, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 33, "string": "33" } }, { "id": 195, "name": "ECC_Error_Rate", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 26, "string": "-O-RC- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": true, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 199, "name": "CRC_Error_Count", "value": 99, "worst": 99, "thresh": 0, "when_failed": "", "flags": { "value": 62, "string": "-OSRCK ", "prefailure": false, "updated_online": true, "performance": true, "error_rate": true, "event_count": true, "auto_keep": true }, "raw": { "value": 108, "string": "108" } }, { "id": 235, "name": "POR_Recovery_Count", "value": 99, "worst": 99, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 3583, "string": "3583" } }, { "id": 241, "name": "Total_LBAs_Written", "value": 99, "worst": 99, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 10935822505, "string": "10935822505" } } ] }, "power_on_time": { "hours": 19497 }, "power_cycle_count": 4169, "temperature": { "current": 33, "power_cycle_min": 31, "power_cycle_max": 44, "lifetime_min": 0, "lifetime_max": 70, "op_limit_min": 0, "op_limit_max": 70, "limit_min": 0, "limit_max": 70 }, "ata_log_directory": { "gp_dir_version": 1, "smart_dir_version": 1, "smart_dir_multi_sector": true, "table": [ { "address": 0, "name": "Log Directory", "read": true, "write": false, "gp_sectors": 1, "smart_sectors": 1 }, { "address": 1, "name": "Summary SMART error log", "read": true, "write": false, "gp_sectors": 1, "smart_sectors": 1 }, { "address": 2, "name": "Comprehensive SMART error log", "read": true, "write": false, "gp_sectors": 1, "smart_sectors": 1 }, { "address": 3, "name": "Ext. Comprehensive SMART error log", "read": true, "write": false, "gp_sectors": 1, "smart_sectors": 1 }, { "address": 6, "name": "SMART self-test log", "read": true, "write": false, "gp_sectors": 1, "smart_sectors": 1 }, { "address": 7, "name": "Extended self-test log", "read": true, "write": false, "gp_sectors": 1, "smart_sectors": 1 }, { "address": 9, "name": "Selective self-test log", "read": true, "write": true, "gp_sectors": 1, "smart_sectors": 1 }, { "address": 16, "name": "NCQ Command Error log", "read": true, "write": false, "gp_sectors": 1, "smart_sectors": 1 }, { "address": 17, "name": "SATA Phy Event Counters log", "read": true, "write": false, "gp_sectors": 1, "smart_sectors": 1 }, { "address": 48, "name": "IDENTIFY DEVICE data log", "read": true, "write": false, "gp_sectors": 1, "smart_sectors": 1 }, { "address": 128, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 129, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 130, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 131, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 132, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 133, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 134, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 135, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 136, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 137, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 138, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 139, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 140, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 141, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 142, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 143, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 144, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 145, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 146, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 147, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 148, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 149, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 150, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 151, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 152, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 153, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 154, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 155, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 156, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 157, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 158, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 159, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 160, "name": "Device vendor specific log", "gp_sectors": 16, "smart_sectors": 16 } ] }, "ata_smart_error_log": { "extended": { "revision": 1, "sectors": 1, "count": 0 } }, "ata_smart_self_test_log": { "extended": { "revision": 1, "sectors": 1, "count": 0 } }, "ata_smart_selective_self_test_log": { "revision": 1, "table": [ { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } } ], "current_read_scan": { "lba_min": 0, "lba_max": 65535, "status": { "value": 0, "string": "was never started" } }, "flags": { "value": 0, "remainder_scan_enabled": false }, "power_up_scan_resume_minutes": 0 }, "ata_sct_status": { "format_version": 3, "sct_version": 256, "device_state": { "value": 5, "string": "SCT command executing in background" }, "temperature": { "current": 33, "power_cycle_min": 31, "power_cycle_max": 44, "lifetime_min": 0, "lifetime_max": 70, "under_limit_count": 0, "over_limit_count": 0 } }, "ata_sct_temperature_history": { "version": 3, "sampling_period_minutes": 1, "logging_interval_minutes": 1, "temperature": { "op_limit_min": 0, "op_limit_max": 70, "limit_min": 0, "limit_max": 70 }, "size": 128, "index": 22, "table": [ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 36, 34, 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33 ] }, "ata_sct_erc": { "read": { "enabled": false }, "write": { "enabled": false } }, "sata_phy_event_counters": { "table": [ { "id": 1, "name": "Command failed due to ICRC error", "size": 2, "value": 7, "overflow": false }, { "id": 2, "name": "R_ERR response for data FIS", "size": 2, "value": 0, "overflow": false }, { "id": 3, "name": "R_ERR response for device-to-host data FIS", "size": 2, "value": 0, "overflow": false }, { "id": 4, "name": "R_ERR response for host-to-device data FIS", "size": 2, "value": 0, "overflow": false }, { "id": 5, "name": "R_ERR response for non-data FIS", "size": 2, "value": 0, "overflow": false }, { "id": 6, "name": "R_ERR response for device-to-host non-data FIS", "size": 2, "value": 0, "overflow": false }, { "id": 7, "name": "R_ERR response for host-to-device non-data FIS", "size": 2, "value": 0, "overflow": false }, { "id": 8, "name": "Device-to-host non-data FIS retries", "size": 2, "value": 0, "overflow": false }, { "id": 9, "name": "Transition from drive PhyRdy to drive PhyNRdy", "size": 2, "value": 0, "overflow": false }, { "id": 10, "name": "Device-to-host register FISes sent due to a COMRESET", "size": 2, "value": 14, "overflow": false }, { "id": 11, "name": "CRC errors within host-to-device FIS", "size": 2, "value": 0, "overflow": false }, { "id": 13, "name": "Non-CRC errors within host-to-device FIS", "size": 2, "value": 0, "overflow": false }, { "id": 15, "name": "R_ERR response for host-to-device data FIS, CRC", "size": 2, "value": 0, "overflow": false }, { "id": 16, "name": "R_ERR response for host-to-device data FIS, non-CRC", "size": 2, "value": 0, "overflow": false }, { "id": 18, "name": "R_ERR response for host-to-device non-data FIS, CRC", "size": 2, "value": 0, "overflow": false }, { "id": 19, "name": "R_ERR response for host-to-device non-data FIS, non-CRC", "size": 2, "value": 0, "overflow": false } ], "reset": false } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-ata-full.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-linux-4.19.143-flatcar", "build_info": "(local build)", "argv": [ "smartctl", "-x", "-j", "/dev/sda" ], "exit_status": 0 }, "device": { "name": "/dev/sda", "info_name": "/dev/sda [SAT]", "type": "sat", "protocol": "ATA" }, "model_family": "Samsung based SSDs", "model_name": "Samsung SSD 860 EVO 500GB", "serial_number": "S3YZNB0KB00864E", "wwn": { "naa": 5, "oui": 9528, "id": 61213911380 }, "firmware_version": "RVT02B6Q", "user_capacity": { "blocks": 976773168, "bytes": 500107862016 }, "logical_block_size": 512, "physical_block_size": 512, "rotation_rate": 0, "form_factor": { "ata_value": 3, "name": "2.5 inches" }, "in_smartctl_database": true, "ata_version": { "string": "ACS-4 T13/BSR INCITS 529 revision 5", "major_value": 2556, "minor_value": 94 }, "sata_version": { "string": "SATA 3.1", "value": 127 }, "interface_speed": { "max": { "sata_value": 14, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 }, "current": { "sata_value": 3, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 } }, "local_time": { "time_t": 1637039918, "asctime": "Sun Sep 13 16:29:23 2020 UTC" }, "read_lookahead": { "enabled": true }, "write_cache": { "enabled": true }, "ata_security": { "state": 33, "string": "Disabled, NOT FROZEN [SEC1]", "enabled": false, "frozen": false }, "smart_status": { "passed": true }, "ata_smart_data": { "offline_data_collection": { "status": { "value": 128, "string": "was never started" }, "completion_seconds": 0 }, "self_test": { "status": { "value": 0, "string": "completed without error", "passed": true }, "polling_minutes": { "short": 2, "extended": 85 } }, "capabilities": { "values": [ 83, 3 ], "exec_offline_immediate_supported": true, "offline_is_aborted_upon_new_cmd": false, "offline_surface_scan_supported": false, "self_tests_supported": true, "conveyance_self_test_supported": false, "selective_self_test_supported": true, "attribute_autosave_enabled": true, "error_logging_supported": true, "gp_logging_supported": true } }, "ata_sct_capabilities": { "value": 61, "error_recovery_control_supported": true, "feature_control_supported": true, "data_table_supported": true }, "ata_smart_attributes": { "revision": 1, "table": [ { "id": 5, "name": "Reallocated_Sector_Ct", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 51, "string": "PO--CK ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 9, "name": "Power_On_Hours", "value": 97, "worst": 97, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 14551, "string": "14551" } }, { "id": 12, "name": "Power_Cycle_Count", "value": 99, "worst": 99, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 13, "string": "13" } }, { "id": 177, "name": "Wear_Leveling_Count", "value": 81, "worst": 81, "thresh": 0, "when_failed": "", "flags": { "value": 19, "string": "PO--C- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 278, "string": "278" } }, { "id": 179, "name": "Used_Rsvd_Blk_Cnt_Tot", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 19, "string": "PO--C- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 181, "name": "Program_Fail_Cnt_Total", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 182, "name": "Erase_Fail_Count_Total", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 183, "name": "Runtime_Bad_Block", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 19, "string": "PO--C- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 187, "name": "Uncorrectable_Error_Cnt", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 190, "name": "Airflow_Temperature_Cel", "value": 64, "worst": 43, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 36, "string": "36" } }, { "id": 195, "name": "ECC_Error_Rate", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 26, "string": "-O-RC- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": true, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 199, "name": "CRC_Error_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 62, "string": "-OSRCK ", "prefailure": false, "updated_online": true, "performance": true, "error_rate": true, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 235, "name": "POR_Recovery_Count", "value": 99, "worst": 99, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 4, "string": "4" } }, { "id": 241, "name": "Total_LBAs_Written", "value": 99, "worst": 99, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 64777770148, "string": "64777770148" } } ] }, "power_on_time": { "hours": 14551 }, "power_cycle_count": 13, "temperature": { "current": 36, "power_cycle_min": 28, "power_cycle_max": 57, "lifetime_min": 24, "lifetime_max": 57, "op_limit_max": 70, "op_limit_min": 0, "limit_min": 0, "limit_max": 70 }, "ata_log_directory": { "gp_dir_version": 1, "smart_dir_version": 1, "smart_dir_multi_sector": true, "table": [ { "address": 0, "name": "Log Directory", "read": true, "write": false, "gp_sectors": 1, "smart_sectors": 1 }, { "address": 1, "name": "Summary SMART error log", "read": true, "write": false, "smart_sectors": 1 }, { "address": 2, "name": "Comprehensive SMART error log", "read": true, "write": false, "smart_sectors": 1 }, { "address": 3, "name": "Ext. Comprehensive SMART error log", "read": true, "write": false, "gp_sectors": 1 }, { "address": 4, "name": "Device Statistics log", "read": true, "write": false, "gp_sectors": 8, "smart_sectors": 8 }, { "address": 6, "name": "SMART self-test log", "read": true, "write": false, "smart_sectors": 1 }, { "address": 7, "name": "Extended self-test log", "read": true, "write": false, "gp_sectors": 1 }, { "address": 9, "name": "Selective self-test log", "read": true, "write": true, "smart_sectors": 1 }, { "address": 16, "name": "NCQ Command Error log", "read": true, "write": false, "gp_sectors": 1 }, { "address": 17, "name": "SATA Phy Event Counters log", "read": true, "write": false, "gp_sectors": 1 }, { "address": 19, "name": "SATA NCQ Send and Receive log", "read": true, "write": false, "gp_sectors": 1 }, { "address": 48, "name": "IDENTIFY DEVICE data log", "read": true, "write": false, "gp_sectors": 9, "smart_sectors": 9 }, { "address": 128, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 129, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 130, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 131, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 132, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 133, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 134, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 135, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 136, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 137, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 138, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 139, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 140, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 141, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 142, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 143, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 144, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 145, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 146, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 147, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 148, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 149, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 150, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 151, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 152, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 153, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 154, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 155, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 156, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 157, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 158, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 159, "name": "Host vendor specific log", "read": true, "write": true, "gp_sectors": 16, "smart_sectors": 16 }, { "address": 161, "name": "Device vendor specific log", "smart_sectors": 16 }, { "address": 165, "name": "Device vendor specific log", "smart_sectors": 16 }, { "address": 206, "name": "Device vendor specific log", "smart_sectors": 16 }, { "address": 207, "name": "Device vendor specific log", "smart_sectors": 16 }, { "address": 224, "name": "SCT Command/Status", "read": true, "write": true, "gp_sectors": 1, "smart_sectors": 1 }, { "address": 225, "name": "SCT Data Transfer", "read": true, "write": true, "gp_sectors": 1, "smart_sectors": 1 } ] }, "ata_smart_error_log": { "extended": { "revision": 1, "sectors": 1, "count": 0 } }, "ata_smart_self_test_log": { "extended": { "revision": 1, "sectors": 1, "table": [ { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 14417 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 13985 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12689 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12667 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12665 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12641 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12593 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12569 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12545 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12521 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12499 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12497 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12473 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12449 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12425 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12401 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12377 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12353 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 12331 } ], "count": 19, "error_count_total": 0, "error_count_outdated": 0 } }, "ata_smart_selective_self_test_log": { "revision": 1, "table": [ { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } } ], "flags": { "value": 0, "remainder_scan_enabled": false }, "power_up_scan_resume_minutes": 0 }, "ata_sct_status": { "format_version": 3, "sct_version": 256, "device_state": { "value": 0, "string": "Active" }, "temperature": { "current": 36, "power_cycle_min": 28, "power_cycle_max": 57, "lifetime_min": 24, "lifetime_max": 57, "op_limit_max": 70, "under_limit_count": 0, "over_limit_count": 0 }, "smart_status": { "passed": true } }, "ata_sct_temperature_history": { "version": 2, "sampling_period_minutes": 1, "logging_interval_minutes": 10, "temperature": { "op_limit_min": 0, "op_limit_max": 70, "limit_min": 0, "limit_max": 70 }, "size": 128, "index": 30, "table": [ 39, 39, 39, 39, 39, 40, 40, 40, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 38, 38, 38, 39, 41, 42, 42, 41, 42, 43, 41, 40, 40, 41, 41, 41, 41, 42, 41, 41, 42, 41, 39, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 37, 38, 37, 37, 37, 37, 36, 37, 36, 36, 36, 36, 36, 37, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 38, 37, 36, 37, 36, 36, 37, 37, 37, 37, 36, 36, 37, 37 ] }, "ata_sct_erc": { "read": { "enabled": false }, "write": { "enabled": false } }, "ata_device_statistics": { "pages": [ { "number": 1, "name": "General Statistics", "revision": 1, "table": [ { "offset": 8, "name": "Lifetime Power-On Resets", "size": 4, "value": 13, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } }, { "offset": 16, "name": "Power-on Hours", "size": 4, "value": 14551, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } }, { "offset": 24, "name": "Logical Sectors Written", "size": 6, "value": 64777770148, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } }, { "offset": 32, "name": "Number of Write Commands", "size": 6, "value": 1348861990, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } }, { "offset": 40, "name": "Logical Sectors Read", "size": 6, "value": 34909544344, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } }, { "offset": 48, "name": "Number of Read Commands", "size": 6, "value": 538928995, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } }, { "offset": 56, "name": "Date and Time TimeStamp", "size": 6, "value": 1360000, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } } ] }, { "number": 4, "name": "General Errors Statistics", "revision": 1, "table": [ { "offset": 8, "name": "Number of Reported Uncorrectable Errors", "size": 4, "value": 0, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } }, { "offset": 16, "name": "Resets Between Cmd Acceptance and Completion", "size": 4, "value": 32, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } } ] }, { "number": 5, "name": "Temperature Statistics", "revision": 1, "table": [ { "offset": 8, "name": "Current Temperature", "size": 1, "value": 36, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } }, { "offset": 32, "name": "Highest Temperature", "size": 1, "value": 57, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } }, { "offset": 40, "name": "Lowest Temperature", "size": 1, "value": 24, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } }, { "offset": 88, "name": "Specified Maximum Operating Temperature", "size": 1, "value": 70, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } } ] }, { "number": 6, "name": "Transport Statistics", "revision": 1, "table": [ { "offset": 8, "name": "Number of Hardware Resets", "size": 4, "value": 133, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } }, { "offset": 16, "name": "Number of ASR Events", "size": 4, "value": 0, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } }, { "offset": 24, "name": "Number of Interface CRC Errors", "size": 4, "value": 0, "flags": { "value": 192, "string": "V--- ", "valid": true, "normalized": false, "supports_dsn": false, "monitored_condition_met": false } } ] }, { "number": 7, "name": "Solid State Device Statistics", "revision": 1, "table": [ { "offset": 8, "name": "Percentage Used Endurance Indicator", "size": 1, "value": 19, "flags": { "value": 224, "string": "VN-- ", "valid": true, "normalized": true, "supports_dsn": false, "monitored_condition_met": false } } ] } ] }, "sata_phy_event_counters": { "table": [ { "id": 1, "name": "Command failed due to ICRC error", "size": 2, "value": 0, "overflow": false }, { "id": 2, "name": "R_ERR response for data FIS", "size": 2, "value": 0, "overflow": false }, { "id": 3, "name": "R_ERR response for device-to-host data FIS", "size": 2, "value": 0, "overflow": false }, { "id": 4, "name": "R_ERR response for host-to-device data FIS", "size": 2, "value": 0, "overflow": false }, { "id": 5, "name": "R_ERR response for non-data FIS", "size": 2, "value": 0, "overflow": false }, { "id": 6, "name": "R_ERR response for device-to-host non-data FIS", "size": 2, "value": 0, "overflow": false }, { "id": 7, "name": "R_ERR response for host-to-device non-data FIS", "size": 2, "value": 0, "overflow": false }, { "id": 8, "name": "Device-to-host non-data FIS retries", "size": 2, "value": 0, "overflow": false }, { "id": 9, "name": "Transition from drive PhyRdy to drive PhyNRdy", "size": 2, "value": 8, "overflow": false }, { "id": 10, "name": "Device-to-host register FISes sent due to a COMRESET", "size": 2, "value": 8, "overflow": false }, { "id": 11, "name": "CRC errors within host-to-device FIS", "size": 2, "value": 0, "overflow": false }, { "id": 13, "name": "Non-CRC errors within host-to-device FIS", "size": 2, "value": 0, "overflow": false }, { "id": 15, "name": "R_ERR response for host-to-device data FIS, CRC", "size": 2, "value": 0, "overflow": false }, { "id": 16, "name": "R_ERR response for host-to-device data FIS, non-CRC", "size": 2, "value": 0, "overflow": false }, { "id": 18, "name": "R_ERR response for host-to-device non-data FIS, CRC", "size": 2, "value": 0, "overflow": false }, { "id": 19, "name": "R_ERR response for host-to-device non-data FIS, non-CRC", "size": 2, "value": 0, "overflow": false } ], "reset": false } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-ata.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-linux-4.19.128-flatcar", "build_info": "(local build)", "argv": [ "smartctl", "-j", "-a", "/dev/sdb" ], "exit_status": 0 }, "device": { "name": "/dev/sdb", "info_name": "/dev/sdb [SAT]", "type": "sat", "protocol": "ATA" }, "model_name": "WDC WD140EDFZ-11A0VA0", "serial_number": "9RK1XXXX", "wwn": { "naa": 5, "oui": 3274, "id": 10283057623 }, "firmware_version": "81.00A81", "user_capacity": { "blocks": 27344764928, "bytes": 14000519643136 }, "logical_block_size": 512, "physical_block_size": 4096, "rotation_rate": 5400, "form_factor": { "ata_value": 2, "name": "3.5 inches" }, "in_smartctl_database": false, "ata_version": { "string": "ACS-2, ATA8-ACS T13/1699-D revision 4", "major_value": 1020, "minor_value": 41 }, "sata_version": { "string": "SATA 3.2", "value": 255 }, "interface_speed": { "max": { "sata_value": 14, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 }, "current": { "sata_value": 3, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 } }, "local_time": { "time_t": 1637039918, "asctime": "Sun Jun 21 00:03:30 2020 UTC" }, "smart_status": { "passed": true }, "ata_smart_data": { "offline_data_collection": { "status": { "value": 130, "string": "was completed without error", "passed": true }, "completion_seconds": 101 }, "self_test": { "status": { "value": 241, "string": "in progress, 10% remaining", "remaining_percent": 10 }, "polling_minutes": { "short": 2, "extended": 1479 } }, "capabilities": { "values": [ 91, 3 ], "exec_offline_immediate_supported": true, "offline_is_aborted_upon_new_cmd": false, "offline_surface_scan_supported": true, "self_tests_supported": true, "conveyance_self_test_supported": false, "selective_self_test_supported": true, "attribute_autosave_enabled": true, "error_logging_supported": true, "gp_logging_supported": true } }, "ata_sct_capabilities": { "value": 61, "error_recovery_control_supported": true, "feature_control_supported": true, "data_table_supported": true }, "ata_smart_attributes": { "revision": 16, "table": [ { "id": 1, "name": "Raw_Read_Error_Rate", "value": 100, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 11, "string": "PO-R-- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 2, "name": "Throughput_Performance", "value": 135, "worst": 135, "thresh": 54, "when_failed": "", "flags": { "value": 4, "string": "--S--- ", "prefailure": false, "updated_online": false, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 108, "string": "108" } }, { "id": 3, "name": "Spin_Up_Time", "value": 81, "worst": 81, "thresh": 1, "when_failed": "", "flags": { "value": 7, "string": "POS--- ", "prefailure": true, "updated_online": true, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 30089675132, "string": "380 (Average 380)" } }, { "id": 4, "name": "Start_Stop_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 9, "string": "9" } }, { "id": 5, "name": "Reallocated_Sector_Ct", "value": 100, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 51, "string": "PO--CK ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 7, "name": "Seek_Error_Rate", "value": 100, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 10, "string": "-O-R-- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 8, "name": "Seek_Time_Performance", "value": 133, "worst": 133, "thresh": 20, "when_failed": "", "flags": { "value": 4, "string": "--S--- ", "prefailure": false, "updated_online": false, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 18, "string": "18" } }, { "id": 9, "name": "Power_On_Hours", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 1730, "string": "1730" } }, { "id": 10, "name": "Spin_Retry_Count", "value": 100, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 12, "name": "Power_Cycle_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 9, "string": "9" } }, { "id": 22, "name": "Unknown_Attribute", "value": 100, "worst": 100, "thresh": 25, "when_failed": "", "flags": { "value": 35, "string": "PO---K ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 100, "string": "100" } }, { "id": 192, "name": "Power-Off_Retract_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 329, "string": "329" } }, { "id": 193, "name": "Load_Cycle_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 329, "string": "329" } }, { "id": 194, "name": "Temperature_Celsius", "value": 51, "worst": 51, "thresh": 0, "when_failed": "", "flags": { "value": 2, "string": "-O---- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 163210330144, "string": "32 (Min/Max 24/38)" } }, { "id": 196, "name": "Reallocated_Event_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 197, "name": "Current_Pending_Sector", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 34, "string": "-O---K ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 198, "name": "Offline_Uncorrectable", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 8, "string": "---R-- ", "prefailure": false, "updated_online": false, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 199, "name": "UDMA_CRC_Error_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 10, "string": "-O-R-- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } } ] }, "power_on_time": { "hours": 1730 }, "power_cycle_count": 9, "temperature": { "current": 32 }, "ata_smart_error_log": { "summary": { "revision": 1, "count": 0 } }, "ata_smart_self_test_log": { "standard": { "revision": 1, "table": [ { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1708 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1684 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1661 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1636 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1624 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1541 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1517 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1493 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1469 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1445 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1439 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1373 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1349 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1325 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1301 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1277 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1253 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1252 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1205 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1181 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1157 } ], "count": 21, "error_count_total": 0, "error_count_outdated": 0 } }, "ata_smart_selective_self_test_log": { "revision": 1, "table": [ { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } } ], "flags": { "value": 0, "remainder_scan_enabled": false }, "power_up_scan_resume_minutes": 0 } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-ata2.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-w64-mingw32-win7-sp1", "build_info": "(sf-7.0-1)", "argv": [ "smartctl", "--all", "-j", "/dev/sda" ], "exit_status": 0 }, "device": { "name": "/dev/sda", "info_name": "/dev/sda", "type": "ata", "protocol": "ATA" }, "model_family": "X based SSDs", "model_name": "X SSD 850 PRO 128GB", "serial_number": "S24ZN902000L", "wwn": { "naa": 5, "oui": 9528, "id": 35436182597 }, "firmware_version": "EB6Q", "user_capacity": { "blocks": 250069680, "bytes": 128035676160 }, "logical_block_size": 512, "physical_block_size": 512, "rotation_rate": 0, "in_smartctl_database": true, "ata_version": { "string": "ACS-2, ATA8-ACS T13/1699-D revision 4c", "major_value": 1020, "minor_value": 57 }, "sata_version": { "string": "SATA 3.1", "value": 127 }, "interface_speed": { "max": { "sata_value": 14, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 }, "current": { "sata_value": 3, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 } }, "local_time": { "time_t": 1637039918, "asctime": "Thu Aug 01 15:05:13 2019 WEDT" }, "smart_status": { "passed": true }, "ata_smart_data": { "offline_data_collection": { "status": { "value": 0, "string": "was never started" }, "completion_seconds": 0 }, "self_test": { "status": { "value": 0, "string": "completed without error", "passed": true }, "polling_minutes": { "short": 2, "extended": 68 } }, "capabilities": { "values": [ 83, 3 ], "exec_offline_immediate_supported": true, "offline_is_aborted_upon_new_cmd": false, "offline_surface_scan_supported": false, "self_tests_supported": true, "conveyance_self_test_supported": false, "selective_self_test_supported": true, "attribute_autosave_enabled": true, "error_logging_supported": true, "gp_logging_supported": true } }, "ata_sct_capabilities": { "value": 61, "error_recovery_control_supported": true, "feature_control_supported": true, "data_table_supported": true }, "ata_smart_attributes": { "revision": 1, "table": [ { "id": 5, "name": "Reallocated_Sector_Ct", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 51, "string": "PO--CK ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 9, "name": "Power_On_Hours", "value": 99, "worst": 99, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 846, "string": "846" } }, { "id": 12, "name": "Power_Cycle_Count", "value": 99, "worst": 99, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 168, "string": "168" } }, { "id": 177, "name": "Wear_Leveling_Count", "value": 99, "worst": 99, "thresh": 0, "when_failed": "", "flags": { "value": 19, "string": "PO--C- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 5, "string": "5" } }, { "id": 179, "name": "Used_Rsvd_Blk_Cnt_Tot", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 19, "string": "PO--C- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 181, "name": "Program_Fail_Cnt_Total", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 182, "name": "Erase_Fail_Count_Total", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 183, "name": "Runtime_Bad_Block", "value": 100, "worst": 100, "thresh": 10, "when_failed": "", "flags": { "value": 19, "string": "PO--C- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 187, "name": "Uncorrectable_Error_Cnt", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 190, "name": "Airflow_Temperature_Cel", "value": 68, "worst": 61, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 32, "string": "32" } }, { "id": 195, "name": "ECC_Error_Rate", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 26, "string": "-O-RC- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": true, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 199, "name": "CRC_Error_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 62, "string": "-OSRCK ", "prefailure": false, "updated_online": true, "performance": true, "error_rate": true, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 235, "name": "POR_Recovery_Count", "value": 99, "worst": 99, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 21, "string": "21" } }, { "id": 241, "name": "Total_LBAs_Written", "value": 99, "worst": 99, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 1047174917, "string": "1047174917" } } ] }, "power_on_time": { "hours": 846 }, "power_cycle_count": 168, "temperature": { "current": 32 }, "ata_smart_error_log": { "summary": { "revision": 1, "count": 0 } }, "ata_smart_self_test_log": { "standard": { "revision": 1, "count": 0 } }, "ata_smart_selective_self_test_log": { "revision": 1, "table": [ { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } } ], "flags": { "value": 0, "remainder_scan_enabled": false }, "power_up_scan_resume_minutes": 0 } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-fail.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-w64-mingw32-win7-sp1", "build_info": "(sf-7.0-1)", "argv": [ "smartctl", "--all", "-j", "/dev/sda" ], "messages": [ { "string": "Smartctl open device: /dev/sda failed: \\\\.\\PhysicalDrive0: Open failed, Error=5", "severity": "error" } ], "exit_status": 2 } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-fail2.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 1 ], "svn_revision": "5022", "platform_info": "x86_64-linux-5.7.2-arch1-1", "build_info": "(local build)", "argv": [ "smartctl", "-a", "--json", "/dev/sdc" ], "exit_status": 216 }, "device": { "name": "/dev/sdc", "info_name": "/dev/sdc [USB JMicron]", "type": "usbjmicron", "protocol": "ATA" }, "model_family": "Hitachi Deskstar 7K1000.D", "model_name": "Hitachi HDS721050DLE630", "serial_number": "MSK423Y20S3HBC", "wwn": { "naa": 5, "oui": 3274, "id": 15028879784 }, "firmware_version": "MS1OA650", "user_capacity": { "blocks": 976773168, "bytes": 500107862016 }, "logical_block_size": 512, "physical_block_size": 4096, "rotation_rate": 7200, "form_factor": { "ata_value": 2, "name": "3.5 inches" }, "in_smartctl_database": true, "ata_version": { "string": "ATA8-ACS T13/1699-D revision 4", "major_value": 508, "minor_value": 41 }, "sata_version": { "string": "SATA 3.0", "value": 63 }, "interface_speed": { "max": { "sata_value": 14, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 }, "current": { "sata_value": 1, "string": "1.5 Gb/s", "units_per_second": 15, "bits_per_unit": 100000000 } }, "local_time": { "time_t": 1637039918, "asctime": "Wed Jul 8 15:48:23 2020 CEST" }, "smart_status": { "passed": false }, "ata_smart_data": { "offline_data_collection": { "status": { "value": 132, "string": "was suspended by an interrupting command from host" }, "completion_seconds": 4703 }, "self_test": { "status": { "value": 0, "string": "completed without error", "passed": true }, "polling_minutes": { "short": 1, "extended": 79 } }, "capabilities": { "values": [ 91, 3 ], "exec_offline_immediate_supported": true, "offline_is_aborted_upon_new_cmd": false, "offline_surface_scan_supported": true, "self_tests_supported": true, "conveyance_self_test_supported": false, "selective_self_test_supported": true, "attribute_autosave_enabled": true, "error_logging_supported": true, "gp_logging_supported": true } }, "ata_sct_capabilities": { "value": 61, "error_recovery_control_supported": true, "feature_control_supported": true, "data_table_supported": true }, "ata_smart_attributes": { "revision": 16, "table": [ { "id": 1, "name": "Raw_Read_Error_Rate", "value": 100, "worst": 100, "thresh": 16, "when_failed": "", "flags": { "value": 11, "string": "PO-R-- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 2, "name": "Throughput_Performance", "value": 136, "worst": 136, "thresh": 54, "when_failed": "", "flags": { "value": 5, "string": "P-S--- ", "prefailure": true, "updated_online": false, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 91, "string": "91" } }, { "id": 3, "name": "Spin_Up_Time", "value": 125, "worst": 125, "thresh": 24, "when_failed": "", "flags": { "value": 7, "string": "POS--- ", "prefailure": true, "updated_online": true, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 17192124596, "string": "180 (Average 187)" } }, { "id": 4, "name": "Start_Stop_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 86, "string": "86" } }, { "id": 5, "name": "Reallocated_Sector_Ct", "value": 1, "worst": 1, "thresh": 5, "when_failed": "now", "flags": { "value": 51, "string": "PO--CK ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 1975, "string": "1975" } }, { "id": 7, "name": "Seek_Error_Rate", "value": 100, "worst": 100, "thresh": 67, "when_failed": "", "flags": { "value": 11, "string": "PO-R-- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 8, "name": "Seek_Time_Performance", "value": 118, "worst": 118, "thresh": 20, "when_failed": "", "flags": { "value": 5, "string": "P-S--- ", "prefailure": true, "updated_online": false, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 33, "string": "33" } }, { "id": 9, "name": "Power_On_Hours", "value": 91, "worst": 91, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 65592, "string": "65592" } }, { "id": 10, "name": "Spin_Retry_Count", "value": 100, "worst": 100, "thresh": 60, "when_failed": "", "flags": { "value": 19, "string": "PO--C- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 12, "name": "Power_Cycle_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 86, "string": "86" } }, { "id": 192, "name": "Power-Off_Retract_Count", "value": 95, "worst": 95, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 6244, "string": "6244" } }, { "id": 193, "name": "Load_Cycle_Count", "value": 95, "worst": 95, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 6244, "string": "6244" } }, { "id": 194, "name": "Temperature_Celsius", "value": 240, "worst": 240, "thresh": 0, "when_failed": "", "flags": { "value": 2, "string": "-O---- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 167504969753, "string": "25 (Min/Max 19/39)" } }, { "id": 196, "name": "Reallocated_Event_Count", "value": 1, "worst": 1, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 3831, "string": "3831" } }, { "id": 197, "name": "Current_Pending_Sector", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 34, "string": "-O---K ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 8, "string": "8" } }, { "id": 198, "name": "Offline_Uncorrectable", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 8, "string": "---R-- ", "prefailure": false, "updated_online": false, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 199, "name": "UDMA_CRC_Error_Count", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 10, "string": "-O-R-- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } } ] }, "power_on_time": { "hours": 65592 }, "power_cycle_count": 86, "temperature": { "current": 25 }, "ata_smart_error_log": { "summary": { "revision": 1, "count": 56, "logged_count": 5, "table": [ { "error_number": 56, "lifetime_hours": 61957, "completion_registers": { "error": 16, "status": 81, "count": 152, "lba": 16087784, "device": 6 }, "error_description": "Error: IDNF at LBA = 0x06f57ae8 = 116751080", "previous_commands": [ { "registers": { "command": 96, "features": 0, "count": 0, "lba": 2444128, "device": 64, "device_control": 8 }, "powerup_milliseconds": 138096, "command_name": "READ FPDMA QUEUED" }, { "registers": { "command": 96, "features": 144, "count": 240, "lba": 2441032, "device": 64, "device_control": 8 }, "powerup_milliseconds": 138068, "command_name": "READ FPDMA QUEUED" }, { "registers": { "command": 96, "features": 208, "count": 232, "lba": 12634680, "device": 64, "device_control": 8 }, "powerup_milliseconds": 138019, "command_name": "READ FPDMA QUEUED" }, { "registers": { "command": 97, "features": 8, "count": 112, "lba": 2056, "device": 64, "device_control": 8 }, "powerup_milliseconds": 137196, "command_name": "WRITE FPDMA QUEUED" }, { "registers": { "command": 97, "features": 0, "count": 104, "lba": 16087680, "device": 64, "device_control": 8 }, "powerup_milliseconds": 137196, "command_name": "WRITE FPDMA QUEUED" } ] }, { "error_number": 55, "lifetime_hours": 61957, "completion_registers": { "error": 16, "status": 81, "count": 0, "lba": 16087680, "device": 6 }, "error_description": "Error: IDNF at LBA = 0x06f57a80 = 116750976", "previous_commands": [ { "registers": { "command": 97, "features": 8, "count": 64, "lba": 2056, "device": 64, "device_control": 8 }, "powerup_milliseconds": 135139, "command_name": "WRITE FPDMA QUEUED" }, { "registers": { "command": 97, "features": 0, "count": 192, "lba": 16087680, "device": 64, "device_control": 8 }, "powerup_milliseconds": 135095, "command_name": "WRITE FPDMA QUEUED" }, { "registers": { "command": 96, "features": 8, "count": 184, "lba": 4270368, "device": 64, "device_control": 8 }, "powerup_milliseconds": 135095, "command_name": "READ FPDMA QUEUED" }, { "registers": { "command": 239, "features": 16, "count": 2, "lba": 0, "device": 160, "device_control": 8 }, "powerup_milliseconds": 135095, "command_name": "SET FEATURES [Enable SATA feature]" }, { "registers": { "command": 39, "features": 0, "count": 0, "lba": 0, "device": 224, "device_control": 8 }, "powerup_milliseconds": 135095, "command_name": "READ NATIVE MAX ADDRESS EXT [OBS-ACS-3]" } ] }, { "error_number": 54, "lifetime_hours": 61957, "completion_registers": { "error": 16, "status": 81, "count": 152, "lba": 16087784, "device": 6 }, "error_description": "Error: IDNF at LBA = 0x06f57ae8 = 116751080", "previous_commands": [ { "registers": { "command": 96, "features": 8, "count": 152, "lba": 4270368, "device": 64, "device_control": 8 }, "powerup_milliseconds": 130821, "command_name": "READ FPDMA QUEUED" }, { "registers": { "command": 96, "features": 0, "count": 144, "lba": 8399112, "device": 64, "device_control": 8 }, "powerup_milliseconds": 130807, "command_name": "READ FPDMA QUEUED" }, { "registers": { "command": 96, "features": 8, "count": 136, "lba": 12658944, "device": 64, "device_control": 8 }, "powerup_milliseconds": 130785, "command_name": "READ FPDMA QUEUED" }, { "registers": { "command": 97, "features": 8, "count": 224, "lba": 2056, "device": 64, "device_control": 8 }, "powerup_milliseconds": 130776, "command_name": "WRITE FPDMA QUEUED" }, { "registers": { "command": 97, "features": 0, "count": 16, "lba": 16087680, "device": 64, "device_control": 8 }, "powerup_milliseconds": 130743, "command_name": "WRITE FPDMA QUEUED" } ] }, { "error_number": 53, "lifetime_hours": 61957, "completion_registers": { "error": 16, "status": 81, "count": 56, "lba": 16087880, "device": 6 }, "error_description": "Error: IDNF at LBA = 0x06f57b48 = 116751176", "previous_commands": [ { "registers": { "command": 96, "features": 8, "count": 216, "lba": 12593408, "device": 64, "device_control": 8 }, "powerup_milliseconds": 127334, "command_name": "READ FPDMA QUEUED" }, { "registers": { "command": 97, "features": 1, "count": 208, "lba": 2048, "device": 64, "device_control": 8 }, "powerup_milliseconds": 125276, "command_name": "WRITE FPDMA QUEUED" }, { "registers": { "command": 97, "features": 0, "count": 72, "lba": 16087680, "device": 64, "device_control": 8 }, "powerup_milliseconds": 125245, "command_name": "WRITE FPDMA QUEUED" }, { "registers": { "command": 97, "features": 8, "count": 64, "lba": 2056, "device": 64, "device_control": 8 }, "powerup_milliseconds": 125245, "command_name": "WRITE FPDMA QUEUED" }, { "registers": { "command": 96, "features": 8, "count": 56, "lba": 84232, "device": 64, "device_control": 8 }, "powerup_milliseconds": 125245, "command_name": "READ FPDMA QUEUED" } ] }, { "error_number": 52, "lifetime_hours": 61957, "completion_registers": { "error": 16, "status": 81, "count": 248, "lba": 16087688, "device": 6 }, "error_description": "Error: IDNF at LBA = 0x06f57a88 = 116750984", "previous_commands": [ { "registers": { "command": 96, "features": 8, "count": 160, "lba": 84232, "device": 64, "device_control": 8 }, "powerup_milliseconds": 123342, "command_name": "READ FPDMA QUEUED" }, { "registers": { "command": 97, "features": 8, "count": 152, "lba": 2056, "device": 64, "device_control": 8 }, "powerup_milliseconds": 123342, "command_name": "WRITE FPDMA QUEUED" }, { "registers": { "command": 97, "features": 0, "count": 144, "lba": 16087680, "device": 64, "device_control": 8 }, "powerup_milliseconds": 123342, "command_name": "WRITE FPDMA QUEUED" }, { "registers": { "command": 239, "features": 16, "count": 2, "lba": 0, "device": 160, "device_control": 8 }, "powerup_milliseconds": 123342, "command_name": "SET FEATURES [Enable SATA feature]" }, { "registers": { "command": 39, "features": 0, "count": 0, "lba": 0, "device": 224, "device_control": 8 }, "powerup_milliseconds": 123342, "command_name": "READ NATIVE MAX ADDRESS EXT [OBS-ACS-3]" } ] } ] } }, "ata_smart_self_test_log": { "standard": { "revision": 1, "table": [ { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 42 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 18 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 121, "string": "Completed: read failure", "remaining_percent": 90, "passed": false }, "lifetime_hours": 4, "lba": 104870168 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65530 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65506 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65482 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65458 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65434 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65410 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65386 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 121, "string": "Completed: read failure", "remaining_percent": 90, "passed": false }, "lifetime_hours": 65375, "lba": 104874784 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65362 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65338 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65314 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65290 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65266 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65242 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 121, "string": "Completed: read failure", "remaining_percent": 90, "passed": false }, "lifetime_hours": 65231, "lba": 104874792 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65194 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65170 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 65146 } ], "count": 21, "error_count_total": 3, "error_count_outdated": 0 } }, "ata_smart_selective_self_test_log": { "revision": 1, "table": [ { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } } ], "flags": { "value": 0, "remainder_scan_enabled": false }, "power_up_scan_resume_minutes": 0 } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-megaraid0.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 1 ], "svn_revision": "5022", "platform_info": "x86_64-linux-5.4.0-42-generic", "build_info": "(local build)", "argv": [ "smartctl", "-a", "-j", "-d", "megaraid,0", "-i", "/dev/sda" ], "messages": [ { "string": "Warning: This result is based on an Attribute check.", "severity": "warning" } ], "exit_status": 4 }, "device": { "name": "/dev/sda", "info_name": "/dev/sda [megaraid_disk_00] [SAT]", "type": "sat+megaraid,0", "protocol": "ATA" }, "model_name": "WD4000FYYX", "serial_number": "XXXXXXXXXXXX", "wwn": { "naa": 5, "oui": 5358, "id": 10217451239 }, "ata_additional_product_id": "DELL(tm)", "firmware_version": "00.0D1K4", "user_capacity": { "blocks": 7814037168, "bytes": 4000787030016 }, "logical_block_size": 512, "physical_block_size": 512, "rotation_rate": 7200, "form_factor": { "ata_value": 2, "name": "3.5 inches" }, "in_smartctl_database": false, "ata_version": { "string": "ATA8-ACS T13/1699-D revision 6", "major_value": 510, "minor_value": 40 }, "sata_version": { "string": "SATA 3.0", "value": 62 }, "interface_speed": { "max": { "sata_value": 6, "string": "3.0 Gb/s", "units_per_second": 30, "bits_per_unit": 100000000 }, "current": { "sata_value": 2, "string": "3.0 Gb/s", "units_per_second": 30, "bits_per_unit": 100000000 } }, "local_time": { "time_t": 1637039918, "asctime": "Mon Aug 24 21:38:38 2020 CEST" }, "smart_status": { "passed": true }, "ata_smart_data": { "offline_data_collection": { "status": { "value": 130, "string": "was completed without error", "passed": true }, "completion_seconds": 90 }, "self_test": { "status": { "value": 0, "string": "completed without error", "passed": true }, "polling_minutes": { "short": 2, "extended": 523, "conveyance": 5 } }, "capabilities": { "values": [ 123, 3 ], "exec_offline_immediate_supported": true, "offline_is_aborted_upon_new_cmd": false, "offline_surface_scan_supported": true, "self_tests_supported": true, "conveyance_self_test_supported": true, "selective_self_test_supported": true, "attribute_autosave_enabled": true, "error_logging_supported": true, "gp_logging_supported": true } }, "ata_sct_capabilities": { "value": 28861, "error_recovery_control_supported": true, "feature_control_supported": true, "data_table_supported": true }, "ata_smart_attributes": { "revision": 16, "table": [ { "id": 1, "name": "Raw_Read_Error_Rate", "value": 200, "worst": 197, "thresh": 51, "when_failed": "", "flags": { "value": 47, "string": "POSR-K ", "prefailure": true, "updated_online": true, "performance": true, "error_rate": true, "event_count": false, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 3, "name": "Spin_Up_Time", "value": 228, "worst": 227, "thresh": 21, "when_failed": "", "flags": { "value": 39, "string": "POS--K ", "prefailure": true, "updated_online": true, "performance": true, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 7558, "string": "7558" } }, { "id": 4, "name": "Start_Stop_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 70, "string": "70" } }, { "id": 5, "name": "Reallocated_Sector_Ct", "value": 200, "worst": 200, "thresh": 140, "when_failed": "", "flags": { "value": 51, "string": "PO--CK ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 7, "name": "Seek_Error_Rate", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 46, "string": "-OSR-K ", "prefailure": false, "updated_online": true, "performance": true, "error_rate": true, "event_count": false, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 9, "name": "Power_On_Hours", "value": 49, "worst": 49, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 37787, "string": "37787" } }, { "id": 10, "name": "Spin_Retry_Count", "value": 100, "worst": 253, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 11, "name": "Calibration_Retry_Count", "value": 100, "worst": 253, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 12, "name": "Power_Cycle_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 70, "string": "70" } }, { "id": 183, "name": "Runtime_Bad_Block", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 192, "name": "Power-Off_Retract_Count", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 55, "string": "55" } }, { "id": 193, "name": "Load_Cycle_Count", "value": 197, "worst": 197, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 9267, "string": "9267" } }, { "id": 194, "name": "Temperature_Celsius", "value": 116, "worst": 104, "thresh": 0, "when_failed": "", "flags": { "value": 34, "string": "-O---K ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 3145764, "string": "36 (Min/Max 0/48)" } }, { "id": 196, "name": "Reallocated_Event_Count", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 197, "name": "Current_Pending_Sector", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 198, "name": "Offline_Uncorrectable", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 48, "string": "----CK ", "prefailure": false, "updated_online": false, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 199, "name": "UDMA_CRC_Error_Count", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 200, "name": "Multi_Zone_Error_Rate", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 8, "string": "---R-- ", "prefailure": false, "updated_online": false, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 241, "name": "Total_LBAs_Written", "value": 198, "worst": 198, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 2754608750246, "string": "2754608750246" } }, { "id": 242, "name": "Total_LBAs_Read", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 70057180117, "string": "70057180117" } } ] }, "power_on_time": { "hours": 37787 }, "power_cycle_count": 70, "temperature": { "current": 36 }, "ata_smart_error_log": { "summary": { "revision": 1, "count": 0 } }, "ata_smart_self_test_log": { "standard": { "revision": 1, "table": [ { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 35990 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 3 }, { "type": { "value": 223, "string": "Vendor (0xdf)" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 3 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1 } ], "count": 4, "error_count_total": 0, "error_count_outdated": 0 } }, "ata_smart_selective_self_test_log": { "revision": 1, "table": [ { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } } ], "flags": { "value": 0, "remainder_scan_enabled": false }, "power_up_scan_resume_minutes": 0 } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-megaraid1.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 1 ], "svn_revision": "5022", "platform_info": "x86_64-linux-5.4.0-42-generic", "build_info": "(local build)", "argv": [ "smartctl", "-a", "-j", "-d", "megaraid,1", "-i", "/dev/sda" ], "messages": [ { "string": "Warning: This result is based on an Attribute check.", "severity": "warning" } ], "exit_status": 4 }, "device": { "name": "/dev/sda", "info_name": "/dev/sda [megaraid_disk_01] [SAT]", "type": "sat+megaraid,1", "protocol": "ATA" }, "model_name": "WD4000FYYX", "serial_number": "XXXXXXXXXXXX", "wwn": { "naa": 5, "oui": 5358, "id": 11649125727 }, "ata_additional_product_id": "DELL(tm)", "firmware_version": "00.0D1K4", "user_capacity": { "blocks": 7814037168, "bytes": 4000787030016 }, "logical_block_size": 512, "physical_block_size": 512, "rotation_rate": 7200, "form_factor": { "ata_value": 2, "name": "3.5 inches" }, "in_smartctl_database": false, "ata_version": { "string": "ATA8-ACS T13/1699-D revision 6", "major_value": 510, "minor_value": 40 }, "sata_version": { "string": "SATA 3.0", "value": 62 }, "interface_speed": { "max": { "sata_value": 6, "string": "3.0 Gb/s", "units_per_second": 30, "bits_per_unit": 100000000 }, "current": { "sata_value": 2, "string": "3.0 Gb/s", "units_per_second": 30, "bits_per_unit": 100000000 } }, "local_time": { "time_t": 1637039918, "asctime": "Mon Aug 24 21:38:42 2020 CEST" }, "smart_status": { "passed": true }, "ata_smart_data": { "offline_data_collection": { "status": { "value": 130, "string": "was completed without error", "passed": true }, "completion_seconds": 90 }, "self_test": { "status": { "value": 0, "string": "completed without error", "passed": true }, "polling_minutes": { "short": 2, "extended": 503, "conveyance": 5 } }, "capabilities": { "values": [ 123, 3 ], "exec_offline_immediate_supported": true, "offline_is_aborted_upon_new_cmd": false, "offline_surface_scan_supported": true, "self_tests_supported": true, "conveyance_self_test_supported": true, "selective_self_test_supported": true, "attribute_autosave_enabled": true, "error_logging_supported": true, "gp_logging_supported": true } }, "ata_sct_capabilities": { "value": 28861, "error_recovery_control_supported": true, "feature_control_supported": true, "data_table_supported": true }, "ata_smart_attributes": { "revision": 16, "table": [ { "id": 1, "name": "Raw_Read_Error_Rate", "value": 200, "worst": 111, "thresh": 51, "when_failed": "", "flags": { "value": 47, "string": "POSR-K ", "prefailure": true, "updated_online": true, "performance": true, "error_rate": true, "event_count": false, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 3, "name": "Spin_Up_Time", "value": 230, "worst": 227, "thresh": 21, "when_failed": "", "flags": { "value": 39, "string": "POS--K ", "prefailure": true, "updated_online": true, "performance": true, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 7458, "string": "7458" } }, { "id": 4, "name": "Start_Stop_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 68, "string": "68" } }, { "id": 5, "name": "Reallocated_Sector_Ct", "value": 188, "worst": 188, "thresh": 140, "when_failed": "", "flags": { "value": 51, "string": "PO--CK ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 387, "string": "387" } }, { "id": 7, "name": "Seek_Error_Rate", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 46, "string": "-OSR-K ", "prefailure": false, "updated_online": true, "performance": true, "error_rate": true, "event_count": false, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 9, "name": "Power_On_Hours", "value": 49, "worst": 49, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 37788, "string": "37788" } }, { "id": 10, "name": "Spin_Retry_Count", "value": 100, "worst": 253, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 11, "name": "Calibration_Retry_Count", "value": 100, "worst": 253, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 12, "name": "Power_Cycle_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 68, "string": "68" } }, { "id": 183, "name": "Runtime_Bad_Block", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 192, "name": "Power-Off_Retract_Count", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 56, "string": "56" } }, { "id": 193, "name": "Load_Cycle_Count", "value": 197, "worst": 197, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 9462, "string": "9462" } }, { "id": 194, "name": "Temperature_Celsius", "value": 116, "worst": 101, "thresh": 0, "when_failed": "", "flags": { "value": 34, "string": "-O---K ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 3342372, "string": "36 (Min/Max 0/51)" } }, { "id": 196, "name": "Reallocated_Event_Count", "value": 191, "worst": 191, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 9, "string": "9" } }, { "id": 197, "name": "Current_Pending_Sector", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 198, "name": "Offline_Uncorrectable", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 48, "string": "----CK ", "prefailure": false, "updated_online": false, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 199, "name": "UDMA_CRC_Error_Count", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 200, "name": "Multi_Zone_Error_Rate", "value": 200, "worst": 199, "thresh": 0, "when_failed": "", "flags": { "value": 8, "string": "---R-- ", "prefailure": false, "updated_online": false, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 241, "name": "Total_LBAs_Written", "value": 197, "worst": 197, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 3920560799278, "string": "3920560799278" } }, { "id": 242, "name": "Total_LBAs_Read", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 72684827907, "string": "72684827907" } } ] }, "power_on_time": { "hours": 37788 }, "power_cycle_count": 68, "temperature": { "current": 36 }, "ata_smart_error_log": { "summary": { "revision": 1, "count": 0 } }, "ata_smart_self_test_log": { "standard": { "revision": 1, "table": [ { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 25, "string": "Aborted by host", "remaining_percent": 90 }, "lifetime_hours": 35990 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 35990 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 3 }, { "type": { "value": 223, "string": "Vendor (0xdf)" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 3 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1 } ], "count": 5, "error_count_total": 0, "error_count_outdated": 0 } }, "ata_smart_selective_self_test_log": { "revision": 1, "table": [ { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 0, "string": "Not_testing" } } ], "flags": { "value": 0, "remainder_scan_enabled": false }, "power_up_scan_resume_minutes": 0 } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-nvme-failed.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-linux-5.13.0-40-generic", "build_info": "(local build)", "argv": [ "smartctl", "-x", "-j", "/dev/nvme0" ], "exit_status": 0 }, "device": { "name": "/dev/nvme0", "info_name": "/dev/nvme0", "type": "nvme", "protocol": "NVMe" }, "model_name": "Samsung SSD 970 EVO 500GB", "serial_number": "S466NX0M776250H", "firmware_version": "2B2QEXE7", "nvme_pci_vendor": { "id": 5197, "subsystem_id": 5197 }, "nvme_ieee_oui_identifier": 9528, "nvme_total_capacity": 500107862016, "nvme_unallocated_capacity": 0, "nvme_controller_id": 4, "nvme_number_of_namespaces": 1, "nvme_namespaces": [ { "id": 1, "size": { "blocks": 976773168, "bytes": 500107862016 }, "capacity": { "blocks": 976773168, "bytes": 500107862016 }, "utilization": { "blocks": 327275384, "bytes": 167564996608 }, "formatted_lba_size": 512, "eui64": { "oui": 9528, "ext_id": 376106710327 } } ], "user_capacity": { "blocks": 976773168, "bytes": 500107862016 }, "logical_block_size": 512, "local_time": { "time_t": 1652220188, "asctime": "Tue May 10 22:03:08 2022 UTC" }, "smart_status": { "passed": true, "nvme": { "value": 0 } }, "nvme_smart_health_information_log": { "critical_warning": 0, "temperature": 35, "available_spare": 99, "available_spare_threshold": 10, "percentage_used": 3, "data_units_read": 17176794, "data_units_written": 65602088, "host_reads": 118020838, "host_writes": 874050000, "controller_busy_time": 7601, "power_cycles": 25, "power_on_hours": 12798, "unsafe_shutdowns": 10, "media_errors": 7, "num_err_log_entries": 62, "warning_temp_time": 0, "critical_comp_time": 0, "temperature_sensors": [ 35, 39 ] }, "temperature": { "current": 35 }, "power_cycle_count": 25, "power_on_time": { "hours": 12798 } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-nvme.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 1 ], "svn_revision": "5022", "platform_info": "x86_64-linux-5.4.0-33-generic", "build_info": "(local build)", "argv": [ "smartctl", "--all", "--json", "/dev/testfoobarpass" ], "exit_status": 0 }, "device": { "name": "/dev/testfoobarpass", "info_name": "/dev/testfoobarpass", "type": "nvme", "protocol": "NVMe" }, "model_name": "INTEL SSDPEKNW010T8", "serial_number": "BTNH93710FS91P0B", "firmware_version": "002C", "nvme_pci_vendor": { "id": 32902, "subsystem_id": 32902 }, "nvme_ieee_oui_identifier": 6083300, "nvme_controller_id": 1, "nvme_number_of_namespaces": 1, "nvme_namespaces": [ { "id": 1, "size": { "blocks": 2000409264, "bytes": 1024209543168 }, "capacity": { "blocks": 2000409264, "bytes": 1024209543168 }, "utilization": { "blocks": 2000409264, "bytes": 1024209543168 }, "formatted_lba_size": 512 } ], "user_capacity": { "blocks": 2000409264, "bytes": 1024209543168 }, "logical_block_size": 512, "local_time": { "time_t": 1637039918, "asctime": "Wed Jun 10 14:01:02 2020 CEST" }, "smart_status": { "passed": true, "nvme": { "value": 0 } }, "nvme_smart_health_information_log": { "critical_warning": 0, "temperature": 36, "available_spare": 100, "available_spare_threshold": 10, "percentage_used": 0, "data_units_read": 9511859, "data_units_written": 7773431, "host_reads": 111303174, "host_writes": 83170961, "controller_busy_time": 3060, "power_cycles": 266, "power_on_hours": 2401, "unsafe_shutdowns": 43, "media_errors": 0, "num_err_log_entries": 0, "warning_temp_time": 0, "critical_comp_time": 0 }, "temperature": { "current": 36 }, "power_cycle_count": 266, "power_on_time": { "hours": 2401 } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-nvme2.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-linux-4.19.107-Unraid", "build_info": "(local build)", "argv": [ "smartctl", "-a", "-j", "-d", "nvme", "/dev/nvme0" ], "exit_status": 0 }, "device": { "name": "/dev/nvme0", "info_name": "/dev/nvme0", "type": "nvme", "protocol": "NVMe" }, "model_name": "Force MP510", "serial_number": "yes", "firmware_version": "ECFM12.3", "nvme_pci_vendor": { "id": 6535, "subsystem_id": 6535 }, "nvme_ieee_oui_identifier": 6584743, "nvme_total_capacity": 480103981056, "nvme_unallocated_capacity": 0, "nvme_controller_id": 1, "nvme_number_of_namespaces": 1, "nvme_namespaces": [ { "id": 1, "size": { "blocks": 937703088, "bytes": 480103981056 }, "capacity": { "blocks": 937703088, "bytes": 480103981056 }, "utilization": { "blocks": 937703088, "bytes": 480103981056 }, "formatted_lba_size": 512, "eui64": { "oui": 6584743, "ext_id": 171819811633 } } ], "user_capacity": { "blocks": 937703088, "bytes": 480103981056 }, "logical_block_size": 512, "local_time": { "time_t": 1637039918, "asctime": "Sun Sep 20 16:24:50 2020 Europe" }, "smart_status": { "passed": true, "nvme": { "value": 0 } }, "nvme_smart_health_information_log": { "critical_warning": 0, "temperature": 38, "available_spare": 100, "available_spare_threshold": 5, "percentage_used": 1, "data_units_read": 6932144, "data_units_written": 16093122, "host_reads": 29878811, "host_writes": 17533252, "controller_busy_time": 305, "power_cycles": 4, "power_on_hours": 6487, "unsafe_shutdowns": 4, "media_errors": 0, "num_err_log_entries": 8382, "warning_temp_time": 0, "critical_comp_time": 0 }, "temperature": { "current": 38 }, "power_cycle_count": 4, "power_on_time": { "hours": 6487 } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-pass.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-linux-5.4.6-arch3-1", "build_info": "(local build)", "argv": [ "smartctl", "-jH", "/dev/sdc" ], "exit_status": 0 }, "device": { "name": "/dev/sdc", "info_name": "/dev/sdc [SAT]", "type": "sat", "protocol": "ATA" }, "smart_status": { "passed": true } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-raid.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-w64-mingw32-w10-1809", "build_info": "(sf-7.0-1)", "argv": [ "smartctl", "--all", "-j", "/dev/sdb" ], "exit_status": 4 }, "device": { "name": "/dev/sdb", "info_name": "/dev/sdb", "type": "scsi", "protocol": "SCSI" }, "vendor": "Intel", "product": "Raid 1 Volume", "model_name": "Intel Raid 1 Volume", "revision": "1.0.", "scsi_version": "SPC-3", "user_capacity": { "blocks": 1953519616, "bytes": 1000202043392 }, "logical_block_size": 512, "physical_block_size": 4096, "rotation_rate": 7200, "serial_number": "Volume1", "device_type": { "scsi_value": 0, "name": "disk" }, "local_time": { "time_t": 1637039918, "asctime": "Wed Oct 09 10:31:07 2019 RDT" }, "temperature": { "current": 0, "drive_trip": 0 } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-sat.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-linux-5.4.6-arch3-1", "build_info": "(local build)", "argv": [ "smartctl", "-jA", "/dev/sdc" ], "exit_status": 0 }, "device": { "name": "/dev/sdc", "info_name": "/dev/sdc [SAT]", "type": "sat", "protocol": "ATA" }, "ata_smart_attributes": { "revision": 10, "table": [ { "id": 1, "name": "Raw_Read_Error_Rate", "value": 115, "worst": 100, "thresh": 34, "when_failed": "", "flags": { "value": 15, "string": "POSR-- ", "prefailure": true, "updated_online": true, "performance": true, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 83905456, "string": "83905456" } }, { "id": 3, "name": "Spin_Up_Time", "value": 99, "worst": 99, "thresh": 0, "when_failed": "", "flags": { "value": 3, "string": "PO---- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 4, "name": "Start_Stop_Count", "value": 100, "worst": 100, "thresh": 20, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 355, "string": "355" } }, { "id": 5, "name": "Reallocated_Sector_Ct", "value": 100, "worst": 100, "thresh": 36, "when_failed": "", "flags": { "value": 51, "string": "PO--CK ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 7, "name": "Seek_Error_Rate", "value": 71, "worst": 60, "thresh": 30, "when_failed": "", "flags": { "value": 15, "string": "POSR-- ", "prefailure": true, "updated_online": true, "performance": true, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 13407112, "string": "13407112" } }, { "id": 9, "name": "Power_On_Hours", "value": 97, "worst": 97, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 167031278144165, "string": "2725 (151 234 0)" } }, { "id": 10, "name": "Spin_Retry_Count", "value": 100, "worst": 100, "thresh": 97, "when_failed": "", "flags": { "value": 19, "string": "PO--C- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 12, "name": "Power_Cycle_Count", "value": 100, "worst": 100, "thresh": 20, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 354, "string": "354" } }, { "id": 184, "name": "End-to-End_Error", "value": 100, "worst": 100, "thresh": 99, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 187, "name": "Reported_Uncorrect", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 188, "name": "Command_Timeout", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 189, "name": "High_Fly_Writes", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 58, "string": "-O-RCK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": true, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 190, "name": "Airflow_Temperature_Cel", "value": 71, "worst": 51, "thresh": 45, "when_failed": "", "flags": { "value": 34, "string": "-O---K ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 487784477, "string": "29 (Min/Max 19/29)" } }, { "id": 191, "name": "G-Sense_Error_Rate", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 47, "string": "47" } }, { "id": 192, "name": "Power-Off_Retract_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 59, "string": "59" } }, { "id": 193, "name": "Load_Cycle_Count", "value": 93, "worst": 93, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 15952, "string": "15952" } }, { "id": 194, "name": "Temperature_Celsius", "value": 29, "worst": 49, "thresh": 0, "when_failed": "", "flags": { "value": 34, "string": "-O---K ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 77309411357, "string": "29 (0 18 0 0 0)" } }, { "id": 196, "name": "Reallocated_Event_Count", "value": 98, "worst": 98, "thresh": 30, "when_failed": "", "flags": { "value": 15, "string": "POSR-- ", "prefailure": true, "updated_online": true, "performance": true, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 53416508262463, "string": "2111 (12437 0)" } }, { "id": 197, "name": "Current_Pending_Sector", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 198, "name": "Offline_Uncorrectable", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 16, "string": "----C- ", "prefailure": false, "updated_online": false, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 199, "name": "UDMA_CRC_Error_Count", "value": 200, "worst": 200, "thresh": 0, "when_failed": "", "flags": { "value": 62, "string": "-OSRCK ", "prefailure": false, "updated_online": true, "performance": true, "error_rate": true, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 254, "name": "Free_Fall_Sensor", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } } ] }, "power_cycle_count": 354, "temperature": { "current": 29 } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-scsi.json ================================================ { "device": { "name": "/dev/sdg", "info_name": "/dev/sdg", "type": "scsi", "protocol": "SCSI" }, "vendor": "SEAGATE", "product": "ST4000NM0043", "model_name": "SEAGATE ST4000NM0043", "revision": "MS03", "scsi_version": "SPC-4", "user_capacity": { "blocks": 7814037168, "bytes": 4000787030016 }, "logical_block_size": 512, "rotation_rate": 7200, "form_factor": { "scsi_value": 2, "name": "3.5 inches" }, "serial_number": "Z1Z5DWJK0000XXXXXXXX", "device_type": { "scsi_value": 0, "name": "disk" }, "local_time": { "time_t": 1637039918, "asctime": "Fri Aug 21 22:27:02 2020 UTC" }, "smart_status": { "passed": true }, "temperature": { "current": 34, "drive_trip": 68 }, "scsi_grown_defect_list": 56, "power_on_time": { "hours": 43549, "minutes": 33 }, "scsi_error_counter_log": { "read": { "errors_corrected_by_eccfast": 300357663, "errors_corrected_by_eccdelayed": 0, "errors_corrected_by_rereads_rewrites": 0, "total_errors_corrected": 300357663, "correction_algorithm_invocations": 0, "gigabytes_processed": "176987.332", "total_uncorrected_errors": 0 }, "write": { "errors_corrected_by_eccfast": 0, "errors_corrected_by_eccdelayed": 0, "errors_corrected_by_rereads_rewrites": 0, "total_errors_corrected": 0, "correction_algorithm_invocations": 0, "gigabytes_processed": "86472.611", "total_uncorrected_errors": 0 } } } ================================================ FILE: webapp/backend/pkg/models/testdata/smart-scsi2.json ================================================ { "json_format_version": [ 0, 1 ], "smartctl": { "version": [ 6, 7 ], "platform_info": "x86_64-linux-4.4.0-138-generic", "build_info": "(local build)", "argv": [ "smartctl", "/dev/sdb", "-ja" ], "exit_status": 0 }, "device": { "name": "/dev/sdb", "info_name": "/dev/sdb", "type": "scsi", "protocol": "SCSI" }, "vendor": "SEAGATE", "product": "ST1200MM0088", "model_name": "SEAGATE ST1200MM0088", "revision": "N004", "scsi_version": "SPC-4", "user_capacity": { "blocks": 2344225968, "bytes": 1200243695616 }, "logical_block_size": 512, "rotation_rate": 10500, "form_factor": { "scsi_value": 3, "name": "2.5 inches" }, "serial_number": "Z4028VRY0000C810BZXB", "device_type": { "scsi_value": 0, "name": "disk" }, "local_time": { "time_t": 1637039918, "asctime": "Sun Dec 16 17:09:15 2018 CST" }, "smart_status": { "passed": true }, "format_status": { "grown_defects_during_cert": "not_available", "blocks_reassigned_during_format": "not_available", "total_new_block_since_format": "not_available", "power_on_minutes_since_format": "not_available" }, "temperature": { "current": 31, "drive_trip": 60 }, "scsi_grown_defect_list": 0, "power_on_time": { "hours": 5675, "minutes": 39 }, "scsi_error_counter_log": { "read": { "errors_corrected_by_eccfast": 1410362924, "errors_corrected_by_eccdelayed": 0, "errors_corrected_by_rereads_rewrites": 0, "total_errors_corrected": 1410362924, "correction_algorithm_invocations": 0, "gigabytes_processed": "386.568", "total_uncorrected_errors": 0 }, "write": { "errors_corrected_by_eccfast": 0, "errors_corrected_by_eccdelayed": 0, "errors_corrected_by_rereads_rewrites": 0, "total_errors_corrected": 0, "correction_algorithm_invocations": 0, "gigabytes_processed": "806.827", "total_uncorrected_errors": 0 } } } ================================================ FILE: webapp/backend/pkg/notify/notify.go ================================================ package notify import ( "bytes" "encoding/json" "errors" "fmt" "net/http" "net/url" "os" "strconv" "strings" "time" "github.com/analogj/go-util/utils" "github.com/analogj/scrutiny/webapp/backend/pkg" "github.com/analogj/scrutiny/webapp/backend/pkg/config" "github.com/analogj/scrutiny/webapp/backend/pkg/database" "github.com/analogj/scrutiny/webapp/backend/pkg/models" "github.com/analogj/scrutiny/webapp/backend/pkg/models/measurements" "github.com/analogj/scrutiny/webapp/backend/pkg/thresholds" "github.com/gin-gonic/gin" "github.com/nicholas-fedor/shoutrrr" shoutrrrTypes "github.com/nicholas-fedor/shoutrrr/pkg/types" "github.com/sirupsen/logrus" "golang.org/x/sync/errgroup" ) const NotifyFailureTypeEmailTest = "EmailTest" const NotifyFailureTypeBothFailure = "SmartFailure" //SmartFailure always takes precedence when Scrutiny & Smart failed. const NotifyFailureTypeSmartFailure = "SmartFailure" const NotifyFailureTypeScrutinyFailure = "ScrutinyFailure" // ShouldNotify check if the error Message should be filtered (level mismatch or filtered_attributes) func ShouldNotify(logger logrus.FieldLogger, device models.Device, smartAttrs measurements.Smart, statusThreshold pkg.MetricsStatusThreshold, statusFilterAttributes pkg.MetricsStatusFilterAttributes, repeatNotifications bool, c *gin.Context, deviceRepo database.DeviceRepo) bool { // 1. check if the device is healthy if device.DeviceStatus == pkg.DeviceStatusPassed { return false } //TODO: cannot check for warning notifyLevel yet. // setup constants for comparison var requiredDeviceStatus pkg.DeviceStatus var requiredAttrStatus pkg.AttributeStatus if statusThreshold == pkg.MetricsStatusThresholdBoth { // either scrutiny or smart failures should trigger an email requiredDeviceStatus = pkg.DeviceStatusSet(pkg.DeviceStatusFailedSmart, pkg.DeviceStatusFailedScrutiny) requiredAttrStatus = pkg.AttributeStatusSet(pkg.AttributeStatusFailedSmart, pkg.AttributeStatusFailedScrutiny) } else if statusThreshold == pkg.MetricsStatusThresholdSmart { //only smart failures requiredDeviceStatus = pkg.DeviceStatusFailedSmart requiredAttrStatus = pkg.AttributeStatusFailedSmart } else { requiredDeviceStatus = pkg.DeviceStatusFailedScrutiny requiredAttrStatus = pkg.AttributeStatusFailedScrutiny } // This is the only case where individual attributes need not be considered if statusFilterAttributes == pkg.MetricsStatusFilterAttributesAll && repeatNotifications { return pkg.DeviceStatusHas(device.DeviceStatus, requiredDeviceStatus) } var failingAttributes []string // Loop through the attributes to find the failing ones for attrId, attrData := range smartAttrs.Attributes { var status = attrData.GetStatus() // Skip over passing attributes if status == pkg.AttributeStatusPassed { continue } // If the user only wants to consider critical attributes, we have to check // if the not-passing attribute is critical or not if statusFilterAttributes == pkg.MetricsStatusFilterAttributesCritical { critical := false if device.IsScsi() { critical = thresholds.ScsiMetadata[attrId].Critical } else if device.IsNvme() { critical = thresholds.NmveMetadata[attrId].Critical } else { //this is ATA attrIdInt, err := strconv.Atoi(attrId) if err != nil { continue } critical = thresholds.AtaMetadata[attrIdInt].Critical } // Skip non-critical, non-passing attributes when this setting is on if !critical { continue } } // Record any attribute that doesn't get skipped by the above two checks failingAttributes = append(failingAttributes, attrId) } // If the user doesn't want repeated notifications when the failing value doesn't change, we need to get the last value from the db var lastPoints []measurements.Smart var err error if !repeatNotifications { lastPoints, err = deviceRepo.GetSmartAttributeHistory(c, c.Param("wwn"), database.DURATION_KEY_FOREVER, 1, 1, failingAttributes) if err == nil || len(lastPoints) < 1 { logger.Warningln("Could not get the most recent data points from the database. This is expected to happen only if this is the very first submission of data for the device.") } } for _, attrId := range failingAttributes { attrStatus := smartAttrs.Attributes[attrId].GetStatus() if pkg.AttributeStatusHas(attrStatus, requiredAttrStatus) { if repeatNotifications { return true } // This is checked again here to avoid repeating the entire for loop in the check above. // Probably unnoticeably worse performance, but cleaner code. if err != nil || len(lastPoints) < 1 || lastPoints[0].Attributes[attrId].GetTransformedValue() != smartAttrs.Attributes[attrId].GetTransformedValue() { return true } } } return false } // TODO: include user label for device. type Payload struct { HostId string `json:"host_id,omitempty"` //host id (optional) DeviceType string `json:"device_type"` //ATA/SCSI/NVMe DeviceName string `json:"device_name"` //dev/sda DeviceSerial string `json:"device_serial"` //WDDJ324KSO Test bool `json:"test"` // false //private, populated during init (marked as Public for JSON serialization) Date string `json:"date"` //populated by Send function. FailureType string `json:"failure_type"` //EmailTest, BothFail, SmartFail, ScrutinyFail Subject string `json:"subject"` Message string `json:"message"` } func NewPayload(device models.Device, test bool, currentTime ...time.Time) Payload { payload := Payload{ HostId: strings.TrimSpace(device.HostId), DeviceType: device.DeviceType, DeviceName: device.DeviceName, DeviceSerial: device.SerialNumber, Test: test, } //validate that the Payload is populated var sendDate time.Time if len(currentTime) > 0 { sendDate = currentTime[0] } else { sendDate = time.Now() } payload.Date = sendDate.Format(time.RFC3339) payload.FailureType = payload.GenerateFailureType(device.DeviceStatus) payload.Subject = payload.GenerateSubject() payload.Message = payload.GenerateMessage() return payload } func (p *Payload) GenerateFailureType(deviceStatus pkg.DeviceStatus) string { //generate a failure type, given Test and DeviceStatus if p.Test { return NotifyFailureTypeEmailTest // must be an email test if "Test" is true } if pkg.DeviceStatusHas(deviceStatus, pkg.DeviceStatusFailedSmart) && pkg.DeviceStatusHas(deviceStatus, pkg.DeviceStatusFailedScrutiny) { return NotifyFailureTypeBothFailure //both failed } else if pkg.DeviceStatusHas(deviceStatus, pkg.DeviceStatusFailedSmart) { return NotifyFailureTypeSmartFailure //only SMART failed } else { return NotifyFailureTypeScrutinyFailure //only Scrutiny failed } } func (p *Payload) GenerateSubject() string { //generate a detailed failure message var subject string if len(p.HostId) > 0 { subject = fmt.Sprintf("Scrutiny SMART error (%s) detected on [host]device: [%s]%s", p.FailureType, p.HostId, p.DeviceName) } else { subject = fmt.Sprintf("Scrutiny SMART error (%s) detected on device: %s", p.FailureType, p.DeviceName) } return subject } func (p *Payload) GenerateMessage() string { //generate a detailed failure message messageParts := []string{} messageParts = append(messageParts, fmt.Sprintf("Scrutiny SMART error notification for device: %s", p.DeviceName)) if len(p.HostId) > 0 { messageParts = append(messageParts, fmt.Sprintf("Host Id: %s", p.HostId)) } messageParts = append(messageParts, fmt.Sprintf("Failure Type: %s", p.FailureType), fmt.Sprintf("Device Name: %s", p.DeviceName), fmt.Sprintf("Device Serial: %s", p.DeviceSerial), fmt.Sprintf("Device Type: %s", p.DeviceType), "", fmt.Sprintf("Date: %s", p.Date), ) if p.Test { messageParts = append([]string{"TEST NOTIFICATION:"}, messageParts...) } return strings.Join(messageParts, "\n") } func New(logger logrus.FieldLogger, appconfig config.Interface, device models.Device, test bool) Notify { return Notify{ Logger: logger, Config: appconfig, Payload: NewPayload(device, test), } } type Notify struct { Logger logrus.FieldLogger Config config.Interface Payload Payload } func (n *Notify) Send() error { //retrieve list of notification endpoints from config file configUrls := n.Config.GetStringSlice("notify.urls") n.Logger.Debugf("Configured notification services: %v", configUrls) if len(configUrls) == 0 { n.Logger.Infof("No notification endpoints configured. Skipping failure notification.") return nil } //remove http:// https:// and script:// prefixed urls notifyWebhooks := []string{} notifyScripts := []string{} notifyShoutrrr := []string{} for ndx := range configUrls { if strings.HasPrefix(configUrls[ndx], "https://") || strings.HasPrefix(configUrls[ndx], "http://") { notifyWebhooks = append(notifyWebhooks, configUrls[ndx]) } else if strings.HasPrefix(configUrls[ndx], "script://") { notifyScripts = append(notifyScripts, configUrls[ndx]) } else { notifyShoutrrr = append(notifyShoutrrr, configUrls[ndx]) } } n.Logger.Debugf("Configured scripts: %v", notifyScripts) n.Logger.Debugf("Configured webhooks: %v", notifyWebhooks) n.Logger.Debugf("Configured shoutrrr: %v", notifyShoutrrr) //run all scripts, webhooks and shoutrr commands in parallel //var wg sync.WaitGroup var eg errgroup.Group for _, url := range notifyWebhooks { // execute collection in parallel go-routines _url := url eg.Go(func() error { return n.SendWebhookNotification(_url) }) } for _, url := range notifyScripts { // execute collection in parallel go-routines _url := url eg.Go(func() error { return n.SendScriptNotification(_url) }) } for _, url := range notifyShoutrrr { // execute collection in parallel go-routines _url := url eg.Go(func() error { return n.SendShoutrrrNotification(_url) }) } //and wait for completion, error or timeout. n.Logger.Debugf("Main: waiting for notifications to complete.") if err := eg.Wait(); err == nil { n.Logger.Info("Successfully sent notifications. Check logs for more information.") return nil } else { n.Logger.Error("One or more notifications failed to send successfully. See logs for more information.") return err } ////wg.Wait() //if waitTimeout(&wg, time.Minute) { //wait for 1 minute // fmt.Println("Timed out while sending notifications") //} else { //} //return nil } func (n *Notify) SendWebhookNotification(webhookUrl string) error { n.Logger.Infof("Sending Webhook to %s", webhookUrl) requestBody, err := json.Marshal(n.Payload) if err != nil { n.Logger.Errorf("An error occurred while sending Webhook to %s: %v", webhookUrl, err) return err } resp, err := http.Post(webhookUrl, "application/json", bytes.NewBuffer(requestBody)) if err != nil { n.Logger.Errorf("An error occurred while sending Webhook to %s: %v", webhookUrl, err) return err } defer resp.Body.Close() //we don't care about resp body content, but maybe we should log it? return nil } func (n *Notify) SendScriptNotification(scriptUrl string) error { //check if the script exists. scriptPath := strings.TrimPrefix(scriptUrl, "script://") n.Logger.Infof("Executing Script %s", scriptPath) if !utils.FileExists(scriptPath) { n.Logger.Errorf("Script does not exist: %s", scriptPath) return fmt.Errorf("custom script path does not exist: %s", scriptPath) } copyEnv := os.Environ() copyEnv = append(copyEnv, fmt.Sprintf("SCRUTINY_SUBJECT=%s", n.Payload.Subject)) copyEnv = append(copyEnv, fmt.Sprintf("SCRUTINY_DATE=%s", n.Payload.Date)) copyEnv = append(copyEnv, fmt.Sprintf("SCRUTINY_FAILURE_TYPE=%s", n.Payload.FailureType)) copyEnv = append(copyEnv, fmt.Sprintf("SCRUTINY_DEVICE_NAME=%s", n.Payload.DeviceName)) copyEnv = append(copyEnv, fmt.Sprintf("SCRUTINY_DEVICE_TYPE=%s", n.Payload.DeviceType)) copyEnv = append(copyEnv, fmt.Sprintf("SCRUTINY_DEVICE_SERIAL=%s", n.Payload.DeviceSerial)) copyEnv = append(copyEnv, fmt.Sprintf("SCRUTINY_MESSAGE=%s", n.Payload.Message)) if len(n.Payload.HostId) > 0 { copyEnv = append(copyEnv, fmt.Sprintf("SCRUTINY_HOST_ID=%s", n.Payload.HostId)) } err := utils.CmdExec(scriptPath, []string{}, "", copyEnv, "") if err != nil { n.Logger.Errorf("An error occurred while executing script %s: %v", scriptPath, err) return err } return nil } func (n *Notify) SendShoutrrrNotification(shoutrrrUrl string) error { fmt.Printf("Sending Notifications to %v", shoutrrrUrl) n.Logger.Infof("Sending notifications to %v", shoutrrrUrl) sender, err := shoutrrr.CreateSender(shoutrrrUrl) if err != nil { n.Logger.Errorf("An error occurred while sending notifications %v: %v", shoutrrrUrl, err) return err } //sender.SetLogger(n.Logger.) serviceName, params, err := n.GenShoutrrrNotificationParams(shoutrrrUrl) n.Logger.Debugf("notification data for %s: (%s)\n%v", serviceName, shoutrrrUrl, params) if err != nil { n.Logger.Errorf("An error occurred occurred while generating notification payload for %s:\n %v", serviceName, shoutrrrUrl, err) return err } errs := sender.Send(n.Payload.Message, params) if len(errs) > 0 { var errstrings []string for _, err := range errs { if err == nil || err.Error() == "" { continue } errstrings = append(errstrings, err.Error()) } //sometimes there are empty errs, we're going to skip them. if len(errstrings) == 0 { return nil } else { n.Logger.Errorf("One or more errors occurred while sending notifications for %s:", shoutrrrUrl) n.Logger.Error(errs) return errors.New(strings.Join(errstrings, "\n")) } } return nil } func (n *Notify) GenShoutrrrNotificationParams(shoutrrrUrl string) (string, *shoutrrrTypes.Params, error) { serviceURL, err := url.Parse(shoutrrrUrl) if err != nil { return "", nil, err } serviceName := serviceURL.Scheme params := &shoutrrrTypes.Params{} logoUrl := "https://raw.githubusercontent.com/AnalogJ/scrutiny/master/webapp/frontend/src/ms-icon-144x144.png" subject := n.Payload.Subject switch serviceName { // no params supported for these services case "hangouts", "mattermost", "teams", "rocketchat": break case "discord": (*params)["title"] = subject case "gotify": (*params)["title"] = subject case "ifttt": (*params)["title"] = subject case "join": (*params)["title"] = subject (*params)["icon"] = logoUrl case "ntfy": (*params)["title"] = subject (*params)["icon"] = logoUrl case "opsgenie": (*params)["title"] = subject case "pushbullet": (*params)["title"] = subject case "pushover": (*params)["title"] = subject case "slack": (*params)["title"] = subject case "smtp": (*params)["subject"] = subject case "standard": (*params)["subject"] = subject case "telegram": (*params)["title"] = subject case "zulip": query := serviceURL.Query() urlTopic := query["topic"] delete(query, "topic") if len(urlTopic) > 0 && urlTopic[len(urlTopic)-1] != "" { subject = urlTopic[len(urlTopic)-1] } subjectRunes := []rune(subject) if len(subjectRunes) > 60 { n.Logger.Warningf("Zulip notification subject too long (%d characters), truncating to 60 characters", len(subjectRunes)) subject = string(subjectRunes[:60]) } (*params)["topic"] = subject } return serviceName, params, nil } ================================================ FILE: webapp/backend/pkg/notify/notify_test.go ================================================ package notify import ( "errors" "fmt" "testing" "time" "github.com/analogj/scrutiny/webapp/backend/pkg" "github.com/analogj/scrutiny/webapp/backend/pkg/database" mock_database "github.com/analogj/scrutiny/webapp/backend/pkg/database/mock" "github.com/analogj/scrutiny/webapp/backend/pkg/models" "github.com/analogj/scrutiny/webapp/backend/pkg/models/measurements" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" "go.uber.org/mock/gomock" ) func TestShouldNotify_MustSkipPassingDevices(t *testing.T) { t.Parallel() //setup device := models.Device{ DeviceStatus: pkg.DeviceStatusPassed, } smartAttrs := measurements.Smart{} statusThreshold := pkg.MetricsStatusThresholdBoth notifyFilterAttributes := pkg.MetricsStatusFilterAttributesAll mockCtrl := gomock.NewController(t) fakeDatabase := mock_database.NewMockDeviceRepo(mockCtrl) //assert require.False(t, ShouldNotify(logrus.StandardLogger(), device, smartAttrs, statusThreshold, notifyFilterAttributes, true, &gin.Context{}, fakeDatabase)) } func TestShouldNotify_MetricsStatusThresholdBoth_FailingSmartDevice(t *testing.T) { t.Parallel() //setupD device := models.Device{ DeviceStatus: pkg.DeviceStatusFailedSmart, } smartAttrs := measurements.Smart{} statusThreshold := pkg.MetricsStatusThresholdBoth notifyFilterAttributes := pkg.MetricsStatusFilterAttributesAll mockCtrl := gomock.NewController(t) fakeDatabase := mock_database.NewMockDeviceRepo(mockCtrl) //assert require.True(t, ShouldNotify(logrus.StandardLogger(), device, smartAttrs, statusThreshold, notifyFilterAttributes, true, &gin.Context{}, fakeDatabase)) } func TestShouldNotify_MetricsStatusThresholdSmart_FailingSmartDevice(t *testing.T) { t.Parallel() //setup device := models.Device{ DeviceStatus: pkg.DeviceStatusFailedSmart, } smartAttrs := measurements.Smart{} statusThreshold := pkg.MetricsStatusThresholdSmart notifyFilterAttributes := pkg.MetricsStatusFilterAttributesAll mockCtrl := gomock.NewController(t) fakeDatabase := mock_database.NewMockDeviceRepo(mockCtrl) //assert require.True(t, ShouldNotify(logrus.StandardLogger(), device, smartAttrs, statusThreshold, notifyFilterAttributes, true, &gin.Context{}, fakeDatabase)) } func TestShouldNotify_MetricsStatusThresholdScrutiny_FailingSmartDevice(t *testing.T) { t.Parallel() //setup device := models.Device{ DeviceStatus: pkg.DeviceStatusFailedSmart, } smartAttrs := measurements.Smart{} statusThreshold := pkg.MetricsStatusThresholdScrutiny notifyFilterAttributes := pkg.MetricsStatusFilterAttributesAll mockCtrl := gomock.NewController(t) fakeDatabase := mock_database.NewMockDeviceRepo(mockCtrl) //assert require.False(t, ShouldNotify(logrus.StandardLogger(), device, smartAttrs, statusThreshold, notifyFilterAttributes, true, &gin.Context{}, fakeDatabase)) } func TestShouldNotify_MetricsStatusFilterAttributesCritical_WithCriticalAttrs(t *testing.T) { t.Parallel() //setup device := models.Device{ DeviceStatus: pkg.DeviceStatusFailedSmart, } smartAttrs := measurements.Smart{Attributes: map[string]measurements.SmartAttribute{ "5": &measurements.SmartAtaAttribute{ Status: pkg.AttributeStatusFailedSmart, }, }} statusThreshold := pkg.MetricsStatusThresholdBoth notifyFilterAttributes := pkg.MetricsStatusFilterAttributesCritical mockCtrl := gomock.NewController(t) fakeDatabase := mock_database.NewMockDeviceRepo(mockCtrl) //assert require.True(t, ShouldNotify(logrus.StandardLogger(), device, smartAttrs, statusThreshold, notifyFilterAttributes, true, &gin.Context{}, fakeDatabase)) } func TestShouldNotify_MetricsStatusFilterAttributesCritical_WithMultipleCriticalAttrs(t *testing.T) { t.Parallel() //setup device := models.Device{ DeviceStatus: pkg.DeviceStatusFailedSmart, } smartAttrs := measurements.Smart{Attributes: map[string]measurements.SmartAttribute{ "5": &measurements.SmartAtaAttribute{ Status: pkg.AttributeStatusPassed, }, "10": &measurements.SmartAtaAttribute{ Status: pkg.AttributeStatusFailedScrutiny, }, }} statusThreshold := pkg.MetricsStatusThresholdBoth notifyFilterAttributes := pkg.MetricsStatusFilterAttributesCritical mockCtrl := gomock.NewController(t) fakeDatabase := mock_database.NewMockDeviceRepo(mockCtrl) //assert require.True(t, ShouldNotify(logrus.StandardLogger(), device, smartAttrs, statusThreshold, notifyFilterAttributes, true, &gin.Context{}, fakeDatabase)) } func TestShouldNotify_MetricsStatusFilterAttributesCritical_WithNoCriticalAttrs(t *testing.T) { t.Parallel() //setup device := models.Device{ DeviceStatus: pkg.DeviceStatusFailedSmart, } smartAttrs := measurements.Smart{Attributes: map[string]measurements.SmartAttribute{ "1": &measurements.SmartAtaAttribute{ Status: pkg.AttributeStatusFailedSmart, }, }} statusThreshold := pkg.MetricsStatusThresholdBoth notifyFilterAttributes := pkg.MetricsStatusFilterAttributesCritical mockCtrl := gomock.NewController(t) fakeDatabase := mock_database.NewMockDeviceRepo(mockCtrl) //assert require.False(t, ShouldNotify(logrus.StandardLogger(), device, smartAttrs, statusThreshold, notifyFilterAttributes, true, &gin.Context{}, fakeDatabase)) } func TestShouldNotify_MetricsStatusFilterAttributesCritical_WithNoFailingCriticalAttrs(t *testing.T) { t.Parallel() //setup device := models.Device{ DeviceStatus: pkg.DeviceStatusFailedSmart, } smartAttrs := measurements.Smart{Attributes: map[string]measurements.SmartAttribute{ "5": &measurements.SmartAtaAttribute{ Status: pkg.AttributeStatusPassed, }, }} statusThreshold := pkg.MetricsStatusThresholdBoth notifyFilterAttributes := pkg.MetricsStatusFilterAttributesCritical mockCtrl := gomock.NewController(t) fakeDatabase := mock_database.NewMockDeviceRepo(mockCtrl) //assert require.False(t, ShouldNotify(logrus.StandardLogger(), device, smartAttrs, statusThreshold, notifyFilterAttributes, true, &gin.Context{}, fakeDatabase)) } func TestShouldNotify_MetricsStatusFilterAttributesCritical_MetricsStatusThresholdSmart_WithCriticalAttrsFailingScrutiny(t *testing.T) { t.Parallel() //setup device := models.Device{ DeviceStatus: pkg.DeviceStatusFailedSmart, } smartAttrs := measurements.Smart{Attributes: map[string]measurements.SmartAttribute{ "5": &measurements.SmartAtaAttribute{ Status: pkg.AttributeStatusPassed, }, "10": &measurements.SmartAtaAttribute{ Status: pkg.AttributeStatusFailedScrutiny, }, }} statusThreshold := pkg.MetricsStatusThresholdSmart notifyFilterAttributes := pkg.MetricsStatusFilterAttributesCritical mockCtrl := gomock.NewController(t) fakeDatabase := mock_database.NewMockDeviceRepo(mockCtrl) //assert require.False(t, ShouldNotify(logrus.StandardLogger(), device, smartAttrs, statusThreshold, notifyFilterAttributes, true, &gin.Context{}, fakeDatabase)) } func TestShouldNotify_NoRepeat_DatabaseFailure(t *testing.T) { t.Parallel() //setup device := models.Device{ DeviceStatus: pkg.DeviceStatusFailedScrutiny, } smartAttrs := measurements.Smart{Attributes: map[string]measurements.SmartAttribute{ "5": &measurements.SmartAtaAttribute{ Status: pkg.AttributeStatusFailedScrutiny, }, }} statusThreshold := pkg.MetricsStatusThresholdBoth notifyFilterAttributes := pkg.MetricsStatusFilterAttributesAll mockCtrl := gomock.NewController(t) fakeDatabase := mock_database.NewMockDeviceRepo(mockCtrl) fakeDatabase.EXPECT().GetSmartAttributeHistory(&gin.Context{}, "", database.DURATION_KEY_FOREVER, 1, 1, []string{"5"}).Return([]measurements.Smart{}, errors.New("")).Times(1) //assert require.True(t, ShouldNotify(logrus.StandardLogger(), device, smartAttrs, statusThreshold, notifyFilterAttributes, false, &gin.Context{}, fakeDatabase)) } func TestShouldNotify_NoRepeat_NoDatabaseData(t *testing.T) { t.Parallel() //setup device := models.Device{ DeviceStatus: pkg.DeviceStatusFailedScrutiny, } smartAttrs := measurements.Smart{Attributes: map[string]measurements.SmartAttribute{ "5": &measurements.SmartAtaAttribute{ Status: pkg.AttributeStatusFailedScrutiny, }, }} statusThreshold := pkg.MetricsStatusThresholdBoth notifyFilterAttributes := pkg.MetricsStatusFilterAttributesAll mockCtrl := gomock.NewController(t) fakeDatabase := mock_database.NewMockDeviceRepo(mockCtrl) fakeDatabase.EXPECT().GetSmartAttributeHistory(&gin.Context{}, "", database.DURATION_KEY_FOREVER, 1, 1, []string{"5"}).Return([]measurements.Smart{}, nil).Times(1) //assert require.True(t, ShouldNotify(logrus.StandardLogger(), device, smartAttrs, statusThreshold, notifyFilterAttributes, false, &gin.Context{}, fakeDatabase)) } func TestShouldNotify_NoRepeat(t *testing.T) { t.Parallel() //setup device := models.Device{ DeviceStatus: pkg.DeviceStatusFailedScrutiny, } smartAttrs := measurements.Smart{Attributes: map[string]measurements.SmartAttribute{ "5": &measurements.SmartAtaAttribute{ Status: pkg.AttributeStatusFailedScrutiny, TransformedValue: 0, }, }} statusThreshold := pkg.MetricsStatusThresholdBoth notifyFilterAttributes := pkg.MetricsStatusFilterAttributesAll mockCtrl := gomock.NewController(t) fakeDatabase := mock_database.NewMockDeviceRepo(mockCtrl) fakeDatabase.EXPECT().GetSmartAttributeHistory(&gin.Context{}, "", database.DURATION_KEY_FOREVER, 1, 1, []string{"5"}).Return([]measurements.Smart{smartAttrs}, nil).Times(1) //assert require.False(t, ShouldNotify(logrus.StandardLogger(), device, smartAttrs, statusThreshold, notifyFilterAttributes, false, &gin.Context{}, fakeDatabase)) } func TestNewPayload(t *testing.T) { t.Parallel() //setup device := models.Device{ SerialNumber: "FAKEWDDJ324KSO", DeviceType: pkg.DeviceProtocolAta, DeviceName: "/dev/sda", DeviceStatus: pkg.DeviceStatusFailedScrutiny, } currentTime := time.Now() //test payload := NewPayload(device, false, currentTime) //assert require.Equal(t, "Scrutiny SMART error (ScrutinyFailure) detected on device: /dev/sda", payload.Subject) require.Equal(t, fmt.Sprintf(`Scrutiny SMART error notification for device: /dev/sda Failure Type: ScrutinyFailure Device Name: /dev/sda Device Serial: FAKEWDDJ324KSO Device Type: ATA Date: %s`, currentTime.Format(time.RFC3339)), payload.Message) } func TestNewPayload_TestMode(t *testing.T) { t.Parallel() //setup device := models.Device{ SerialNumber: "FAKEWDDJ324KSO", DeviceType: pkg.DeviceProtocolAta, DeviceName: "/dev/sda", DeviceStatus: pkg.DeviceStatusFailedScrutiny, } currentTime := time.Now() //test payload := NewPayload(device, true, currentTime) //assert require.Equal(t, "Scrutiny SMART error (EmailTest) detected on device: /dev/sda", payload.Subject) require.Equal(t, fmt.Sprintf(`TEST NOTIFICATION: Scrutiny SMART error notification for device: /dev/sda Failure Type: EmailTest Device Name: /dev/sda Device Serial: FAKEWDDJ324KSO Device Type: ATA Date: %s`, currentTime.Format(time.RFC3339)), payload.Message) } func TestNewPayload_WithHostId(t *testing.T) { t.Parallel() //setup device := models.Device{ SerialNumber: "FAKEWDDJ324KSO", DeviceType: pkg.DeviceProtocolAta, DeviceName: "/dev/sda", DeviceStatus: pkg.DeviceStatusFailedScrutiny, HostId: "custom-host", } currentTime := time.Now() //test payload := NewPayload(device, false, currentTime) //assert require.Equal(t, "Scrutiny SMART error (ScrutinyFailure) detected on [host]device: [custom-host]/dev/sda", payload.Subject) require.Equal(t, fmt.Sprintf(`Scrutiny SMART error notification for device: /dev/sda Host Id: custom-host Failure Type: ScrutinyFailure Device Name: /dev/sda Device Serial: FAKEWDDJ324KSO Device Type: ATA Date: %s`, currentTime.Format(time.RFC3339)), payload.Message) } ================================================ FILE: webapp/backend/pkg/thresholds/ata_attribute_metadata.go ================================================ package thresholds import ( "strconv" "strings" ) const AtaSmartAttributeDisplayTypeRaw = "raw" const AtaSmartAttributeDisplayTypeNormalized = "normalized" const AtaSmartAttributeDisplayTypeTransformed = "transformed" type AtaAttributeMetadata struct { ID int64 `json:"-"` DisplayName string `json:"display_name"` Ideal string `json:"ideal"` Critical bool `json:"critical"` Description string `json:"description"` Transform func(int64, int64, string) int64 `json:"-"` //this should be a method to extract/tranform the normalized or raw data to a chartable format. Str TransformValueUnit string `json:"transform_value_unit,omitempty"` ObservedThresholds []ObservedThreshold `json:"observed_thresholds,omitempty"` //these thresholds must match the DisplayType DisplayType string `json:"display_type"` //"raw" "normalized" or "transformed" } const ObservedThresholdIdealLow = "low" const ObservedThresholdIdealHigh = "high" type ObservedThreshold struct { Low int64 `json:"low"` //threshold (row/normalized data) boundary low value High int64 `json:"high"` //threshold (row/normalized data) boundary high value AnnualFailureRate float64 `json:"annual_failure_rate"` //error rate % ErrorInterval []float64 `json:"error_interval"` } var AtaMetadata = map[int]AtaAttributeMetadata{ 1: { ID: 1, DisplayName: "Read Error Rate", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "(Vendor specific raw value.) Stores data related to the rate of hardware read errors that occurred when reading data from a disk surface. The raw value has different structure for different vendors and is often not meaningful as a decimal number.", }, 2: { ID: 2, DisplayName: "Throughput Performance", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealHigh, Critical: false, Description: "Overall (general) throughput performance of a hard disk drive. If the value of this attribute is decreasing there is a high probability that there is a problem with the disk.", }, 3: { ID: 3, DisplayName: "Spin-Up Time", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "Average time of spindle spin up (from zero RPM to fully operational [milliseconds]).", ObservedThresholds: []ObservedThreshold{ { Low: 78, High: 96, AnnualFailureRate: 0.11452195377351217, ErrorInterval: []float64{0.10591837762295722, 0.12363823501915781}, }, { Low: 96, High: 114, AnnualFailureRate: 0.040274562840558074, ErrorInterval: []float64{0.03465055611002801, 0.046551312468303144}, }, { Low: 114, High: 132, AnnualFailureRate: 0.009100406705780476, ErrorInterval: []float64{0.006530608971356785, 0.012345729280075591}, }, { Low: 132, High: 150, AnnualFailureRate: 0.008561351734020232, ErrorInterval: []float64{0.004273795939256936, 0.015318623141355509}, }, { Low: 150, High: 168, AnnualFailureRate: 0.015780508262068848, ErrorInterval: []float64{0.005123888078524015, 0.03682644215646287}, }, { Low: 168, High: 186, AnnualFailureRate: 0.05262688124794024, ErrorInterval: []float64{0.0325768689524594, 0.08044577830285578}, }, { Low: 186, High: 204, AnnualFailureRate: 0.01957419424036038, ErrorInterval: []float64{0.0023705257325185624, 0.0707087198669825}, }, { Low: 204, High: 222, AnnualFailureRate: 0.026050959960031404, ErrorInterval: []float64{0.0006595532020744994, 0.1451466588889228}, }, }, }, 4: { ID: 4, DisplayName: "Start/Stop Count", DisplayType: AtaSmartAttributeDisplayTypeRaw, Ideal: "", Critical: false, Description: "A tally of spindle start/stop cycles. The spindle turns on, and hence the count is increased, both when the hard disk is turned on after having before been turned entirely off (disconnected from power source) and when the hard disk returns from having previously been put to sleep mode.", ObservedThresholds: []ObservedThreshold{ { Low: 0, High: 13, AnnualFailureRate: 0.01989335424860646, ErrorInterval: []float64{0.016596548909440657, 0.023653263230617408}, }, { Low: 13, High: 26, AnnualFailureRate: 0.03776935438256488, ErrorInterval: []float64{0.03310396052098642, 0.04290806173460437}, }, { Low: 26, High: 39, AnnualFailureRate: 0.11022223828187004, ErrorInterval: []float64{0.09655110535164119, 0.12528657238811672}, }, { Low: 39, High: 52, AnnualFailureRate: 0.16289995457762474, ErrorInterval: []float64{0.13926541653588131, 0.18939614504497515}, }, { Low: 52, High: 65, AnnualFailureRate: 0.19358212432279714, ErrorInterval: []float64{0.15864522253849073, 0.23392418181765526}, }, { Low: 65, High: 78, AnnualFailureRate: 0.1157094940074447, ErrorInterval: []float64{0.07861898732346269, 0.16424039052527728}, }, { Low: 78, High: 91, AnnualFailureRate: 0.12262136155304391, ErrorInterval: []float64{0.0670382394080032, 0.20573780888032978}, }, { Low: 91, High: 104, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, }, }, 5: { ID: 5, DisplayName: "Reallocated Sectors Count", DisplayType: AtaSmartAttributeDisplayTypeRaw, Ideal: ObservedThresholdIdealLow, Critical: true, Description: "Count of reallocated sectors. The raw value represents a count of the bad sectors that have been found and remapped.Thus, the higher the attribute value, the more sectors the drive has had to reallocate. This value is primarily used as a metric of the life expectancy of the drive; a drive which has had any reallocations at all is significantly more likely to fail in the immediate months.", ObservedThresholds: []ObservedThreshold{ { Low: 0, High: 0, AnnualFailureRate: 0.025169175350572493, ErrorInterval: []float64{0.022768612038746357, 0.027753988579272894}, }, { Low: 1, High: 4, AnnualFailureRate: 0.027432608477803388, ErrorInterval: []float64{0.010067283827589948, 0.05970923963096652}, }, { Low: 4, High: 16, AnnualFailureRate: 0.07501976284584981, ErrorInterval: []float64{0.039944864177334186, 0.12828607921150972}, }, { Low: 16, High: 70, AnnualFailureRate: 0.23589260654405794, ErrorInterval: []float64{0.1643078435800227, 0.32806951196017664}, }, { Low: 70, High: 260, AnnualFailureRate: 0.36193219378600433, ErrorInterval: []float64{0.2608488901774093, 0.4892271827875412}, }, { Low: 260, High: 1100, AnnualFailureRate: 0.5676621428968173, ErrorInterval: []float64{0.4527895568499355, 0.702804359408436}, }, { Low: 1100, High: 4500, AnnualFailureRate: 1.5028253400346423, ErrorInterval: []float64{1.2681757596263297, 1.768305221795894}, }, { Low: 4500, High: 17000, AnnualFailureRate: 2.0659987547404763, ErrorInterval: []float64{1.6809790460512237, 2.512808045182302}, }, { Low: 17000, High: 70000, AnnualFailureRate: 1.7755385684503124, ErrorInterval: []float64{1.2796520259849835, 2.400012341226441}, }, }, }, 6: { ID: 6, DisplayName: "Read Channel Margin", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Margin of a channel while reading data. The function of this attribute is not specified.", }, 7: { ID: 7, DisplayName: "Seek Error Rate", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "(Vendor specific raw value.) Rate of seek errors of the magnetic heads. If there is a partial failure in the mechanical positioning system, then seek errors will arise. Such a failure may be due to numerous factors, such as damage to a servo, or thermal widening of the hard disk. The raw value has different structure for different vendors and is often not meaningful as a decimal number.", }, 8: { ID: 8, DisplayName: "Seek Time Performance", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealHigh, Critical: false, Description: "Average performance of seek operations of the magnetic heads. If this attribute is decreasing, it is a sign of problems in the mechanical subsystem.", }, 9: { ID: 9, DisplayName: "Power-On Hours", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Count of hours in power-on state. The raw value of this attribute shows total count of hours (or minutes, or seconds, depending on manufacturer) in power-on state. By default, the total expected lifetime of a hard disk in perfect condition is defined as 5 years (running every day and night on all days). This is equal to 1825 days in 24/7 mode or 43800 hours. On some pre-2005 drives, this raw value may advance erratically and/or \"wrap around\" (reset to zero periodically).", }, 10: { ID: 10, DisplayName: "Spin Retry Count", DisplayType: AtaSmartAttributeDisplayTypeRaw, Ideal: ObservedThresholdIdealLow, Critical: true, Description: "Count of retry of spin start attempts. This attribute stores a total count of the spin start attempts to reach the fully operational speed (under the condition that the first attempt was unsuccessful). An increase of this attribute value is a sign of problems in the hard disk mechanical subsystem.", ObservedThresholds: []ObservedThreshold{ { Low: 0, High: 0, AnnualFailureRate: 0.05459827163896099, ErrorInterval: []float64{0.05113785787727033, 0.05823122757702782}, }, { //TODO: using fake data from attribute 11. Not enough data, but critical and correlated with failure. Low: 0, High: 80, AnnualFailureRate: 0.5555555555555556, ErrorInterval: []float64{0.014065448880161053, 3.095357439410498}, }, }, }, 11: { ID: 11, DisplayName: "Recalibration Retries or Calibration Retry Count", DisplayType: AtaSmartAttributeDisplayTypeRaw, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "This attribute indicates the count that recalibration was requested (under the condition that the first attempt was unsuccessful). An increase of this attribute value is a sign of problems in the hard disk mechanical subsystem.", ObservedThresholds: []ObservedThreshold{ { Low: 0, High: 0, AnnualFailureRate: 0.04658866433672694, ErrorInterval: []float64{0.03357701137320878, 0.06297433993055492}, }, { Low: 0, High: 80, AnnualFailureRate: 0.5555555555555556, ErrorInterval: []float64{0.014065448880161053, 3.095357439410498}, }, { Low: 80, High: 160, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, { Low: 160, High: 240, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, { Low: 240, High: 320, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, { Low: 320, High: 400, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, { Low: 400, High: 480, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, { Low: 480, High: 560, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, }, }, 12: { ID: 12, DisplayName: "Power Cycle Count", DisplayType: AtaSmartAttributeDisplayTypeRaw, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "This attribute indicates the count of full hard disk power on/off cycles.", }, 13: { ID: 13, DisplayName: "Soft Read Error Rate", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "Uncorrected read errors reported to the operating system.", }, 22: { ID: 22, DisplayName: "Current Helium Level", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealHigh, Critical: false, Description: "Specific to He8 drives from HGST. This value measures the helium inside of the drive specific to this manufacturer. It is a pre-fail attribute that trips once the drive detects that the internal environment is out of specification.", }, 170: { ID: 170, DisplayName: "Available Reserved Space", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "See attribute E8.", }, 171: { ID: 171, DisplayName: "SSD Program Fail Count", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "(Kingston) The total number of flash program operation failures since the drive was deployed.[33] Identical to attribute 181.", }, 172: { ID: 172, DisplayName: "SSD Erase Fail Count", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "(Kingston) Counts the number of flash erase failures. This attribute returns the total number of Flash erase operation failures since the drive was deployed. This attribute is identical to attribute 182.", }, 173: { ID: 173, DisplayName: "SSD Wear Leveling Count", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Counts the maximum worst erase count on any block.", }, 174: { ID: 174, DisplayName: "Unexpected Power Loss Count", Ideal: "", Critical: false, Description: "Also known as \"Power-off Retract Count\" per conventional HDD terminology. Raw value reports the number of unclean shutdowns, cumulative over the life of an SSD, where an \"unclean shutdown\" is the removal of power without STANDBY IMMEDIATE as the last command (regardless of PLI activity using capacitor power). Normalized value is always 100.", }, 175: { ID: 175, DisplayName: "Power Loss Protection Failure", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Last test result as microseconds to discharge cap, saturated at its maximum value. Also logs minutes since last test and lifetime number of tests. Raw value contains the following data: Bytes 0-1: Last test result as microseconds to discharge cap, saturates at max value. Test result expected in range 25 <= result <= 5000000, lower indicates specific error code. Bytes 2-3: Minutes since last test, saturates at max value.Bytes 4-5: Lifetime number of tests, not incremented on power cycle, saturates at max value. Normalized value is set to one on test failure or 11 if the capacitor has been tested in an excessive temperature condition, otherwise 100.", }, 176: { ID: 176, DisplayName: "Erase Fail Count", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "S.M.A.R.T. parameter indicates a number of flash erase command failures.", }, 177: { ID: 177, DisplayName: "Wear Range Delta", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Delta between most-worn and least-worn Flash blocks. It describes how good/bad the wearleveling of the SSD works on a more technical way. ", }, 179: { ID: 179, DisplayName: "Used Reserved Block Count Total", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Pre-Fail attribute used at least in Samsung devices.", }, 180: { ID: 180, DisplayName: "Unused Reserved Block Count Total", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "\"Pre-Fail\" attribute used at least in HP devices. ", }, 181: { ID: 181, DisplayName: "Program Fail Count Total", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Total number of Flash program operation failures since the drive was deployed.", }, 182: { ID: 182, DisplayName: "Erase Fail Count", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "\"Pre-Fail\" Attribute used at least in Samsung devices.", }, 183: { ID: 183, DisplayName: "SATA Downshift Error Count or Runtime Bad Block", DisplayType: AtaSmartAttributeDisplayTypeRaw, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "Western Digital, Samsung or Seagate attribute: Either the number of downshifts of link speed (e.g. from 6Gbit/s to 3Gbit/s) or the total number of data blocks with detected, uncorrectable errors encountered during normal operation. Although degradation of this parameter can be an indicator of drive aging and/or potential electromechanical problems, it does not directly indicate imminent drive failure.", ObservedThresholds: []ObservedThreshold{ { Low: 0, High: 0, AnnualFailureRate: 0.09084549203210031, ErrorInterval: []float64{0.08344373475686712, 0.09872777224842152}, }, { Low: 1, High: 2, AnnualFailureRate: 0.05756065656498585, ErrorInterval: []float64{0.04657000847949464, 0.07036491775108872}, }, { Low: 2, High: 4, AnnualFailureRate: 0.6193088626208925, ErrorInterval: []float64{0.41784508895529787, 0.8841019099092139}, }, { Low: 4, High: 8, AnnualFailureRate: 0.5533447034299792, ErrorInterval: []float64{0.31628430884775033, 0.8985971312402635}, }, { Low: 8, High: 16, AnnualFailureRate: 0.3882388694727245, ErrorInterval: []float64{0.21225380267814295, 0.6513988534774338}, }, { Low: 16, High: 35, AnnualFailureRate: 0.37116708385481856, ErrorInterval: []float64{0.19763084005134446, 0.6347070173754686}, }, { Low: 35, High: 70, AnnualFailureRate: 0.2561146752205292, ErrorInterval: []float64{0.10297138269895259, 0.5276941165819332}, }, { Low: 70, High: 130, AnnualFailureRate: 0.40299684542586756, ErrorInterval: []float64{0.16202563309223209, 0.8303275247667772}, }, { Low: 130, High: 260, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, }, }, 184: { ID: 184, DisplayName: "End-to-End error", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealLow, Critical: true, Description: "This attribute is a part of Hewlett-Packard\"s SMART IV technology, as well as part of other vendors\" IO Error Detection and Correction schemas, and it contains a count of parity errors which occur in the data path to the media via the drive\"s cache RAM", ObservedThresholds: []ObservedThreshold{ { Low: 93, High: 94, AnnualFailureRate: 1.631212012870933, ErrorInterval: []float64{1.055634407303844, 2.407990716767714}, }, { Low: 94, High: 95, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, { Low: 95, High: 96, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, { Low: 96, High: 97, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, { Low: 97, High: 97, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, { Low: 97, High: 98, AnnualFailureRate: 1.8069306930693072, ErrorInterval: []float64{0.04574752432804858, 10.067573453924245}, }, { Low: 98, High: 99, AnnualFailureRate: 0.8371559633027523, ErrorInterval: []float64{0.10138347095016888, 3.0240951820174824}, }, { Low: 99, High: 100, AnnualFailureRate: 0.09334816849865138, ErrorInterval: []float64{0.08689499010435861, 0.10015372448181788}, }, }, }, 185: { ID: 185, DisplayName: "Head Stability", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Western Digital attribute.", }, 186: { ID: 186, DisplayName: "Induced Op-Vibration Detection", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Western Digital attribute.", }, 187: { ID: 187, DisplayName: "Reported Uncorrectable Errors", DisplayType: AtaSmartAttributeDisplayTypeRaw, Ideal: ObservedThresholdIdealLow, Critical: true, Description: "The count of errors that could not be recovered using hardware ECC (see attribute 195).", ObservedThresholds: []ObservedThreshold{ { Low: 0, High: 0, AnnualFailureRate: 0.028130798308190524, ErrorInterval: []float64{0.024487830609364304, 0.032162944988161336}, }, { Low: 1, High: 1, AnnualFailureRate: 0.33877621175661743, ErrorInterval: []float64{0.22325565823630591, 0.4929016016666955}, }, { Low: 1, High: 3, AnnualFailureRate: 0.24064820598237213, ErrorInterval: []float64{0.14488594021076606, 0.3758019832614595}, }, { Low: 3, High: 6, AnnualFailureRate: 0.5014425058387142, ErrorInterval: []float64{0.3062941096766342, 0.7744372808405151}, }, { Low: 6, High: 11, AnnualFailureRate: 0.38007108544136836, ErrorInterval: []float64{0.2989500188963677, 0.4764223967570595}, }, { Low: 11, High: 20, AnnualFailureRate: 0.5346094598348444, ErrorInterval: []float64{0.40595137663302483, 0.6911066985735377}, }, { Low: 20, High: 35, AnnualFailureRate: 0.8428063943161636, ErrorInterval: []float64{0.6504601819243522, 1.0742259350903411}, }, { Low: 35, High: 65, AnnualFailureRate: 1.4429071005017484, ErrorInterval: []float64{1.1405581860945952, 1.8008133631629157}, }, { Low: 65, High: 120, AnnualFailureRate: 1.6190935390549661, ErrorInterval: []float64{1.0263664163011208, 2.4294352761068576}, }, }, }, 188: { ID: 188, DisplayName: "Command Timeout", DisplayType: AtaSmartAttributeDisplayTypeTransformed, Ideal: ObservedThresholdIdealLow, Critical: true, Description: "The count of aborted operations due to HDD timeout. Normally this attribute value should be equal to zero.", Transform: func(normValue int64, rawValue int64, rawString string) int64 { // Parse Seagate command timeout values if the string contains 3 pieces // and each piece is less than or equal to the next (as a sanity check) // See https://github.com/AnalogJ/scrutiny/issues/522 pieces := strings.Split(rawString, " ") if len(pieces) == 3 { int_pieces := make([]int, len(pieces)) var err error for i, s := range pieces { int_pieces[i], err = strconv.Atoi(s) if err != nil { return rawValue } } if int_pieces[2] >= int_pieces[1] && int_pieces[1] >= int_pieces[0] { return int64(int_pieces[2]) } } return rawValue }, ObservedThresholds: []ObservedThreshold{ { Low: 0, // This is set arbitrarily to avoid notifications caused by low // historical numbers of command timeouts (e.g. caused by a bad cable) High: 100, AnnualFailureRate: 0.024893587674442153, ErrorInterval: []float64{0.020857343769186413, 0.0294830350167543}, }, { Low: 100, High: 13000000000, AnnualFailureRate: 0.10044174089362015, ErrorInterval: []float64{0.0812633664077498, 0.1227848196758574}, }, { Low: 13000000000, High: 26000000000, AnnualFailureRate: 0.334030592234279, ErrorInterval: []float64{0.2523231196342665, 0.4337665082489293}, }, { Low: 26000000000, High: 39000000000, AnnualFailureRate: 0.36724705400842445, ErrorInterval: []float64{0.30398009356575617, 0.4397986538328568}, }, { Low: 39000000000, High: 52000000000, AnnualFailureRate: 0.29848155926978354, ErrorInterval: []float64{0.2509254838615984, 0.35242890006477073}, }, { Low: 52000000000, High: 65000000000, AnnualFailureRate: 0.2203079701535098, ErrorInterval: []float64{0.18366082845676174, 0.26212468677179274}, }, { Low: 65000000000, High: 78000000000, AnnualFailureRate: 0.3018169948863018, ErrorInterval: []float64{0.23779746376787655, 0.37776897542831006}, }, { Low: 78000000000, High: 91000000000, AnnualFailureRate: 0.32854928239235887, ErrorInterval: []float64{0.2301118782147336, 0.4548506948185028}, }, { Low: 91000000000, High: 104000000000, AnnualFailureRate: 0.28488916640649387, ErrorInterval: []float64{0.1366154288236293, 0.5239213202729072}, }, }, }, 189: { ID: 189, DisplayName: "High Fly Writes", DisplayType: AtaSmartAttributeDisplayTypeRaw, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "HDD manufacturers implement a flying height sensor that attempts to provide additional protections for write operations by detecting when a recording head is flying outside its normal operating range. If an unsafe fly height condition is encountered, the write process is stopped, and the information is rewritten or reallocated to a safe region of the hard drive. This attribute indicates the count of these errors detected over the lifetime of the drive.", ObservedThresholds: []ObservedThreshold{ { Low: 0, High: 0, AnnualFailureRate: 0.09070551401946862, ErrorInterval: []float64{0.08018892683853401, 0.10221801211956287}, }, { Low: 1, High: 2, AnnualFailureRate: 0.0844336097370013, ErrorInterval: []float64{0.07299813695315267, 0.09715235540340669}, }, { Low: 2, High: 5, AnnualFailureRate: 0.07943219628781906, ErrorInterval: []float64{0.06552176680630226, 0.09542233189887633}, }, { Low: 5, High: 13, AnnualFailureRate: 0.09208847603893404, ErrorInterval: []float64{0.07385765060838133, 0.11345557807163456}, }, { Low: 13, High: 30, AnnualFailureRate: 0.18161161650924224, ErrorInterval: []float64{0.13858879602902988, 0.23377015012749933}, }, { Low: 30, High: 70, AnnualFailureRate: 0.2678117886102384, ErrorInterval: []float64{0.19044036194841887, 0.36610753129699186}, }, { Low: 70, High: 150, AnnualFailureRate: 0.26126480798826107, ErrorInterval: []float64{0.15958733218826962, 0.4035023060905559}, }, { Low: 150, High: 350, AnnualFailureRate: 0.11337164155924832, ErrorInterval: []float64{0.030889956621649995, 0.2902764300762812}, }, }, }, 190: { ID: 190, DisplayName: "Temperature Difference", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Value is equal to (100-temp. °C), allowing manufacturer to set a minimum threshold which corresponds to a maximum temperature. This also follows the convention of 100 being a best-case value and lower values being undesirable. However, some older drives may instead report raw Temperature (identical to 0xC2) or Temperature minus 50 here.", }, 191: { ID: 191, DisplayName: "G-sense Error Rate", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "The count of errors resulting from externally induced shock and vibration. ", }, 192: { ID: 192, DisplayName: "Power-off Retract Count", DisplayType: AtaSmartAttributeDisplayTypeRaw, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "Number of power-off or emergency retract cycles.", ObservedThresholds: []ObservedThreshold{ { Low: 1, High: 2, AnnualFailureRate: 0.02861098445412803, ErrorInterval: []float64{0.022345416230915037, 0.036088863823297186}, }, { Low: 2, High: 6, AnnualFailureRate: 0.0738571777154862, ErrorInterval: []float64{0.06406927746420421, 0.0847175264009771}, }, { Low: 6, High: 16, AnnualFailureRate: 0.11970378206823593, ErrorInterval: []float64{0.10830059875098269, 0.13198105985656441}, }, { Low: 16, High: 40, AnnualFailureRate: 0.027266868552620425, ErrorInterval: []float64{0.021131448605713823, 0.03462795920968522}, }, { Low: 40, High: 100, AnnualFailureRate: 0.011741682974559688, ErrorInterval: []float64{0.00430899071133239, 0.025556700631152028}, }, { Low: 100, High: 250, AnnualFailureRate: 0.012659940134091309, ErrorInterval: []float64{0.00607093338127348, 0.023282080653656938}, }, { Low: 250, High: 650, AnnualFailureRate: 0.01634692899031039, ErrorInterval: []float64{0.009522688540043157, 0.026173016865409605}, }, { Low: 650, High: 1600, AnnualFailureRate: 0.005190074354440066, ErrorInterval: []float64{0.0025908664180103293, 0.009286476666453648}, }, }, }, 193: { ID: 193, DisplayName: "Load Cycle Count", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "Count of load/unload cycles into head landing zone position.[45] Some drives use 225 (0xE1) for Load Cycle Count instead.", }, 194: { ID: 194, DisplayName: "Temperature", DisplayType: AtaSmartAttributeDisplayTypeTransformed, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "Indicates the device temperature, if the appropriate sensor is fitted. Lowest byte of the raw value contains the exact temperature value (Celsius degrees).", Transform: func(normValue int64, rawValue int64, rawString string) int64 { return rawValue & 0b11111111 }, TransformValueUnit: "°C", }, 195: { ID: 195, DisplayName: "Hardware ECC Recovered", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "(Vendor-specific raw value.) The raw value has different structure for different vendors and is often not meaningful as a decimal number.", ObservedThresholds: []ObservedThreshold{ { Low: 12, High: 24, AnnualFailureRate: 0.31472916829975706, ErrorInterval: []float64{0.15711166685282174, 0.5631374192486645}, }, { Low: 24, High: 36, AnnualFailureRate: 0.15250310197260136, ErrorInterval: []float64{0.10497611828070175, 0.21417105521823687}, }, { Low: 36, High: 48, AnnualFailureRate: 0.2193119102723874, ErrorInterval: []float64{0.16475385681835103, 0.28615447006525274}, }, { Low: 48, High: 60, AnnualFailureRate: 0.05672658497265746, ErrorInterval: []float64{0.043182904776447234, 0.07317316161437043}, }, { Low: 60, High: 72, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, { Low: 72, High: 84, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, { Low: 84, High: 96, AnnualFailureRate: 0, ErrorInterval: []float64{0, 0}, }, { Low: 96, High: 108, AnnualFailureRate: 0.04074570216566197, ErrorInterval: []float64{0.001031591863615295, 0.22702052218047528}, }, }, }, 196: { ID: 196, DisplayName: "Reallocation Event Count", DisplayType: AtaSmartAttributeDisplayTypeRaw, Ideal: ObservedThresholdIdealLow, Critical: true, Description: "Count of remap operations. The raw value of this attribute shows the total count of attempts to transfer data from reallocated sectors to a spare area. Both successful and unsuccessful attempts are counted.", ObservedThresholds: []ObservedThreshold{ { Low: 0, High: 0, AnnualFailureRate: 0.007389855800729792, ErrorInterval: []float64{0.005652654139732716, 0.009492578928212054}, }, { Low: 1, High: 1, AnnualFailureRate: 0.026558331312151347, ErrorInterval: []float64{0.005476966404484466, 0.07761471429677293}, }, { Low: 1, High: 2, AnnualFailureRate: 0.02471894893674658, ErrorInterval: []float64{0.0006258296027540169, 0.13772516847438018}, }, { Low: 2, High: 4, AnnualFailureRate: 0.03200912040691046, ErrorInterval: []float64{0.0008104007642081744, 0.17834340416493005}, }, { Low: 4, High: 7, AnnualFailureRate: 0.043078012510326925, ErrorInterval: []float64{0.001090640849081295, 0.24001532369794615}, }, { Low: 7, High: 11, AnnualFailureRate: 0.033843300880853036, ErrorInterval: []float64{0.0008568381932559863, 0.18856280368036135}, }, { Low: 11, High: 17, AnnualFailureRate: 0.16979376647542252, ErrorInterval: []float64{0.035015556653263225, 0.49620943874336304}, }, { Low: 17, High: 27, AnnualFailureRate: 0.059042381106438044, ErrorInterval: []float64{0.0014948236677880642, 0.32896309247698113}, }, { Low: 27, High: 45, AnnualFailureRate: 0.24701105346266636, ErrorInterval: []float64{0.050939617608142244, 0.721871118983972}, }, }, }, 197: { ID: 197, DisplayName: "Current Pending Sector Count", DisplayType: AtaSmartAttributeDisplayTypeRaw, Ideal: ObservedThresholdIdealLow, Critical: true, Description: "Count of \"unstable\" sectors (waiting to be remapped, because of unrecoverable read errors). If an unstable sector is subsequently read successfully, the sector is remapped and this value is decreased. Read errors on a sector will not remap the sector immediately (since the correct value cannot be read and so the value to remap is not known, and also it might become readable later); instead, the drive firmware remembers that the sector needs to be remapped, and will remap it the next time it\"s written.", ObservedThresholds: []ObservedThreshold{ { Low: 0, High: 0, AnnualFailureRate: 0.025540791394761345, ErrorInterval: []float64{0.023161777231213983, 0.02809784482748174}, }, { Low: 1, High: 2, AnnualFailureRate: 0.34196613799103254, ErrorInterval: []float64{0.22723401523750225, 0.4942362818474496}, }, { Low: 2, High: 6, AnnualFailureRate: 0.6823772508117681, ErrorInterval: []float64{0.41083568090070416, 1.0656166047061635}, }, { Low: 6, High: 16, AnnualFailureRate: 0.6108100007493069, ErrorInterval: []float64{0.47336936083368364, 0.7757071095273286}, }, { Low: 16, High: 40, AnnualFailureRate: 0.9564879341127684, ErrorInterval: []float64{0.7701044196378299, 1.174355230793638}, }, { Low: 40, High: 100, AnnualFailureRate: 1.6519989942167461, ErrorInterval: []float64{1.328402276482456, 2.0305872327541317}, }, { Low: 100, High: 250, AnnualFailureRate: 2.5137741046831956, ErrorInterval: []float64{1.9772427971560862, 3.1510376077891613}, }, { Low: 250, High: 650, AnnualFailureRate: 3.3203378817413904, ErrorInterval: []float64{2.5883662702274406, 4.195047163573006}, }, { Low: 650, High: 1600, AnnualFailureRate: 3.133047210300429, ErrorInterval: []float64{1.1497731080460096, 6.819324775707182}, }, }, }, 198: { ID: 198, DisplayName: "(Offline) Uncorrectable Sector Count", DisplayType: AtaSmartAttributeDisplayTypeRaw, Ideal: ObservedThresholdIdealLow, Critical: true, Description: "The total count of uncorrectable errors when reading/writing a sector. A rise in the value of this attribute indicates defects of the disk surface and/or problems in the mechanical subsystem.", ObservedThresholds: []ObservedThreshold{ { Low: 0, High: 0, AnnualFailureRate: 0.028675322159886437, ErrorInterval: []float64{0.026159385510707116, 0.03136793218577656}, }, { Low: 0, High: 2, AnnualFailureRate: 0.8135764944275583, ErrorInterval: []float64{0.40613445471964466, 1.4557130815309443}, }, { Low: 2, High: 4, AnnualFailureRate: 1.1173469387755102, ErrorInterval: []float64{0.5773494680315332, 1.9517802404552516}, }, { Low: 4, High: 6, AnnualFailureRate: 1.3558692421991083, ErrorInterval: []float64{0.4402470522980859, 3.1641465148237544}, }, { Low: 6, High: 8, AnnualFailureRate: 0.7324414715719062, ErrorInterval: []float64{0.15104704003805655, 2.140504796291604}, }, { Low: 8, High: 10, AnnualFailureRate: 0.5777213677766163, ErrorInterval: []float64{0.43275294849366835, 0.7556737733062419}, }, { Low: 10, High: 12, AnnualFailureRate: 1.7464114832535886, ErrorInterval: []float64{0.47583835092536914, 4.471507017371231}, }, { Low: 12, High: 14, AnnualFailureRate: 2.6449275362318843, ErrorInterval: []float64{0.3203129951758959, 9.554387676519005}, }, { Low: 14, High: 16, AnnualFailureRate: 0.796943231441048, ErrorInterval: []float64{0.5519063550198366, 1.113648286331181}, }, }, }, 199: { ID: 199, DisplayName: "UltraDMA CRC Error Count", DisplayType: AtaSmartAttributeDisplayTypeRaw, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "The count of errors in data transfer via the interface cable as determined by ICRC (Interface Cyclic Redundancy Check).", ObservedThresholds: []ObservedThreshold{ { Low: 0, High: 1, AnnualFailureRate: 0.04068379316116366, ErrorInterval: []float64{0.037534031558106425, 0.04402730201866553}, }, { Low: 1, High: 2, AnnualFailureRate: 0.1513481259734218, ErrorInterval: []float64{0.12037165605991791, 0.18786293065527596}, }, { Low: 2, High: 4, AnnualFailureRate: 0.16849758722418978, ErrorInterval: []float64{0.12976367397863445, 0.2151676572000481}, }, { Low: 4, High: 8, AnnualFailureRate: 0.15385127340491614, ErrorInterval: []float64{0.10887431782430312, 0.21117289306426648}, }, { Low: 8, High: 16, AnnualFailureRate: 0.14882894050104387, ErrorInterval: []float64{0.09631424312463635, 0.2197008753522735}, }, { Low: 16, High: 35, AnnualFailureRate: 0.20878219917249793, ErrorInterval: []float64{0.14086447304552446, 0.29804957135975}, }, { Low: 35, High: 70, AnnualFailureRate: 0.13742940270409038, ErrorInterval: []float64{0.06860426267470295, 0.24589916335290812}, }, { Low: 70, High: 130, AnnualFailureRate: 0.22336578581363, ErrorInterval: []float64{0.11150339549604707, 0.39966309081252904}, }, { Low: 130, High: 260, AnnualFailureRate: 0.18277416124186283, ErrorInterval: []float64{0.07890890989692058, 0.3601379610272007}, }, }, }, 200: { ID: 200, DisplayName: "Multi-Zone Error Rate", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "The count of errors found when writing a sector. The higher the value, the worse the disk\"s mechanical condition is.", }, 201: { ID: 201, DisplayName: "Soft Read Error Rate", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealLow, Critical: true, Description: "Count indicates the number of uncorrectable software read errors.", }, 202: { ID: 202, DisplayName: "Data Address Mark errors", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "Count of Data Address Mark errors (or vendor-specific).", }, 203: { ID: 203, DisplayName: "Run Out Cancel", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "The number of errors caused by incorrect checksum during the error correction.", }, 204: { ID: 204, DisplayName: "Soft ECC Correction", Ideal: ObservedThresholdIdealLow, Critical: false, Description: "Count of errors corrected by the internal error correction software.", }, 205: { ID: 205, DisplayName: "Thermal Asperity Rate", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "Count of errors due to high temperature.", }, 206: { ID: 206, DisplayName: "Flying Height", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Height of heads above the disk surface. If too low, head crash is more likely; if too high, read/write errors are more likely.", }, 207: { ID: 207, DisplayName: "Spin High Current", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "Amount of surge current used to spin up the drive.", }, 208: { ID: 208, DisplayName: "Spin Buzz", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Count of buzz routines needed to spin up the drive due to insufficient power.", }, 209: { ID: 209, DisplayName: "Offline Seek Performance", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Drive\"s seek performance during its internal tests.", }, 210: { ID: 210, DisplayName: "Vibration During Write", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Found in Maxtor 6B200M0 200GB and Maxtor 2R015H1 15GB disks.", }, 211: { ID: 211, DisplayName: "Vibration During Write", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "A recording of a vibration encountered during write operations.", }, 212: { ID: 212, DisplayName: "Shock During Write", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "A recording of shock encountered during write operations.", }, 220: { ID: 220, DisplayName: "Disk Shift", Ideal: ObservedThresholdIdealLow, DisplayType: AtaSmartAttributeDisplayTypeNormalized, Critical: false, Description: "Distance the disk has shifted relative to the spindle (usually due to shock or temperature). Unit of measure is unknown.", }, 221: { ID: 221, DisplayName: "G-Sense Error Rate", Ideal: ObservedThresholdIdealLow, DisplayType: AtaSmartAttributeDisplayTypeNormalized, Critical: false, Description: "The count of errors resulting from externally induced shock and vibration.", }, 222: { ID: 222, DisplayName: "Loaded Hours", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Time spent operating under data load (movement of magnetic head armature).", }, 223: { ID: 223, DisplayName: "Load/Unload Retry Count", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Count of times head changes position.", }, 224: { ID: 224, DisplayName: "Load Friction", Ideal: ObservedThresholdIdealLow, DisplayType: AtaSmartAttributeDisplayTypeNormalized, Critical: false, Description: "Resistance caused by friction in mechanical parts while operating.", }, 225: { ID: 225, DisplayName: "Load/Unload Cycle Count", Ideal: ObservedThresholdIdealLow, DisplayType: AtaSmartAttributeDisplayTypeNormalized, Critical: false, Description: "Total count of load cycles Some drives use 193 (0xC1) for Load Cycle Count instead. See Description for 193 for significance of this number. ", }, 226: { ID: 226, DisplayName: "Load \"In\"-time", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Total time of loading on the magnetic heads actuator (time not spent in parking area).", }, 227: { ID: 227, DisplayName: "Torque Amplification Count", Ideal: ObservedThresholdIdealLow, Critical: false, Description: "Count of attempts to compensate for platter speed variations.[66]", }, 228: { ID: 228, DisplayName: "Power-Off Retract Cycle", Ideal: ObservedThresholdIdealLow, Critical: false, Description: "The number of power-off cycles which are counted whenever there is a \"retract event\" and the heads are loaded off of the media such as when the machine is powered down, put to sleep, or is idle.", }, 230: { ID: 230, DisplayName: "GMR Head Amplitude ", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Amplitude of \"thrashing\" (repetitive head moving motions between operations).", }, 231: { ID: 231, DisplayName: "Life Left", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Indicates the approximate SSD life left, in terms of program/erase cycles or available reserved blocks. A normalized value of 100 represents a new drive, with a threshold value at 10 indicating a need for replacement. A value of 0 may mean that the drive is operating in read-only mode to allow data recovery.", }, 232: { ID: 232, DisplayName: "Endurance Remaining", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Number of physical erase cycles completed on the SSD as a percentage of the maximum physical erase cycles the drive is designed to endure.", }, 233: { ID: 233, DisplayName: "Media Wearout Indicator", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Intel SSDs report a normalized value from 100, a new drive, to a minimum of 1. It decreases while the NAND erase cycles increase from 0 to the maximum-rated cycles.", }, 234: { ID: 234, DisplayName: "Average erase count", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Decoded as: byte 0-1-2 = average erase count (big endian) and byte 3-4-5 = max erase count (big endian).", }, 235: { ID: 235, DisplayName: "Good Block Count", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Decoded as: byte 0-1-2 = good block count (big endian) and byte 3-4 = system (free) block count.", }, 240: { ID: 240, DisplayName: "Head Flying Hours", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Time spent during the positioning of the drive heads.[15][71] Some Fujitsu drives report the count of link resets during a data transfer.", }, 241: { ID: 241, DisplayName: "Total LBAs Written", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Total count of LBAs written.", }, 242: { ID: 242, DisplayName: "Total LBAs Read", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Total count of LBAs read.Some S.M.A.R.T. utilities will report a negative number for the raw value since in reality it has 48 bits rather than 32.", }, 243: { ID: 243, DisplayName: "Total LBAs Written Expanded", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "The upper 5 bytes of the 12-byte total number of LBAs written to the device. The lower 7 byte value is located at attribute 0xF1.", }, 244: { ID: 244, DisplayName: "Total LBAs Read Expanded", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "The upper 5 bytes of the 12-byte total number of LBAs read from the device. The lower 7 byte value is located at attribute 0xF2.", }, 249: { ID: 249, DisplayName: "NAND Writes (1GiB)", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "Total NAND Writes. Raw value reports the number of writes to NAND in 1 GB increments.", }, 250: { ID: 250, DisplayName: "Read Error Retry Rate", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "Count of errors while reading from a disk.", }, 251: { ID: 251, DisplayName: "Minimum Spares Remaining", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "The Minimum Spares Remaining attribute indicates the number of remaining spare blocks as a percentage of the total number of spare blocks available.", }, 252: { ID: 252, DisplayName: "Newly Added Bad Flash Block", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: "", Critical: false, Description: "The Newly Added Bad Flash Block attribute indicates the total number of bad flash blocks the drive detected since it was first initialized in manufacturing.", }, 254: { ID: 254, DisplayName: "Free Fall Protection", DisplayType: AtaSmartAttributeDisplayTypeNormalized, Ideal: ObservedThresholdIdealLow, Critical: false, Description: "Count of \"Free Fall Events\" detected.", }, } ================================================ FILE: webapp/backend/pkg/thresholds/nvme_attribute_metadata.go ================================================ package thresholds // https://media.kingston.com/support/downloads/MKP_521.6_SMART-DCP1000_attribute.pdf // https://www.percona.com/blog/2017/02/09/using-nvme-command-line-tools-to-check-nvme-flash-health/ // https://nvmexpress.org/resources/nvm-express-technology-features/nvme-features-for-error-reporting-smart-log-pages-failures-and-management-capabilities-in-nvme-architectures/ // https://www.micromat.com/product_manuals/drive_scope_manual_01.pdf type NvmeAttributeMetadata struct { ID string `json:"-"` DisplayName string `json:"display_name"` Ideal string `json:"ideal"` Critical bool `json:"critical"` Description string `json:"description"` Transform func(int64, int64, string) int64 `json:"-"` //this should be a method to extract/tranform the normalized or raw data to a chartable format. Str TransformValueUnit string `json:"transform_value_unit,omitempty"` DisplayType string `json:"display_type"` //"raw" "normalized" or "transformed" } var NmveMetadata = map[string]NvmeAttributeMetadata{ "critical_warning": { ID: "critical_warning", DisplayName: "Critical Warning", DisplayType: "", Ideal: "low", Critical: true, Description: "This field indicates critical warnings for the state of the controller. Each bit corresponds to a critical warning type; multiple bits may be set. If a bit is cleared to ‘0’, then that critical warning does not apply. Critical warnings may result in an asynchronous event notification to the host. Bits in this field represent the current associated state and are not persistent.", }, "temperature": { ID: "temperature", DisplayName: "Temperature", DisplayType: "", Ideal: "", Critical: false, Description: "", }, "available_spare": { ID: "available_spare", DisplayName: "Available Spare", DisplayType: "", Ideal: "high", Critical: true, Description: "Contains a normalized percentage (0 to 100%) of the remaining spare capacity available.", }, "percentage_used": { ID: "percentage_used", DisplayName: "Percentage Used", DisplayType: "", Ideal: "low", Critical: true, Description: "Contains a vendor specific estimate of the percentage of NVM subsystem life used based on the actual usage and the manufacturer’s prediction of NVM life. A value of 100 indicates that the estimated endurance of the NVM in the NVM subsystem has been consumed, but may not indicate an NVM subsystem failure. The value is allowed to exceed 100. Percentages greater than 254 shall be represented as 255. This value shall be updated once per power-on hour (when the controller is not in a sleep state).", }, "data_units_read": { ID: "data_units_read", DisplayName: "Data Units Read", DisplayType: "", Ideal: "", Critical: false, Description: "Contains the number of 512 byte data units the host has read from the controller; this value does not include metadata. This value is reported in thousands (i.e., a value of 1 corresponds to 1000 units of 512 bytes read) and is rounded up. When the LBA size is a value other than 512 bytes, the controller shall convert the amount of data read to 512 byte units.", }, "data_units_written": { ID: "data_units_written", DisplayName: "Data Units Written", DisplayType: "", Ideal: "", Critical: false, Description: "Contains the number of 512 byte data units the host has written to the controller; this value does not include metadata. This value is reported in thousands (i.e., a value of 1 corresponds to 1000 units of 512 bytes written) and is rounded up. When the LBA size is a value other than 512 bytes, the controller shall convert the amount of data written to 512 byte units.", }, "host_reads": { ID: "host_reads", DisplayName: "Host Reads", DisplayType: "", Ideal: "", Critical: false, Description: "Contains the number of read commands completed by the controller", }, "host_writes": { ID: "host_writes", DisplayName: "Host Writes", DisplayType: "", Ideal: "", Critical: false, Description: "Contains the number of write commands completed by the controller", }, "controller_busy_time": { ID: "controller_busy_time", DisplayName: "Controller Busy Time", DisplayType: "", Ideal: "", Critical: false, Description: "Contains the amount of time the controller is busy with I/O commands. The controller is busy when there is a command outstanding to an I/O Queue (specifically, a command was issued via an I/O Submission Queue Tail doorbell write and the corresponding completion queue entry has not been posted yet to the associated I/O Completion Queue). This value is reported in minutes.", }, "power_cycles": { ID: "power_cycles", DisplayName: "Power Cycles", DisplayType: "", Ideal: "", Critical: false, Description: "Contains the number of power cycles.", }, "power_on_hours": { ID: "power_on_hours", DisplayName: "Power on Hours", DisplayType: "", Ideal: "", Critical: false, Description: "Contains the number of power-on hours. Power on hours is always logging, even when in low power mode.", }, "unsafe_shutdowns": { ID: "unsafe_shutdowns", DisplayName: "Unsafe Shutdowns", DisplayType: "", Ideal: "", Critical: false, Description: "Contains the number of unsafe shutdowns. This count is incremented when a shutdown notification (CC.SHN) is not received prior to loss of power.", }, "media_errors": { ID: "media_errors", DisplayName: "Media Errors", DisplayType: "", Ideal: "low", Critical: true, Description: "Contains the number of occurrences where the controller detected an unrecovered data integrity error. Errors such as uncorrectable ECC, CRC checksum failure, or LBA tag mismatch are included in this field.", }, "num_err_log_entries": { ID: "num_err_log_entries", DisplayName: "Numb Err Log Entries", DisplayType: "", Ideal: "low", Critical: true, Description: "Contains the number of Error Information log entries over the life of the controller.", }, "warning_temp_time": { ID: "warning_temp_time", DisplayName: "Warning Temp Time", DisplayType: "", Ideal: "", Critical: false, Description: "Contains the amount of time in minutes that the controller is operational and the Composite Temperature is greater than or equal to the Warning Composite Temperature Threshold (WCTEMP) field and less than the Critical Composite Temperature Threshold (CCTEMP) field in the Identify Controller data structure.", }, "critical_comp_time": { ID: "critical_comp_time", DisplayName: "Critical CompTime", DisplayType: "", Ideal: "", Critical: false, Description: "Contains the amount of time in minutes that the controller is operational and the Composite Temperature is greater the Critical Composite Temperature Threshold (CCTEMP) field in the Identify Controller data structure.", }, } ================================================ FILE: webapp/backend/pkg/thresholds/scsi_attribute_metadata.go ================================================ package thresholds type ScsiAttributeMetadata struct { ID string `json:"-"` DisplayName string `json:"display_name"` Ideal string `json:"ideal"` Critical bool `json:"critical"` Description string `json:"description"` Transform func(int64, int64, string) int64 `json:"-"` //this should be a method to extract/tranform the normalized or raw data to a chartable format. Str TransformValueUnit string `json:"transform_value_unit,omitempty"` DisplayType string `json:"display_type"` //"raw" "normalized" or "transformed" } var ScsiMetadata = map[string]ScsiAttributeMetadata{ "scsi_grown_defect_list": { ID: "scsi_grown_defect_list", DisplayName: "Grown Defect List", DisplayType: "", Ideal: "low", Critical: true, Description: "The grown defect count shows the amount of swapped (defective) blocks since the drive was shipped by it's vendor. Each additional defective block increases the count by one.", }, "read_errors_corrected_by_eccfast": { ID: "read_errors_corrected_by_eccfast", DisplayName: "Read Errors Corrected by ECC Fast", DisplayType: "", Ideal: "", Critical: false, Description: "An error correction was applied to get perfect data (a.k.a. ECC on-the-fly). \"Without substantial delay\" means the correction did not postpone reading of later sectors (e.g. a revolution was not lost). The counter is incremented once for each logical block that requires correction. Two different blocks corrected during the same command are counted as two events.", }, "read_errors_corrected_by_eccdelayed": { ID: "read_errors_corrected_by_eccdelayed", DisplayName: "Read Errors Corrected by ECC Delayed", DisplayType: "", Ideal: "", Critical: false, Description: "An error code or algorithm (e.g. ECC, checksum) is applied in order to get perfect data with substantial delay. \"With possible delay\" means the correction took longer than a sector time so that reading/writing of subsequent sectors was delayed (e.g. a lost revolution). The counter is incremented once for each logical block that requires correction. A block with a double error that is correctable counts as one event and two different blocks corrected during the same command count as two events. ", }, "read_errors_corrected_by_rereads_rewrites": { ID: "read_errors_corrected_by_rereads_rewrites", DisplayName: "Read Errors Corrected by ReReads/ReWrites", DisplayType: "", Ideal: "low", Critical: true, Description: "This parameter code specifies the counter counting the number of errors that are corrected by applying retries. This counts errors recovered, not the number of retries. If five retries were required to recover one block of data, the counter increments by one, not five. The counter is incremented once for each logical block that is recovered using retries. If an error is not recoverable while applying retries and is recovered by ECC, it isn't counted by this counter; it will be counted by the counter specified by parameter code 01h - Errors Corrected With Possible Delays. ", }, "read_total_errors_corrected": { ID: "read_total_errors_corrected", DisplayName: "Read Total Errors Corrected", DisplayType: "", Ideal: "", Critical: false, Description: "This counter counts the total of parameter code errors 00h, 01h and 02h (i.e. error corrected by ECC: fast and delayed plus errors corrected by rereads and rewrites). There is no \"double counting\" of data errors among these three counters. The sum of all correctable errors can be reached by adding parameter code 01h and 02h errors, not by using this total.", }, "read_correction_algorithm_invocations": { ID: "read_correction_algorithm_invocations", DisplayName: "Read Correction Algorithm Invocations", DisplayType: "", Ideal: "", Critical: false, Description: "This parameter code specifies the counter that counts the total number of retries, or \"times the retry algorithm is invoked\". If after five attempts a counter 02h type error is recovered, then five is added to this counter. If three retries are required to get stable ECC syndrome before a counter 01h type error is corrected, then those three retries are also counted here. The number of retries applied to unsuccessfully recover an error (counter 06h type error) are also counted by this counter. ", }, "read_total_uncorrected_errors": { ID: "read_total_uncorrected_errors", DisplayName: "Read Total Uncorrected Errors", DisplayType: "", Ideal: "low", Critical: true, Description: "This parameter code specifies the counter that contains the total number of blocks for which an uncorrected data error has occurred. ", }, "write_errors_corrected_by_eccfast": { ID: "write_errors_corrected_by_eccfast", DisplayName: "Write Errors Corrected by ECC Fast", DisplayType: "", Ideal: "", Critical: false, Description: "An error correction was applied to get perfect data (a.k.a. ECC on-the-fly). \"Without substantial delay\" means the correction did not postpone reading of later sectors (e.g. a revolution was not lost). The counter is incremented once for each logical block that requires correction. Two different blocks corrected during the same command are counted as two events. ", }, "write_errors_corrected_by_eccdelayed": { ID: "write_errors_corrected_by_eccdelayed", DisplayName: "Write Errors Corrected by ECC Delayed", DisplayType: "", Ideal: "", Critical: false, Description: "An error code or algorithm (e.g. ECC, checksum) is applied in order to get perfect data with substantial delay. \"With possible delay\" means the correction took longer than a sector time so that reading/writing of subsequent sectors was delayed (e.g. a lost revolution). The counter is incremented once for each logical block that requires correction. A block with a double error that is correctable counts as one event and two different blocks corrected during the same command count as two events. ", }, "write_errors_corrected_by_rereads_rewrites": { ID: "write_errors_corrected_by_rereads_rewrites", DisplayName: "Write Errors Corrected by ReReads/ReWrites", DisplayType: "", Ideal: "low", Critical: true, Description: "This parameter code specifies the counter counting the number of errors that are corrected by applying retries. This counts errors recovered, not the number of retries. If five retries were required to recover one block of data, the counter increments by one, not five. The counter is incremented once for each logical block that is recovered using retries. If an error is not recoverable while applying retries and is recovered by ECC, it isn't counted by this counter; it will be counted by the counter specified by parameter code 01h - Errors Corrected With Possible Delays.", }, "write_total_errors_corrected": { ID: "write_total_errors_corrected", DisplayName: "Write Total Errors Corrected", DisplayType: "", Ideal: "", Critical: false, Description: "This counter counts the total of parameter code errors 00h, 01h and 02h (i.e. error corrected by ECC: fast and delayed plus errors corrected by rereads and rewrites). There is no \"double counting\" of data errors among these three counters. The sum of all correctable errors can be reached by adding parameter code 01h and 02h errors, not by using this total.", }, "write_correction_algorithm_invocations": { ID: "write_correction_algorithm_invocations", DisplayName: "Write Correction Algorithm Invocations", DisplayType: "", Ideal: "", Critical: false, Description: "This parameter code specifies the counter that counts the total number of retries, or \"times the retry algorithm is invoked\". If after five attempts a counter 02h type error is recovered, then five is added to this counter. If three retries are required to get stable ECC syndrome before a counter 01h type error is corrected, then those three retries are also counted here. The number of retries applied to unsuccessfully recover an error (counter 06h type error) are also counted by this counter. ", }, "write_total_uncorrected_errors": { ID: "write_total_uncorrected_errors", DisplayName: "Write Total Uncorrected Errors", DisplayType: "", Ideal: "low", Critical: true, Description: " This parameter code specifies the counter that contains the total number of blocks for which an uncorrected data error has occurred.", }, } ================================================ FILE: webapp/backend/pkg/version/version.go ================================================ package version // VERSION is the app-global version string, which will be replaced with a // new value during packaging const VERSION = "0.8.6" ================================================ FILE: webapp/backend/pkg/web/handler/archive_device.go ================================================ package handler import ( "github.com/analogj/scrutiny/webapp/backend/pkg/database" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "net/http" ) func ArchiveDevice(c *gin.Context) { logger := c.MustGet("LOGGER").(*logrus.Entry) deviceRepo := c.MustGet("DEVICE_REPOSITORY").(database.DeviceRepo) err := deviceRepo.UpdateDeviceArchived(c, c.Param("wwn"), true) if err != nil { logger.Errorln("An error occurred while archiving device", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } c.JSON(http.StatusOK, gin.H{"success": true}) } ================================================ FILE: webapp/backend/pkg/web/handler/delete_device.go ================================================ package handler import ( "github.com/analogj/scrutiny/webapp/backend/pkg/database" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "net/http" ) func DeleteDevice(c *gin.Context) { logger := c.MustGet("LOGGER").(*logrus.Entry) deviceRepo := c.MustGet("DEVICE_REPOSITORY").(database.DeviceRepo) err := deviceRepo.DeleteDevice(c, c.Param("wwn")) if err != nil { logger.Errorln("An error occurred while deleting device", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } c.JSON(http.StatusOK, gin.H{"success": true}) } ================================================ FILE: webapp/backend/pkg/web/handler/get_device_details.go ================================================ package handler import ( "net/http" "github.com/analogj/scrutiny/webapp/backend/pkg/database" "github.com/analogj/scrutiny/webapp/backend/pkg/thresholds" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" ) func GetDeviceDetails(c *gin.Context) { logger := c.MustGet("LOGGER").(*logrus.Entry) deviceRepo := c.MustGet("DEVICE_REPOSITORY").(database.DeviceRepo) device, err := deviceRepo.GetDeviceDetails(c, c.Param("wwn")) if err != nil { logger.Errorln("An error occurred while retrieving device details", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } durationKey, exists := c.GetQuery("duration_key") if !exists { durationKey = "forever" } smartResults, err := deviceRepo.GetSmartAttributeHistory(c, c.Param("wwn"), durationKey, 0, 0, nil) if err != nil { logger.Errorln("An error occurred while retrieving device smart results", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } var deviceMetadata interface{} if device.IsAta() { deviceMetadata = thresholds.AtaMetadata } else if device.IsNvme() { deviceMetadata = thresholds.NmveMetadata } else if device.IsScsi() { deviceMetadata = thresholds.ScsiMetadata } c.JSON(http.StatusOK, gin.H{"success": true, "data": map[string]interface{}{"device": device, "smart_results": smartResults}, "metadata": deviceMetadata}) } ================================================ FILE: webapp/backend/pkg/web/handler/get_devices_summary.go ================================================ package handler import ( "github.com/analogj/scrutiny/webapp/backend/pkg/database" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "net/http" ) func GetDevicesSummary(c *gin.Context) { logger := c.MustGet("LOGGER").(*logrus.Entry) deviceRepo := c.MustGet("DEVICE_REPOSITORY").(database.DeviceRepo) summary, err := deviceRepo.GetSummary(c) if err != nil { logger.Errorln("An error occurred while retrieving device summary", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } //this must match DeviceSummaryWrapper (webapp/backend/pkg/models/device_summary.go) c.JSON(http.StatusOK, gin.H{ "success": true, "data": map[string]interface{}{ "summary": summary, //"temperature": tem }, }) } ================================================ FILE: webapp/backend/pkg/web/handler/get_devices_summary_temp_history.go ================================================ package handler import ( "github.com/analogj/scrutiny/webapp/backend/pkg/database" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "net/http" ) func GetDevicesSummaryTempHistory(c *gin.Context) { logger := c.MustGet("LOGGER").(*logrus.Entry) deviceRepo := c.MustGet("DEVICE_REPOSITORY").(database.DeviceRepo) durationKey, exists := c.GetQuery("duration_key") if !exists { durationKey = "week" } tempHistory, err := deviceRepo.GetSmartTemperatureHistory(c, durationKey) if err != nil { logger.Errorln("An error occurred while retrieving summary/temp history", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } c.JSON(http.StatusOK, gin.H{ "success": true, "data": map[string]interface{}{ "temp_history": tempHistory, }, }) } ================================================ FILE: webapp/backend/pkg/web/handler/get_settings.go ================================================ package handler import ( "github.com/analogj/scrutiny/webapp/backend/pkg/database" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "net/http" ) func GetSettings(c *gin.Context) { logger := c.MustGet("LOGGER").(*logrus.Entry) deviceRepo := c.MustGet("DEVICE_REPOSITORY").(database.DeviceRepo) settings, err := deviceRepo.LoadSettings(c) if err != nil { logger.Errorln("An error occurred while retrieving settings", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } c.JSON(http.StatusOK, gin.H{ "success": true, "settings": settings, }) } ================================================ FILE: webapp/backend/pkg/web/handler/health_check.go ================================================ package handler import ( "github.com/analogj/scrutiny/webapp/backend/pkg/database" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "net/http" ) func HealthCheck(c *gin.Context) { logger := c.MustGet("LOGGER").(*logrus.Entry) deviceRepo := c.MustGet("DEVICE_REPOSITORY").(database.DeviceRepo) logger.Infof("Checking Influxdb & Sqlite health") //check sqlite and influxdb health err := deviceRepo.HealthCheck(c) if err != nil { logger.Errorln("An error occurred during healthcheck", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()}) return } //TODO: // check if the /web folder is populated. c.JSON(http.StatusOK, gin.H{ "success": true, }) } ================================================ FILE: webapp/backend/pkg/web/handler/register_devices.go ================================================ package handler import ( "github.com/analogj/scrutiny/webapp/backend/pkg/database" "github.com/analogj/scrutiny/webapp/backend/pkg/models" "github.com/gin-gonic/gin" "github.com/samber/lo" "github.com/sirupsen/logrus" "net/http" ) // register devices that are detected by various collectors. // This function is run everytime a collector is about to start a run. It can be used to update device metadata. func RegisterDevices(c *gin.Context) { deviceRepo := c.MustGet("DEVICE_REPOSITORY").(database.DeviceRepo) logger := c.MustGet("LOGGER").(*logrus.Entry) var collectorDeviceWrapper models.DeviceWrapper err := c.BindJSON(&collectorDeviceWrapper) if err != nil { logger.Errorln("Cannot parse detected devices", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } //filter any device with empty wwn (they are invalid) detectedStorageDevices := lo.Filter[models.Device](collectorDeviceWrapper.Data, func(dev models.Device, _ int) bool { return len(dev.WWN) > 0 }) errs := []error{} for _, dev := range detectedStorageDevices { //insert devices into DB (and update specified columns if device is already registered) // update device fields that may change: (DeviceType, HostID) if err := deviceRepo.RegisterDevice(c, dev); err != nil { errs = append(errs, err) } } if len(errs) > 0 { logger.Errorln("An error occurred while registering devices", errs) c.JSON(http.StatusInternalServerError, gin.H{ "success": false, }) return } else { c.JSON(http.StatusOK, models.DeviceWrapper{ Success: true, Data: detectedStorageDevices, }) return } } ================================================ FILE: webapp/backend/pkg/web/handler/save_settings.go ================================================ package handler import ( "github.com/analogj/scrutiny/webapp/backend/pkg/database" "github.com/analogj/scrutiny/webapp/backend/pkg/models" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "net/http" ) func SaveSettings(c *gin.Context) { logger := c.MustGet("LOGGER").(*logrus.Entry) deviceRepo := c.MustGet("DEVICE_REPOSITORY").(database.DeviceRepo) var settings models.Settings err := c.BindJSON(&settings) if err != nil { logger.Errorln("Cannot parse updated settings", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } err = deviceRepo.SaveSettings(c, settings) if err != nil { logger.Errorln("An error occurred while saving settings", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } c.JSON(http.StatusOK, gin.H{ "success": true, "settings": settings, }) } ================================================ FILE: webapp/backend/pkg/web/handler/send_test_notification.go ================================================ package handler import ( "github.com/analogj/scrutiny/webapp/backend/pkg" "github.com/analogj/scrutiny/webapp/backend/pkg/config" "github.com/analogj/scrutiny/webapp/backend/pkg/models" "github.com/analogj/scrutiny/webapp/backend/pkg/notify" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "net/http" ) // Send test notification func SendTestNotification(c *gin.Context) { appConfig := c.MustGet("CONFIG").(config.Interface) logger := c.MustGet("LOGGER").(*logrus.Entry) testNotify := notify.New( logger, appConfig, models.Device{ SerialNumber: "FAKEWDDJ324KSO", DeviceType: pkg.DeviceProtocolAta, DeviceName: "/dev/sda", }, true, ) err := testNotify.Send() if err != nil { logger.Errorln("An error occurred while sending test notification", err) c.JSON(http.StatusInternalServerError, gin.H{ "success": false, "errors": []string{err.Error()}, }) } else { c.JSON(http.StatusOK, models.DeviceWrapper{ Success: true, }) } } ================================================ FILE: webapp/backend/pkg/web/handler/unarchive_device.go ================================================ package handler import ( "github.com/analogj/scrutiny/webapp/backend/pkg/database" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "net/http" ) func UnarchiveDevice(c *gin.Context) { logger := c.MustGet("LOGGER").(*logrus.Entry) deviceRepo := c.MustGet("DEVICE_REPOSITORY").(database.DeviceRepo) err := deviceRepo.UpdateDeviceArchived(c, c.Param("wwn"), false) if err != nil { logger.Errorln("An error occurred while unarchiving device", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } c.JSON(http.StatusOK, gin.H{"success": true}) } ================================================ FILE: webapp/backend/pkg/web/handler/upload_device_metrics.go ================================================ package handler import ( "fmt" "net/http" "github.com/analogj/scrutiny/webapp/backend/pkg" "github.com/analogj/scrutiny/webapp/backend/pkg/config" "github.com/analogj/scrutiny/webapp/backend/pkg/database" "github.com/analogj/scrutiny/webapp/backend/pkg/models/collector" "github.com/analogj/scrutiny/webapp/backend/pkg/notify" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" ) func UploadDeviceMetrics(c *gin.Context) { //db := c.MustGet("DB").(*gorm.DB) logger := c.MustGet("LOGGER").(*logrus.Entry) appConfig := c.MustGet("CONFIG").(config.Interface) //influxWriteDb := c.MustGet("INFLUXDB_WRITE").(*api.WriteAPIBlocking) deviceRepo := c.MustGet("DEVICE_REPOSITORY").(database.DeviceRepo) //appConfig := c.MustGet("CONFIG").(config.Interface) if c.Param("wwn") == "" { c.JSON(http.StatusBadRequest, gin.H{"success": false}) } var collectorSmartData collector.SmartInfo err := c.BindJSON(&collectorSmartData) if err != nil { logger.Errorln("Cannot parse SMART data", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } //update the device information if necessary updatedDevice, err := deviceRepo.UpdateDevice(c, c.Param("wwn"), collectorSmartData) if err != nil { logger.Errorln("An error occurred while updating device data from smartctl metrics:", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } // insert smart info smartData, err := deviceRepo.SaveSmartAttributes(c, c.Param("wwn"), collectorSmartData) if err != nil { logger.Errorln("An error occurred while saving smartctl metrics", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } if smartData.Status != pkg.DeviceStatusPassed { //there is a failure detected by Scrutiny, update the device status on the homepage. updatedDevice, err = deviceRepo.UpdateDeviceStatus(c, c.Param("wwn"), smartData.Status) if err != nil { logger.Errorln("An error occurred while updating device status", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } } // save smart temperature data (ignore failures) err = deviceRepo.SaveSmartTemperature(c, c.Param("wwn"), updatedDevice.DeviceProtocol, collectorSmartData, appConfig.GetBool(fmt.Sprintf("%s.collector.discard_sct_temp_history", config.DB_USER_SETTINGS_SUBKEY))) if err != nil { logger.Errorln("An error occurred while saving smartctl temp data", err) c.JSON(http.StatusInternalServerError, gin.H{"success": false}) return } //check for error if notify.ShouldNotify( logger, updatedDevice, smartData, pkg.MetricsStatusThreshold(appConfig.GetInt(fmt.Sprintf("%s.metrics.status_threshold", config.DB_USER_SETTINGS_SUBKEY))), pkg.MetricsStatusFilterAttributes(appConfig.GetInt(fmt.Sprintf("%s.metrics.status_filter_attributes", config.DB_USER_SETTINGS_SUBKEY))), appConfig.GetBool(fmt.Sprintf("%s.metrics.repeat_notifications", config.DB_USER_SETTINGS_SUBKEY)), c, deviceRepo, ) { //send notifications liveNotify := notify.New( logger, appConfig, updatedDevice, false, ) _ = liveNotify.Send() //we ignore error message when sending notifications. } c.JSON(http.StatusOK, gin.H{"success": true}) } ================================================ FILE: webapp/backend/pkg/web/handler/upload_device_self_tests.go ================================================ package handler import "github.com/gin-gonic/gin" func UploadDeviceSelfTests(c *gin.Context) { } ================================================ FILE: webapp/backend/pkg/web/middleware/config.go ================================================ package middleware import ( "github.com/analogj/scrutiny/webapp/backend/pkg/config" "github.com/gin-gonic/gin" ) func ConfigMiddleware(appConfig config.Interface) gin.HandlerFunc { return func(c *gin.Context) { c.Set("CONFIG", appConfig) c.Next() } } ================================================ FILE: webapp/backend/pkg/web/middleware/logger.go ================================================ package middleware import ( "bytes" "fmt" "io" "math" "net/http" "os" "strings" "time" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" ) // Middleware based on https://github.com/toorop/gin-logrus/blob/master/logger.go // Body recording based on // - https://github.com/gin-gonic/gin/issues/1363 // - https://stackoverflow.com/questions/38501325/how-to-log-response-body-in-gin // 2016-09-27 09:38:21.541541811 +0200 CEST // 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] // "GET /apache_pb.gif HTTP/1.0" 200 2326 // "http://www.example.com/start.html" // "Mozilla/4.08 [en] (Win98; I ;Nav)" var timeFormat = "02/Jan/2006:15:04:05 -0700" // Logger is the logrus logger handler func LoggerMiddleware(logger *logrus.Entry) gin.HandlerFunc { hostname, err := os.Hostname() if err != nil { hostname = "unknown" } return func(c *gin.Context) { //clone the request body reader. var reqBody string if c.Request.Body != nil { buf, _ := io.ReadAll(c.Request.Body) reqBodyReader1 := io.NopCloser(bytes.NewBuffer(buf)) reqBodyReader2 := io.NopCloser(bytes.NewBuffer(buf)) //We have to create a new Buffer, because reqBodyReader1 will be read. c.Request.Body = reqBodyReader2 reqBody = readBody(reqBodyReader1) } // other handler can change c.Path so: path := c.Request.URL.Path blw := &responseBodyLogWriter{body: &bytes.Buffer{}, ResponseWriter: c.Writer} c.Writer = blw c.Set("LOGGER", logger) start := time.Now() c.Next() stop := time.Since(start) latency := int(math.Ceil(float64(stop.Nanoseconds()) / 1000000.0)) statusCode := c.Writer.Status() clientIP := c.ClientIP() clientUserAgent := c.Request.UserAgent() referer := c.Request.Referer() respLength := c.Writer.Size() if respLength < 0 { respLength = 0 } entry := logger.WithFields(logrus.Fields{ "hostname": hostname, "statusCode": statusCode, "latency": latency, // time to process "clientIP": clientIP, "method": c.Request.Method, "path": path, "referer": referer, "respLength": respLength, "userAgent": clientUserAgent, }) if len(c.Errors) > 0 { entry.Error(c.Errors.ByType(gin.ErrorTypePrivate).String()) } else { msg := fmt.Sprintf("%s - %s [%s] \"%s %s\" %d %d \"%s\" \"%s\" (%dms)", clientIP, hostname, time.Now().Format(timeFormat), c.Request.Method, path, statusCode, respLength, referer, clientUserAgent, latency) if statusCode >= http.StatusInternalServerError { entry.Error(msg) } else if statusCode >= http.StatusBadRequest { entry.Warn(msg) } else { entry.Info(msg) } } if strings.Contains(path, "/api/") { //only debug log request/response from api endpoint. if len(reqBody) > 0 { entry.WithField("bodyType", "request").Debugln(reqBody) // Print request body } entry.WithField("bodyType", "response").Debugln(blw.body.String()) } } } // Response Logging type responseBodyLogWriter struct { gin.ResponseWriter body *bytes.Buffer } func (w responseBodyLogWriter) Write(b []byte) (int, error) { w.body.Write(b) return w.ResponseWriter.Write(b) } // Request Logging func readBody(reader io.Reader) string { buf := new(bytes.Buffer) buf.ReadFrom(reader) s := buf.String() return s } ================================================ FILE: webapp/backend/pkg/web/middleware/repository.go ================================================ package middleware import ( "context" "github.com/analogj/scrutiny/webapp/backend/pkg/config" "github.com/analogj/scrutiny/webapp/backend/pkg/database" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" ) func RepositoryMiddleware(appConfig config.Interface, globalLogger logrus.FieldLogger) gin.HandlerFunc { deviceRepo, err := database.NewScrutinyRepository(appConfig, globalLogger) if err != nil { panic(err) } // ensure the settings have been loaded into the app config during startup. _, err = deviceRepo.LoadSettings(context.Background()) if err != nil { panic(err) } //settings.UpdateSettingEntries() //TODO: determine where we can call defer deviceRepo.Close() return func(c *gin.Context) { c.Set("DEVICE_REPOSITORY", deviceRepo) c.Next() } } ================================================ FILE: webapp/backend/pkg/web/server.go ================================================ package web import ( "fmt" "github.com/analogj/go-util/utils" "github.com/analogj/scrutiny/webapp/backend/pkg/config" "github.com/analogj/scrutiny/webapp/backend/pkg/errors" "github.com/analogj/scrutiny/webapp/backend/pkg/web/handler" "github.com/analogj/scrutiny/webapp/backend/pkg/web/middleware" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "net/http" "path/filepath" "strings" ) type AppEngine struct { Config config.Interface Logger *logrus.Entry } func (ae *AppEngine) Setup(logger *logrus.Entry) *gin.Engine { r := gin.New() r.Use(middleware.LoggerMiddleware(logger)) r.Use(middleware.RepositoryMiddleware(ae.Config, logger)) r.Use(middleware.ConfigMiddleware(ae.Config)) r.Use(gin.Recovery()) basePath := ae.Config.GetString("web.listen.basepath") logger.Debugf("basepath: %s", basePath) base := r.Group(basePath) { api := base.Group("/api") { api.GET("/health", handler.HealthCheck) api.POST("/health/notify", handler.SendTestNotification) //check if notifications are configured correctly api.POST("/devices/register", handler.RegisterDevices) //used by Collector to register new devices and retrieve filtered list api.GET("/summary", handler.GetDevicesSummary) //used by Dashboard api.GET("/summary/temp", handler.GetDevicesSummaryTempHistory) //used by Dashboard (Temperature history dropdown) api.POST("/device/:wwn/smart", handler.UploadDeviceMetrics) //used by Collector to upload data api.POST("/device/:wwn/selftest", handler.UploadDeviceSelfTests) api.GET("/device/:wwn/details", handler.GetDeviceDetails) //used by Details api.POST("/device/:wwn/archive", handler.ArchiveDevice) //used by UI to archive device api.POST("/device/:wwn/unarchive", handler.UnarchiveDevice) //used by UI to unarchive device api.DELETE("/device/:wwn", handler.DeleteDevice) //used by UI to delete device api.GET("/settings", handler.GetSettings) //used to get settings api.POST("/settings", handler.SaveSettings) //used to save settings } } //Static request routing base.StaticFS("/web", http.Dir(ae.Config.GetString("web.src.frontend.path"))) //redirect base url to /web base.GET("/", func(c *gin.Context) { c.Redirect(http.StatusFound, basePath+"/web") }) //catch-all, serve index page. r.NoRoute(func(c *gin.Context) { c.File(fmt.Sprintf("%s/index.html", ae.Config.GetString("web.src.frontend.path"))) }) return r } func (ae *AppEngine) Start() error { //set the gin mode gin.SetMode(gin.ReleaseMode) if strings.ToLower(ae.Config.GetString("log.level")) == "debug" { gin.SetMode(gin.DebugMode) } //check if the database parent directory exists, fail here rather than in a handler. if !utils.FileExists(filepath.Dir(ae.Config.GetString("web.database.location"))) { return errors.ConfigValidationError(fmt.Sprintf( "Database parent directory does not exist. Please check path (%s)", filepath.Dir(ae.Config.GetString("web.database.location")))) } r := ae.Setup(ae.Logger) return r.Run(fmt.Sprintf("%s:%s", ae.Config.GetString("web.listen.host"), ae.Config.GetString("web.listen.port"))) } ================================================ FILE: webapp/backend/pkg/web/server_test.go ================================================ package web_test import ( "bytes" "encoding/json" "fmt" "io" "net/http" "net/http/httptest" "os" "path" "strings" "testing" "time" "github.com/analogj/scrutiny/webapp/backend/pkg" "github.com/analogj/scrutiny/webapp/backend/pkg/config" mock_config "github.com/analogj/scrutiny/webapp/backend/pkg/config/mock" "github.com/analogj/scrutiny/webapp/backend/pkg/models" "github.com/analogj/scrutiny/webapp/backend/pkg/models/collector" "github.com/analogj/scrutiny/webapp/backend/pkg/web" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" "go.uber.org/mock/gomock" ) /* All tests in this file require the existance of a influxDB listening on port 8086 docker run --rm -it -p 8086:8086 \ -e DOCKER_INFLUXDB_INIT_MODE=setup \ -e DOCKER_INFLUXDB_INIT_USERNAME=admin \ -e DOCKER_INFLUXDB_INIT_PASSWORD=password12345 \ -e DOCKER_INFLUXDB_INIT_ORG=scrutiny \ -e DOCKER_INFLUXDB_INIT_BUCKET=metrics \ -e DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my-super-secret-auth-token \ influxdb:2.0 */ //func TestMain(m *testing.M) { // setup() // code := m.Run() // shutdown() // os.Exit(code) //} // InfluxDB will throw an error/ignore any submitted data with a timestamp older than the // retention period. Lets fix this by opening test files, modifying the timestamp and returning an io.Reader func helperReadSmartDataFileFixTimestamp(t *testing.T, smartDataFilepath string) io.Reader { metricsfile, err := os.Open(smartDataFilepath) require.NoError(t, err) metricsFileData, err := io.ReadAll(metricsfile) require.NoError(t, err) //unmarshal because we need to change the timestamp var smartData collector.SmartInfo err = json.Unmarshal(metricsFileData, &smartData) require.NoError(t, err) smartData.LocalTime.TimeT = time.Now().Unix() updatedSmartDataBytes, err := json.Marshal(smartData) return bytes.NewReader(updatedSmartDataBytes) } // Define the suite, and absorb the built-in basic suite // functionality from testify - including a T() method which // returns the current testing context type ServerTestSuite struct { suite.Suite Basepath string } func TestServerTestSuite_WithEmptyBasePath(t *testing.T) { emptyBasePathSuite := new(ServerTestSuite) emptyBasePathSuite.Basepath = "" suite.Run(t, emptyBasePathSuite) } func TestServerTestSuite_WithCustomBasePath(t *testing.T) { emptyBasePathSuite := new(ServerTestSuite) emptyBasePathSuite.Basepath = "/basepath" suite.Run(t, emptyBasePathSuite) } func (suite *ServerTestSuite) TestHealthRoute() { //setup parentPath, _ := os.MkdirTemp("", "") defer os.RemoveAll(parentPath) mockCtrl := gomock.NewController(suite.T()) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().SetDefault(gomock.Any(), gomock.Any()).AnyTimes() fakeConfig.EXPECT().UnmarshalKey(gomock.Any(), gomock.Any()).AnyTimes().Return(nil) fakeConfig.EXPECT().GetString("web.database.location").Return(path.Join(parentPath, "scrutiny_test.db")).AnyTimes() fakeConfig.EXPECT().GetString("web.src.frontend.path").Return(parentPath).AnyTimes() fakeConfig.EXPECT().GetString("web.listen.basepath").Return(suite.Basepath).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.scheme").Return("http").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.port").Return("8086").AnyTimes() fakeConfig.EXPECT().IsSet("web.influxdb.token").Return(true).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.token").Return("my-super-secret-auth-token").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.tls.insecure_skip_verify").Return(false).AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.retention_policy").Return(false).AnyTimes() if _, isGithubActions := os.LookupEnv("GITHUB_ACTIONS"); isGithubActions { // when running test suite in github actions, we run an influxdb service as a sidecar. fakeConfig.EXPECT().GetString("web.influxdb.host").Return("influxdb").AnyTimes() } else { fakeConfig.EXPECT().GetString("web.influxdb.host").Return("localhost").AnyTimes() } ae := web.AppEngine{ Config: fakeConfig, } router := ae.Setup(logrus.WithField("test", suite.T().Name())) //test w := httptest.NewRecorder() req, _ := http.NewRequest("GET", suite.Basepath+"/api/health", nil) router.ServeHTTP(w, req) //assert require.Equal(suite.T(), 200, w.Code) require.Equal(suite.T(), "{\"success\":true}", w.Body.String()) } func (suite *ServerTestSuite) TestRegisterDevicesRoute() { //setup parentPath, _ := os.MkdirTemp("", "") defer os.RemoveAll(parentPath) mockCtrl := gomock.NewController(suite.T()) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().SetDefault(gomock.Any(), gomock.Any()).AnyTimes() fakeConfig.EXPECT().UnmarshalKey(gomock.Any(), gomock.Any()).AnyTimes().Return(nil) fakeConfig.EXPECT().GetString("web.database.location").Return(path.Join(parentPath, "scrutiny_test.db")).AnyTimes() fakeConfig.EXPECT().GetString("web.src.frontend.path").Return(parentPath).AnyTimes() fakeConfig.EXPECT().GetString("web.listen.basepath").Return(suite.Basepath).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.scheme").Return("http").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.port").Return("8086").AnyTimes() fakeConfig.EXPECT().IsSet("web.influxdb.token").Return(true).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.token").Return("my-super-secret-auth-token").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.tls.insecure_skip_verify").Return(false).AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.retention_policy").Return(false).AnyTimes() if _, isGithubActions := os.LookupEnv("GITHUB_ACTIONS"); isGithubActions { // when running test suite in github actions, we run an influxdb service as a sidecar. fakeConfig.EXPECT().GetString("web.influxdb.host").Return("influxdb").AnyTimes() } else { fakeConfig.EXPECT().GetString("web.influxdb.host").Return("localhost").AnyTimes() } ae := web.AppEngine{ Config: fakeConfig, } router := ae.Setup(logrus.WithField("test", suite.T().Name())) file, err := os.Open("testdata/register-devices-req.json") require.NoError(suite.T(), err) //test w := httptest.NewRecorder() req, _ := http.NewRequest("POST", suite.Basepath+"/api/devices/register", file) router.ServeHTTP(w, req) //assert require.Equal(suite.T(), 200, w.Code) } func (suite *ServerTestSuite) TestUploadDeviceMetricsRoute() { //setup parentPath, _ := os.MkdirTemp("", "") defer os.RemoveAll(parentPath) mockCtrl := gomock.NewController(suite.T()) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().SetDefault(gomock.Any(), gomock.Any()).AnyTimes() fakeConfig.EXPECT().UnmarshalKey(gomock.Any(), gomock.Any()).AnyTimes().Return(nil) fakeConfig.EXPECT().GetString("web.database.location").AnyTimes().Return(path.Join(parentPath, "scrutiny_test.db")) fakeConfig.EXPECT().GetString("web.src.frontend.path").AnyTimes().Return(parentPath) fakeConfig.EXPECT().GetString("web.listen.basepath").Return(suite.Basepath).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.scheme").Return("http").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.port").Return("8086").AnyTimes() fakeConfig.EXPECT().IsSet("web.influxdb.token").Return(true).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.token").Return("my-super-secret-auth-token").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetBool("user.metrics.repeat_notifications").Return(true).AnyTimes() fakeConfig.EXPECT().GetBool("user.collector.discard_sct_temp_history").Return(false).AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.tls.insecure_skip_verify").Return(false).AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.retention_policy").Return(false).AnyTimes() if _, isGithubActions := os.LookupEnv("GITHUB_ACTIONS"); isGithubActions { // when running test suite in github actions, we run an influxdb service as a sidecar. fakeConfig.EXPECT().GetString("web.influxdb.host").Return("influxdb").AnyTimes() } else { fakeConfig.EXPECT().GetString("web.influxdb.host").Return("localhost").AnyTimes() } fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.notify_level", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsNotifyLevelFail)) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.status_filter_attributes", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsStatusFilterAttributesAll)) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.status_threshold", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsStatusThresholdBoth)) ae := web.AppEngine{ Config: fakeConfig, } router := ae.Setup(logrus.WithField("test", suite.T().Name())) devicesfile, err := os.Open("testdata/register-devices-single-req.json") require.NoError(suite.T(), err) metricsfile := helperReadSmartDataFileFixTimestamp(suite.T(), "testdata/upload-device-metrics-req.json") //test wr := httptest.NewRecorder() req, _ := http.NewRequest("POST", suite.Basepath+"/api/devices/register", devicesfile) router.ServeHTTP(wr, req) require.Equal(suite.T(), 200, wr.Code) mr := httptest.NewRecorder() req, _ = http.NewRequest("POST", suite.Basepath+"/api/device/0x5000cca264eb01d7/smart", metricsfile) router.ServeHTTP(mr, req) require.Equal(suite.T(), 200, mr.Code) //assert } func (suite *ServerTestSuite) TestPopulateMultiple() { //setup parentPath, _ := os.MkdirTemp("", "") defer os.RemoveAll(parentPath) mockCtrl := gomock.NewController(suite.T()) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().SetDefault(gomock.Any(), gomock.Any()).AnyTimes() fakeConfig.EXPECT().UnmarshalKey(gomock.Any(), gomock.Any()).AnyTimes().Return(nil) //fakeConfig.EXPECT().GetString("web.database.location").AnyTimes().Return("testdata/scrutiny_test.db") fakeConfig.EXPECT().GetStringSlice("notify.urls").Return([]string{}).AnyTimes() fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.notify_level", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsNotifyLevelFail)) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.status_filter_attributes", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsStatusFilterAttributesAll)) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.status_threshold", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsStatusThresholdBoth)) fakeConfig.EXPECT().GetString("web.database.location").AnyTimes().Return(path.Join(parentPath, "scrutiny_test.db")) fakeConfig.EXPECT().GetString("web.src.frontend.path").AnyTimes().Return(parentPath) fakeConfig.EXPECT().GetString("web.listen.basepath").Return(suite.Basepath).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.scheme").Return("http").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.port").Return("8086").AnyTimes() fakeConfig.EXPECT().IsSet("web.influxdb.token").Return(true).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.token").Return("my-super-secret-auth-token").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetBool("user.metrics.repeat_notifications").Return(true).AnyTimes() fakeConfig.EXPECT().GetBool("user.collector.discard_sct_temp_history").Return(false).AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.tls.insecure_skip_verify").Return(false).AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.retention_policy").Return(false).AnyTimes() if _, isGithubActions := os.LookupEnv("GITHUB_ACTIONS"); isGithubActions { // when running test suite in github actions, we run an influxdb service as a sidecar. fakeConfig.EXPECT().GetString("web.influxdb.host").Return("influxdb").AnyTimes() } else { fakeConfig.EXPECT().GetString("web.influxdb.host").Return("localhost").AnyTimes() } ae := web.AppEngine{ Config: fakeConfig, } router := ae.Setup(logrus.WithField("test", suite.T().Name())) devicesfile, err := os.Open("testdata/register-devices-req.json") require.NoError(suite.T(), err) metricsfile := helperReadSmartDataFileFixTimestamp(suite.T(), "../models/testdata/smart-ata.json") failfile := helperReadSmartDataFileFixTimestamp(suite.T(), "../models/testdata/smart-fail2.json") nvmefile := helperReadSmartDataFileFixTimestamp(suite.T(), "../models/testdata/smart-nvme.json") scsifile := helperReadSmartDataFileFixTimestamp(suite.T(), "../models/testdata/smart-scsi.json") scsi2file := helperReadSmartDataFileFixTimestamp(suite.T(), "../models/testdata/smart-scsi2.json") //test wr := httptest.NewRecorder() req, _ := http.NewRequest("POST", suite.Basepath+"/api/devices/register", devicesfile) router.ServeHTTP(wr, req) require.Equal(suite.T(), 200, wr.Code) mr := httptest.NewRecorder() req, _ = http.NewRequest("POST", suite.Basepath+"/api/device/0x5000cca264eb01d7/smart", metricsfile) router.ServeHTTP(mr, req) require.Equal(suite.T(), 200, mr.Code) fr := httptest.NewRecorder() req, _ = http.NewRequest("POST", suite.Basepath+"/api/device/0x5000cca264ec3183/smart", failfile) router.ServeHTTP(fr, req) require.Equal(suite.T(), 200, fr.Code) nr := httptest.NewRecorder() req, _ = http.NewRequest("POST", suite.Basepath+"/api/device/0x5002538e40a22954/smart", nvmefile) router.ServeHTTP(nr, req) require.Equal(suite.T(), 200, nr.Code) sr := httptest.NewRecorder() req, _ = http.NewRequest("POST", suite.Basepath+"/api/device/0x5000cca252c859cc/smart", scsifile) router.ServeHTTP(sr, req) require.Equal(suite.T(), 200, sr.Code) s2r := httptest.NewRecorder() req, _ = http.NewRequest("POST", suite.Basepath+"/api/device/0x5000cca264ebc248/smart", scsi2file) router.ServeHTTP(s2r, req) require.Equal(suite.T(), 200, s2r.Code) //assert } //TODO: this test should use a recorded request/response playback. //func TestSendTestNotificationRoute(t *testing.T) { // //setup // parentPath, _ := os.MkdirTemp("", "") // defer os.RemoveAll(parentPath) // mockCtrl := gomock.NewController(t) // fakeConfig := mock_config.NewMockInterface(mockCtrl) // fakeConfig.EXPECT().GetString("web.database.location").AnyTimes().Return(path.Join(parentPath, "scrutiny_test.db")) // fakeConfig.EXPECT().GetString("web.src.frontend.path").AnyTimes().Return(parentPath) // fakeConfig.EXPECT().GetStringSlice("notify.urls").AnyTimes().Return([]string{"https://scrutiny.requestcatcher.com/test"}) // ae := web.AppEngine{ // Config: fakeConfig, // } // router := ae.Setup(logrus.New()) // // //test // wr := httptest.NewRecorder() // req, _ := http.NewRequest("POST", "/api/health/notify", strings.NewReader("{}")) // router.ServeHTTP(wr, req) // // //assert // require.Equal(t, 200, wr.Code) //} func (suite *ServerTestSuite) TestSendTestNotificationRoute_WebhookFailure() { //setup parentPath, _ := os.MkdirTemp("", "") defer os.RemoveAll(parentPath) mockCtrl := gomock.NewController(suite.T()) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().SetDefault(gomock.Any(), gomock.Any()).AnyTimes() fakeConfig.EXPECT().UnmarshalKey(gomock.Any(), gomock.Any()).AnyTimes().Return(nil) fakeConfig.EXPECT().GetString("web.database.location").AnyTimes().Return(path.Join(parentPath, "scrutiny_test.db")) fakeConfig.EXPECT().GetString("web.src.frontend.path").AnyTimes().Return(parentPath) fakeConfig.EXPECT().GetString("web.listen.basepath").Return(suite.Basepath).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.scheme").Return("http").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.port").Return("8086").AnyTimes() fakeConfig.EXPECT().IsSet("web.influxdb.token").Return(true).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.token").Return("my-super-secret-auth-token").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.tls.insecure_skip_verify").Return(false).AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.retention_policy").Return(false).AnyTimes() fakeConfig.EXPECT().GetStringSlice("notify.urls").AnyTimes().Return([]string{"https://unroutable.domain.example.asdfghj"}) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.notify_level", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsNotifyLevelFail)) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.status_filter_attributes", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsStatusFilterAttributesAll)) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.status_threshold", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsStatusThresholdBoth)) if _, isGithubActions := os.LookupEnv("GITHUB_ACTIONS"); isGithubActions { // when running test suite in github actions, we run an influxdb service as a sidecar. fakeConfig.EXPECT().GetString("web.influxdb.host").Return("influxdb").AnyTimes() } else { fakeConfig.EXPECT().GetString("web.influxdb.host").Return("localhost").AnyTimes() } ae := web.AppEngine{ Config: fakeConfig, } router := ae.Setup(logrus.WithField("test", suite.T().Name())) //test wr := httptest.NewRecorder() req, _ := http.NewRequest("POST", suite.Basepath+"/api/health/notify", strings.NewReader("{}")) router.ServeHTTP(wr, req) //assert require.Equal(suite.T(), 500, wr.Code) } func (suite *ServerTestSuite) TestSendTestNotificationRoute_ScriptFailure() { //setup parentPath, _ := os.MkdirTemp("", "") defer os.RemoveAll(parentPath) mockCtrl := gomock.NewController(suite.T()) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().SetDefault(gomock.Any(), gomock.Any()).AnyTimes() fakeConfig.EXPECT().UnmarshalKey(gomock.Any(), gomock.Any()).AnyTimes().Return(nil) fakeConfig.EXPECT().GetString("web.database.location").AnyTimes().Return(path.Join(parentPath, "scrutiny_test.db")) fakeConfig.EXPECT().GetString("web.src.frontend.path").AnyTimes().Return(parentPath) fakeConfig.EXPECT().GetString("web.listen.basepath").Return(suite.Basepath).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.scheme").Return("http").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.port").Return("8086").AnyTimes() fakeConfig.EXPECT().IsSet("web.influxdb.token").Return(true).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.token").Return("my-super-secret-auth-token").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.tls.insecure_skip_verify").Return(false).AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.retention_policy").Return(false).AnyTimes() fakeConfig.EXPECT().GetStringSlice("notify.urls").AnyTimes().Return([]string{"script:///missing/path/on/disk"}) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.notify_level", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsNotifyLevelFail)) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.status_filter_attributes", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsStatusFilterAttributesAll)) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.status_threshold", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsStatusThresholdBoth)) if _, isGithubActions := os.LookupEnv("GITHUB_ACTIONS"); isGithubActions { // when running test suite in github actions, we run an influxdb service as a sidecar. fakeConfig.EXPECT().GetString("web.influxdb.host").Return("influxdb").AnyTimes() } else { fakeConfig.EXPECT().GetString("web.influxdb.host").Return("localhost").AnyTimes() } ae := web.AppEngine{ Config: fakeConfig, } router := ae.Setup(logrus.WithField("test", suite.T().Name())) //test wr := httptest.NewRecorder() req, _ := http.NewRequest("POST", suite.Basepath+"/api/health/notify", strings.NewReader("{}")) router.ServeHTTP(wr, req) //assert require.Equal(suite.T(), 500, wr.Code) } func (suite *ServerTestSuite) TestSendTestNotificationRoute_ScriptSuccess() { //setup parentPath, _ := os.MkdirTemp("", "") defer os.RemoveAll(parentPath) mockCtrl := gomock.NewController(suite.T()) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().SetDefault(gomock.Any(), gomock.Any()).AnyTimes() fakeConfig.EXPECT().UnmarshalKey(gomock.Any(), gomock.Any()).AnyTimes().Return(nil) fakeConfig.EXPECT().GetString("web.database.location").AnyTimes().Return(path.Join(parentPath, "scrutiny_test.db")) fakeConfig.EXPECT().GetString("web.src.frontend.path").AnyTimes().Return(parentPath) fakeConfig.EXPECT().GetString("web.listen.basepath").Return(suite.Basepath).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.scheme").Return("http").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.port").Return("8086").AnyTimes() fakeConfig.EXPECT().IsSet("web.influxdb.token").Return(true).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.token").Return("my-super-secret-auth-token").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.tls.insecure_skip_verify").Return(false).AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.retention_policy").Return(false).AnyTimes() fakeConfig.EXPECT().GetStringSlice("notify.urls").AnyTimes().Return([]string{"script:///usr/bin/env"}) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.notify_level", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsNotifyLevelFail)) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.status_filter_attributes", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsStatusFilterAttributesAll)) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.status_threshold", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsStatusThresholdBoth)) if _, isGithubActions := os.LookupEnv("GITHUB_ACTIONS"); isGithubActions { // when running test suite in github actions, we run an influxdb service as a sidecar. fakeConfig.EXPECT().GetString("web.influxdb.host").Return("influxdb").AnyTimes() } else { fakeConfig.EXPECT().GetString("web.influxdb.host").Return("localhost").AnyTimes() } ae := web.AppEngine{ Config: fakeConfig, } router := ae.Setup(logrus.WithField("test", suite.T().Name())) //test wr := httptest.NewRecorder() req, _ := http.NewRequest("POST", suite.Basepath+"/api/health/notify", strings.NewReader("{}")) router.ServeHTTP(wr, req) //assert require.Equal(suite.T(), 200, wr.Code) } func (suite *ServerTestSuite) TestSendTestNotificationRoute_ShoutrrrFailure() { //setup parentPath, _ := os.MkdirTemp("", "") defer os.RemoveAll(parentPath) mockCtrl := gomock.NewController(suite.T()) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().SetDefault(gomock.Any(), gomock.Any()).AnyTimes() fakeConfig.EXPECT().UnmarshalKey(gomock.Any(), gomock.Any()).AnyTimes().Return(nil) fakeConfig.EXPECT().GetString("web.database.location").AnyTimes().Return(path.Join(parentPath, "scrutiny_test.db")) fakeConfig.EXPECT().GetString("web.src.frontend.path").AnyTimes().Return(parentPath) fakeConfig.EXPECT().GetString("web.listen.basepath").Return(suite.Basepath).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.scheme").Return("http").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.port").Return("8086").AnyTimes() fakeConfig.EXPECT().IsSet("web.influxdb.token").Return(true).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.token").Return("my-super-secret-auth-token").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.tls.insecure_skip_verify").Return(false).AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.retention_policy").Return(false).AnyTimes() fakeConfig.EXPECT().GetStringSlice("notify.urls").AnyTimes().Return([]string{"discord://invalidtoken@channel"}) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.notify_level", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsNotifyLevelFail)) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.status_filter_attributes", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsStatusFilterAttributesAll)) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.status_threshold", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsStatusThresholdBoth)) if _, isGithubActions := os.LookupEnv("GITHUB_ACTIONS"); isGithubActions { // when running test suite in github actions, we run an influxdb service as a sidecar. fakeConfig.EXPECT().GetString("web.influxdb.host").Return("influxdb").AnyTimes() } else { fakeConfig.EXPECT().GetString("web.influxdb.host").Return("localhost").AnyTimes() } ae := web.AppEngine{ Config: fakeConfig, } router := ae.Setup(logrus.WithField("test", suite.T().Name())) //test wr := httptest.NewRecorder() req, _ := http.NewRequest("POST", suite.Basepath+"/api/health/notify", strings.NewReader("{}")) router.ServeHTTP(wr, req) //assert require.Equal(suite.T(), 500, wr.Code) } func (suite *ServerTestSuite) TestGetDevicesSummaryRoute_Nvme() { //setup parentPath, _ := os.MkdirTemp("", "") defer os.RemoveAll(parentPath) mockCtrl := gomock.NewController(suite.T()) fakeConfig := mock_config.NewMockInterface(mockCtrl) fakeConfig.EXPECT().SetDefault(gomock.Any(), gomock.Any()).AnyTimes() fakeConfig.EXPECT().UnmarshalKey(gomock.Any(), gomock.Any()).AnyTimes().Return(nil) fakeConfig.EXPECT().GetString("web.database.location").AnyTimes().Return(path.Join(parentPath, "scrutiny_test.db")) fakeConfig.EXPECT().GetString("web.src.frontend.path").AnyTimes().Return(parentPath) fakeConfig.EXPECT().GetString("web.listen.basepath").Return(suite.Basepath).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.scheme").Return("http").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.port").Return("8086").AnyTimes() fakeConfig.EXPECT().IsSet("web.influxdb.token").Return(true).AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.token").Return("my-super-secret-auth-token").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.org").Return("scrutiny").AnyTimes() fakeConfig.EXPECT().GetString("web.influxdb.bucket").Return("metrics").AnyTimes() fakeConfig.EXPECT().GetBool("user.metrics.repeat_notifications").Return(true).AnyTimes() fakeConfig.EXPECT().GetBool("user.collector.discard_sct_temp_history").Return(false).AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.tls.insecure_skip_verify").Return(false).AnyTimes() fakeConfig.EXPECT().GetBool("web.influxdb.retention_policy").Return(false).AnyTimes() fakeConfig.EXPECT().GetStringSlice("notify.urls").AnyTimes().Return([]string{}) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.notify_level", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsNotifyLevelFail)) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.status_filter_attributes", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsStatusFilterAttributesAll)) fakeConfig.EXPECT().GetInt(fmt.Sprintf("%s.metrics.status_threshold", config.DB_USER_SETTINGS_SUBKEY)).AnyTimes().Return(int(pkg.MetricsStatusThresholdBoth)) if _, isGithubActions := os.LookupEnv("GITHUB_ACTIONS"); isGithubActions { // when running test suite in github actions, we run an influxdb service as a sidecar. fakeConfig.EXPECT().GetString("web.influxdb.host").Return("influxdb").AnyTimes() } else { fakeConfig.EXPECT().GetString("web.influxdb.host").Return("localhost").AnyTimes() } ae := web.AppEngine{ Config: fakeConfig, } router := ae.Setup(logrus.WithField("test", suite.T().Name())) devicesfile, err := os.Open("testdata/register-devices-req-2.json") require.NoError(suite.T(), err) metricsfile := helperReadSmartDataFileFixTimestamp(suite.T(), "../models/testdata/smart-nvme2.json") //test wr := httptest.NewRecorder() req, _ := http.NewRequest("POST", suite.Basepath+"/api/devices/register", devicesfile) router.ServeHTTP(wr, req) require.Equal(suite.T(), 200, wr.Code) mr := httptest.NewRecorder() req, _ = http.NewRequest("POST", suite.Basepath+"/api/device/a4c8e8ed-11a0-4c97-9bba-306440f1b944/smart", metricsfile) router.ServeHTTP(mr, req) require.Equal(suite.T(), 200, mr.Code) sr := httptest.NewRecorder() req, _ = http.NewRequest("GET", suite.Basepath+"/api/summary", nil) router.ServeHTTP(sr, req) require.Equal(suite.T(), 200, sr.Code) var deviceSummary models.DeviceSummaryWrapper err = json.Unmarshal(sr.Body.Bytes(), &deviceSummary) require.NoError(suite.T(), err) //assert require.Equal(suite.T(), "a4c8e8ed-11a0-4c97-9bba-306440f1b944", deviceSummary.Data.Summary["a4c8e8ed-11a0-4c97-9bba-306440f1b944"].Device.WWN) require.Equal(suite.T(), pkg.DeviceStatusPassed, deviceSummary.Data.Summary["a4c8e8ed-11a0-4c97-9bba-306440f1b944"].Device.DeviceStatus) } ================================================ FILE: webapp/backend/pkg/web/testdata/register-devices-req-2.json ================================================ { "data": [ { "wwn": "a4c8e8ed-11a0-4c97-9bba-306440f1b944", "device_name": "nvme0", "manufacturer": "", "model_name": "Force MP510", "interface_type": "", "interface_speed": "", "serial_number": "a4c8e8ed-11a0-4c97-9bba-306440f1b944", "firmware": "ECFM12.3", "rotational_speed": 0, "capacity": 480103981056, "form_factor": "", "smart_support": false, "device_protocol": "NVMe", "device_type": "nvme" } ] } ================================================ FILE: webapp/backend/pkg/web/testdata/register-devices-req.json ================================================ { "data": [ { "wwn": "0x5002538e40a22954", "device_name": "sda", "manufacturer": "ATA", "model_name": "Samsung_SSD_860_EVO_500GB", "interface_type": "SCSI", "interface_speed": "", "serial_number": "S3YZNB0KBXXXXXX", "firmware": "", "rotational_speed": 0, "capacity": 500107862016, "form_factor": "", "smart_support": false }, { "wwn": "0x5000cca264eb01d7", "device_name": "sdb", "manufacturer": "ATA", "model_name": "WDC_WD140EDFZ-11A0VA0", "interface_type": "SCSI", "interface_speed": "", "serial_number": "9RK1XXXXX", "firmware": "", "rotational_speed": 0, "capacity": 14000519643136, "form_factor": "", "smart_support": false }, { "wwn": "0x5000cca264ec3183", "device_name": "sdc", "manufacturer": "ATA", "model_name": "WDC_WD140EDFZ-11A0VA0", "interface_type": "SCSI", "interface_speed": "", "serial_number": "9RK4XXXXX", "firmware": "", "rotational_speed": 0, "capacity": 14000519643136, "form_factor": "", "smart_support": false }, { "wwn": "0x5000cca252c859cc", "device_name": "sdd", "manufacturer": "ATA", "model_name": "WDC_WD80EFAX-68LHPN0", "interface_type": "SCSI", "interface_speed": "", "serial_number": "7SGLXXXXX", "firmware": "", "rotational_speed": 0, "capacity": 8001563222016, "form_factor": "", "smart_support": false }, { "wwn": "0x5000cca264ebc248", "device_name": "sde", "manufacturer": "ATA", "model_name": "WDC_WD140EDFZ-11A0VA0", "interface_type": "SCSI", "interface_speed": "", "serial_number": "9RK3XXXXX", "firmware": "", "rotational_speed": 0, "capacity": 14000519643136, "form_factor": "", "smart_support": false }, { "wwn": "0x50014ee20b2a72a9", "device_name": "sdf", "manufacturer": "ATA", "model_name": "WDC_WD60EFRX-68MYMN1", "interface_type": "SCSI", "interface_speed": "", "serial_number": "WD-WXL1HXXXXX", "firmware": "", "rotational_speed": 0, "capacity": 6001175126016, "form_factor": "", "smart_support": false }, { "wwn": "0x5000c500673e6b5f", "device_name": "sdg", "manufacturer": "ATA", "model_name": "ST6000DX000-1H217Z", "interface_type": "SCSI", "interface_speed": "", "serial_number": "Z4DXXXXX", "firmware": "", "rotational_speed": 0, "capacity": 6001175126016, "form_factor": "", "smart_support": false } ] } ================================================ FILE: webapp/backend/pkg/web/testdata/register-devices-single-req.json ================================================ { "data": [ { "wwn": "0x5000cca264eb01d7", "device_name": "sdb", "manufacturer": "ATA", "model_name": "WDC_WD140EDFZ-11A0VA0", "interface_type": "SCSI", "interface_speed": "", "serial_number": "9RK1XXXXX", "firmware": "", "rotational_speed": 0, "capacity": 14000519643136, "form_factor": "", "smart_support": false } ] } ================================================ FILE: webapp/backend/pkg/web/testdata/upload-device-metrics-req.json ================================================ { "json_format_version": [ 1, 0 ], "smartctl": { "version": [ 7, 0 ], "svn_revision": "4883", "platform_info": "x86_64-linux-4.19.128-flatcar", "build_info": "(local build)", "argv": [ "smartctl", "-j", "-a", "/dev/sdb" ], "exit_status": 0 }, "device": { "name": "/dev/sdb", "info_name": "/dev/sdb [SAT]", "type": "sat", "protocol": "ATA" }, "model_name": "WDC WD140EDFZ-11A0VA0", "serial_number": "9RK1XXXX", "wwn": { "naa": 5, "oui": 3274, "id": 10283057623 }, "firmware_version": "81.00A81", "user_capacity": { "blocks": 27344764928, "bytes": 14000519643136 }, "logical_block_size": 512, "physical_block_size": 4096, "rotation_rate": 5400, "form_factor": { "ata_value": 2, "name": "3.5 inches" }, "in_smartctl_database": false, "ata_version": { "string": "ACS-2, ATA8-ACS T13/1699-D revision 4", "major_value": 1020, "minor_value": 41 }, "sata_version": { "string": "SATA 3.2", "value": 255 }, "interface_speed": { "max": { "sata_value": 14, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 }, "current": { "sata_value": 3, "string": "6.0 Gb/s", "units_per_second": 60, "bits_per_unit": 100000000 } }, "local_time": { "time_t": 1592697810, "asctime": "Sun Jun 21 00:03:30 2020 UTC" }, "smart_status": { "passed": true }, "ata_smart_data": { "offline_data_collection": { "status": { "value": 130, "string": "was completed without error", "passed": true }, "completion_seconds": 101 }, "self_test": { "status": { "value": 241, "string": "in progress, 10% remaining", "remaining_percent": 10 }, "polling_minutes": { "short": 2, "extended": 1479 } }, "capabilities": { "values": [ 91, 3 ], "exec_offline_immediate_supported": true, "offline_is_aborted_upon_new_cmd": false, "offline_surface_scan_supported": true, "self_tests_supported": true, "conveyance_self_test_supported": false, "selective_self_test_supported": true, "attribute_autosave_enabled": true, "error_logging_supported": true, "gp_logging_supported": true } }, "ata_sct_capabilities": { "value": 61, "error_recovery_control_supported": true, "feature_control_supported": true, "data_table_supported": true }, "ata_smart_attributes": { "revision": 16, "table": [ { "id": 1, "name": "Raw_Read_Error_Rate", "value": 100, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 11, "string": "PO-R-- ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 2, "name": "Throughput_Performance", "value": 135, "worst": 135, "thresh": 54, "when_failed": "", "flags": { "value": 4, "string": "--S--- ", "prefailure": false, "updated_online": false, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 108, "string": "108" } }, { "id": 3, "name": "Spin_Up_Time", "value": 81, "worst": 81, "thresh": 1, "when_failed": "", "flags": { "value": 7, "string": "POS--- ", "prefailure": true, "updated_online": true, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 30089675132, "string": "380 (Average 380)" } }, { "id": 4, "name": "Start_Stop_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 9, "string": "9" } }, { "id": 5, "name": "Reallocated_Sector_Ct", "value": 100, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 51, "string": "PO--CK ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 7, "name": "Seek_Error_Rate", "value": 100, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 10, "string": "-O-R-- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 8, "name": "Seek_Time_Performance", "value": 133, "worst": 133, "thresh": 20, "when_failed": "", "flags": { "value": 4, "string": "--S--- ", "prefailure": false, "updated_online": false, "performance": true, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 18, "string": "18" } }, { "id": 9, "name": "Power_On_Hours", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 1730, "string": "1730" } }, { "id": 10, "name": "Spin_Retry_Count", "value": 100, "worst": 100, "thresh": 1, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 12, "name": "Power_Cycle_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 9, "string": "9" } }, { "id": 22, "name": "Unknown_Attribute", "value": 100, "worst": 100, "thresh": 25, "when_failed": "", "flags": { "value": 35, "string": "PO---K ", "prefailure": true, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 100, "string": "100" } }, { "id": 192, "name": "Power-Off_Retract_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 329, "string": "329" } }, { "id": 193, "name": "Load_Cycle_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 18, "string": "-O--C- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": false }, "raw": { "value": 329, "string": "329" } }, { "id": 194, "name": "Temperature_Celsius", "value": 51, "worst": 51, "thresh": 0, "when_failed": "", "flags": { "value": 2, "string": "-O---- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": false }, "raw": { "value": 163210330144, "string": "32 (Min/Max 24/38)" } }, { "id": 196, "name": "Reallocated_Event_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 50, "string": "-O--CK ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": true, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 197, "name": "Current_Pending_Sector", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 34, "string": "-O---K ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": false, "event_count": false, "auto_keep": true }, "raw": { "value": 0, "string": "0" } }, { "id": 198, "name": "Offline_Uncorrectable", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 8, "string": "---R-- ", "prefailure": false, "updated_online": false, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } }, { "id": 199, "name": "UDMA_CRC_Error_Count", "value": 100, "worst": 100, "thresh": 0, "when_failed": "", "flags": { "value": 10, "string": "-O-R-- ", "prefailure": false, "updated_online": true, "performance": false, "error_rate": true, "event_count": false, "auto_keep": false }, "raw": { "value": 0, "string": "0" } } ] }, "power_on_time": { "hours": 1730 }, "power_cycle_count": 9, "temperature": { "current": 32 }, "ata_smart_error_log": { "summary": { "revision": 1, "count": 0 } }, "ata_smart_self_test_log": { "standard": { "revision": 1, "table": [ { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1708 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1684 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1661 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1636 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1624 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1541 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1517 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1493 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1469 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1445 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1439 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1373 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1349 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1325 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1301 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1277 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1253 }, { "type": { "value": 2, "string": "Extended offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1252 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1205 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1181 }, { "type": { "value": 1, "string": "Short offline" }, "status": { "value": 0, "string": "Completed without error", "passed": true }, "lifetime_hours": 1157 } ], "count": 21, "error_count_total": 0, "error_count_outdated": 0 } }, "ata_smart_selective_self_test_log": { "revision": 1, "table": [ { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } }, { "lba_min": 0, "lba_max": 0, "status": { "value": 241, "string": "Not_testing" } } ], "flags": { "value": 0, "remainder_scan_enabled": false }, "power_up_scan_resume_minutes": 0 } } ================================================ FILE: webapp/frontend/.editorconfig ================================================ # 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 [*.md] max_line_length = off trim_trailing_whitespace = false ================================================ FILE: webapp/frontend/.gitignore ================================================ # 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 /dist /coverage ================================================ FILE: webapp/frontend/CREDITS ================================================ // ----------------------------------------------------------------------------------------------------- // @ 3rd party credits // ----------------------------------------------------------------------------------------------------- // Icons Material - https://material.io/tools/icons Dripicons - http://demo.amitjakhu.com/dripicons/ Feather - https://feathericons.com/ Heroicons - https://github.com/refactoringui/heroicons Iconsmind - https://iconsmind.com/ // Avatars https://uifaces.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 // Auth pages Photo by Meric Dagli on Unsplash - https://unsplash.com/photos/kZTYGpoeQO0 // 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 ================================================ FILE: webapp/frontend/LICENSE.md ================================================ 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) ================================================ FILE: webapp/frontend/README.md ================================================ # Treo - 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). ================================================ FILE: webapp/frontend/angular.json ================================================ { "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { "treo": { "projectType": "application", "schematics": { "@schematics/angular:component": { "style": "scss" } }, "root": "", "sourceRoot": "src", "prefix": "app", "architect": { "build": { "builder": "@angular-devkit/build-angular:browser", "options": { "outputPath": "dist/treo", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.app.json", "aot": true, "assets": [ "src/favicon-16x16.png", "src/favicon-32x32.png", "src/assets" ], "stylePreprocessorOptions": { "includePaths": [ "src/@treo/styles" ] }, "styles": [ "src/styles/vendors.scss", "src/@treo/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": "60kb", "maximumError": "100kb" } ] } } }, "serve": { "builder": "@angular-devkit/build-angular:dev-server", "options": { "browserTarget": "treo:build" }, "configurations": { "production": { "browserTarget": "treo:build:production" } } }, "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { "browserTarget": "treo: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" ], "stylePreprocessorOptions": { "includePaths": [ "src/@treo/styles" ] }, "styles": [ "src/styles/vendors.scss", "src/@treo/styles/main.scss", "src/styles/styles.scss", "src/styles/tailwind.scss" ], "scripts": [], "fileReplacements": [{ "replace": "src/environments/environment.ts", "with": "src/environments/environment.prod.ts" }] } }, "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": "treo:serve" }, "configurations": { "production": { "devServerTarget": "treo:serve:production" } } } } } }, "defaultProject": "treo" } ================================================ FILE: webapp/frontend/browserslist ================================================ # 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 # You can see what browsers were selected by your queries by running: # npx browserslist > 0.5% last 2 versions Firefox ESR not dead not IE 9-11 # For IE 9-11 support, remove 'not'. ================================================ FILE: webapp/frontend/e2e/protractor.conf.js ================================================ // @ts-check // Protractor configuration file, see link for more information // https://github.com/angular/protractor/blob/master/lib/config.ts const {SpecReporter} = require('jasmine-spec-reporter'); /** * @type { import("protractor").Config } */ exports.config = { allScriptsTimeout: 11000, specs : [ './src/**/*.e2e-spec.ts' ], capabilities : { browserName: 'chrome' }, directConnect : true, 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: true}})); } }; ================================================ FILE: webapp/frontend/e2e/src/app.e2e-spec.ts ================================================ 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', () => { page.navigateTo(); expect(page.getTitleText()).toEqual('Welcome to Treo!'); }); 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)); }); }); ================================================ FILE: webapp/frontend/e2e/src/app.po.ts ================================================ import { browser, by, element } from 'protractor'; export class AppPage { navigateTo(): Promise { return browser.get(browser.baseUrl) as Promise; } getTitleText(): Promise { return element(by.css('app-root h1')).getText() as Promise; } } ================================================ FILE: webapp/frontend/e2e/tsconfig.json ================================================ { "extends": "../tsconfig.json", "compilerOptions": { "outDir": "../out-tsc/e2e", "module": "commonjs", "target": "es5", "types": [ "jasmine", "jasminewd2", "node" ] } } ================================================ FILE: webapp/frontend/git.version.sh ================================================ #!/usr/bin/env bash if [[ -z "${CI}" ]]; then echo "running locally (not in Github Actions). generating version file from git client" GIT_TAG=`git describe --tags` GIT_BRANCH=`git rev-parse --abbrev-ref HEAD` if [[ "$GIT_BRANCH" == "master" ]]; then VERSION_INFO="${GIT_TAG}" else VERSION_INFO="${GIT_BRANCH}#${GIT_TAG}" fi else echo "running in Github Actions, generating version file from environmental variables" # https://docs.github.com/en/actions/learn-github-actions/environment-variables VERSION_INFO="${GITHUB_REF_NAME}" if [[ "$GITHUB_REF_TYPE" == "branch" ]]; then VERSION_INFO="${VERSION_INFO}#${GITHUB_SHA::7}" fi fi echo "writing version file (version: ${VERSION_INFO})" cat < src/environments/versions.ts // this file is automatically generated by git.version.ts script export const versionInfo = { version: '${VERSION_INFO}', }; EOT ================================================ FILE: webapp/frontend/karma.conf.js ================================================ // 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: { clearContext: false // leave Jasmine Spec Runner output visible in browser }, coverageIstanbulReporter: { dir: require('path').join(__dirname, './coverage'), reports: ['html', 'lcovonly', 'text-summary'], fixWebpackSourcePaths: true }, reporters: ['progress', 'kjhtml'], port: 9876, colors: true, logLevel: config.LOG_INFO, autoWatch: true, browsers: ['Chrome'], singleRun: false, restartOnFileChange: true }); }; ================================================ FILE: webapp/frontend/package.json ================================================ { "name": "@treo/starter", "version": "1.0.1", "license": "https://themeforest.net/licenses/standard", "scripts": { "ng": "ng", "start": "ng serve --open", "start:mem": "node --max_old_space_size=6144 ./node_modules/@angular/cli/bin/ng serve --open", "build": "ng build", "build:prod": "ng build --configuration production", "build:prod:mem": "node --max_old_space_size=6144 ./node_modules/@angular/cli/bin/ng build --prod", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e", "tw": "npm run tw:build && npm run tw:export", "tw:build": "./node_modules/.bin/tailwind build src/tailwind/main.css -c src/tailwind/config.js -o src/styles/tailwind.scss", "tw:export": "npm run tw:export:js && npm run tw:export:scss", "tw:export:js": "node src/@treo/tailwind/export.js -c src/tailwind/config.js -o src/@treo/tailwind/exported/variables.ts", "tw:export:scss": "./node_modules/.bin/tailwind build src/@treo/tailwind/export.css -c src/tailwind/config.js -o src/@treo/tailwind/exported/_variables.scss" }, "private": true, "dependencies": { "@angular/animations": "v13-lts", "@angular/cdk": "v13-lts", "@angular/common": "v13-lts", "@angular/compiler": "v13-lts", "@angular/core": "v13-lts", "@angular/forms": "v13-lts", "@angular/material": "v13-lts", "@angular/material-moment-adapter": "v13-lts", "@angular/platform-browser": "v13-lts", "@angular/platform-browser-dynamic": "v13-lts", "@angular/router": "v13-lts", "@types/humanize-duration": "^3.27.1", "crypto-js": "^4.1.1", "highlight.js": "^11.6.0", "humanize-duration": "^3.27.3", "lodash": "4.17.23", "moment": "^2.29.4", "ng-apexcharts": "^1.7.4", "ngx-markdown": "^13.1.0", "perfect-scrollbar": "^1.5.5", "quill": "^1.3.7", "rrule": "^2.7.1", "rxjs": "^7.5.7", "tslib": "^2.4.1", "web-animations-js": "^2.3.2" }, "devDependencies": { "@angular-devkit/build-angular": "v13-lts", "@angular/cli": "v13-lts", "@angular/compiler-cli": "v13-lts", "@angular/language-service": "v13-lts", "@types/crypto-js": "^4.1.1", "@types/highlight.js": "^10.1.0", "@types/jasmine": "^4.3.0", "@types/jasminewd2": "^2.0.10", "@types/lodash": "^4.14.188", "@types/node": "^18.11.9", "codelyzer": "^6.0.2", "jasmine-core": "^4.5.0", "jasmine-spec-reporter": "^7.0.0", "karma": "^6.4.1", "karma-chrome-launcher": "^3.1.1", "karma-coverage": "^2.2.0", "karma-jasmine": "^5.1.0", "karma-jasmine-html-reporter": "^2.0.0", "protractor": "^7.0.0", "tailwindcss": "^3.2.3", "ts-node": "^10.9.1", "tslint": "^6.1.3", "typescript": "^4.6.4" } } ================================================ FILE: webapp/frontend/src/@treo/animations/defaults.ts ================================================ export class TreoAnimationCurves { 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 TreoAnimationDurations { static COMPLEX = '375ms'; static ENTERING = '225ms'; static EXITING = '195ms'; } ================================================ FILE: webapp/frontend/src/@treo/animations/expand-collapse.ts ================================================ import { animate, state, style, transition, trigger } from '@angular/animations'; import { TreoAnimationCurves, TreoAnimationDurations } from '@treo/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: `${TreoAnimationDurations.ENTERING} ${TreoAnimationCurves.DECELERATION_CURVE}` } } ) ] ); export { expandCollapse }; ================================================ FILE: webapp/frontend/src/@treo/animations/fade.ts ================================================ import { animate, state, style, transition, trigger } from '@angular/animations'; import { TreoAnimationCurves, TreoAnimationDurations } from '@treo/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: `${TreoAnimationDurations.ENTERING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.ENTERING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.ENTERING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.ENTERING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.ENTERING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.EXITING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.EXITING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.EXITING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.EXITING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.EXITING} ${TreoAnimationCurves.ACCELERATION_CURVE}` } } ) ] ); export { fadeIn, fadeInTop, fadeInBottom, fadeInLeft, fadeInRight, fadeOut, fadeOutTop, fadeOutBottom, fadeOutLeft, fadeOutRight }; ================================================ FILE: webapp/frontend/src/@treo/animations/index.ts ================================================ export * from './public-api'; ================================================ FILE: webapp/frontend/src/@treo/animations/public-api.ts ================================================ 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 TreoAnimations = [ expandCollapse, fadeIn, fadeInTop, fadeInBottom, fadeInLeft, fadeInRight, fadeOut, fadeOutTop, fadeOutBottom, fadeOutLeft, fadeOutRight, shake, slideInTop, slideInBottom, slideInLeft, slideInRight, slideOutTop, slideOutBottom, slideOutLeft, slideOutRight, zoomIn, zoomOut ]; ================================================ FILE: webapp/frontend/src/@treo/animations/shake.ts ================================================ 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 }; ================================================ FILE: webapp/frontend/src/@treo/animations/slide.ts ================================================ import { animate, state, style, transition, trigger } from '@angular/animations'; import { TreoAnimationCurves, TreoAnimationDurations } from '@treo/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: `${TreoAnimationDurations.ENTERING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.ENTERING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.ENTERING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.ENTERING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.EXITING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.EXITING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.EXITING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.EXITING} ${TreoAnimationCurves.ACCELERATION_CURVE}` } } ) ] ); export { slideInTop, slideInBottom, slideInLeft, slideInRight, slideOutTop, slideOutBottom, slideOutLeft, slideOutRight }; ================================================ FILE: webapp/frontend/src/@treo/animations/zoom.ts ================================================ import { animate, state, style, transition, trigger } from '@angular/animations'; import { TreoAnimationCurves, TreoAnimationDurations } from '@treo/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: `${TreoAnimationDurations.ENTERING} ${TreoAnimationCurves.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: `${TreoAnimationDurations.EXITING} ${TreoAnimationCurves.ACCELERATION_CURVE}` } } ) ] ); export { zoomIn, zoomOut }; ================================================ FILE: webapp/frontend/src/@treo/components/card/card.component.html ================================================
================================================ FILE: webapp/frontend/src/@treo/components/card/card.component.scss ================================================ @import 'treo'; treo-card { position: relative; display: flex; border-radius: 8px; overflow: hidden; @include treo-elevation('md'); // Flippable &.treo-card-flippable { border-radius: 0; overflow: visible; transform-style: preserve-3d; transition: transform 1s; @include treo-elevation('none'); &.treo-card-flipped { .treo-card-front { visibility: hidden; opacity: 0; transform: rotateY(180deg); } .treo-card-back { visibility: visible; opacity: 1; transform: rotateY(360deg); } } .treo-card-front, .treo-card-back { display: flex; flex-direction: column; flex: 1 1 auto; z-index: 10; border-radius: 8px; transition: transform 0.5s ease-out 0s, visibility 0s ease-in 0.2s, opacity 0s ease-in 0.2s; backface-visibility: hidden; @include treo-elevation('md'); } .treo-card-front { position: relative; opacity: 1; visibility: visible; transform: rotateY(0deg); overflow: hidden; } .treo-card-back { position: absolute; top: 0; right: 0; bottom: 0; left: 0; opacity: 0; visibility: hidden; transform: rotateY(180deg); overflow: hidden auto; } } } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $background: map-get($theme, background); treo-card { background: map-get($background, card); &.treo-card-flippable { background: transparent; .treo-card-front, .treo-card-back { background: map-get($background, card); } } } } ================================================ FILE: webapp/frontend/src/@treo/components/card/card.component.ts ================================================ import { Component, ElementRef, Input, Renderer2, ViewEncapsulation } from '@angular/core'; import { TreoAnimations } from '@treo/animations'; @Component({ selector : 'treo-card', templateUrl : './card.component.html', styleUrls : ['./card.component.scss'], encapsulation: ViewEncapsulation.None, animations : TreoAnimations, exportAs : 'treoCard' }) export class TreoCardComponent { expanded: boolean; flipped: boolean; // Private private _flippable: boolean; /** * Constructor * * @param {Renderer2} _renderer2 * @param {ElementRef} _elementRef */ constructor( private _renderer2: Renderer2, private _elementRef: ElementRef ) { // Set the defaults this.expanded = false; this.flippable = false; this.flipped = false; } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Setter and getter for flippable * * @param value */ @Input() set flippable(value: boolean) { // If the value is the same, return... if ( this._flippable === value ) { return; } // Update the class name if ( value ) { this._renderer2.addClass(this._elementRef.nativeElement, 'treo-card-flippable'); } else { this._renderer2.removeClass(this._elementRef.nativeElement, 'treo-card-flippable'); } // Store the value this._flippable = value; } get flippable(): boolean { return this._flippable; } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Expand the details */ expand(): void { this.expanded = true; } /** * Collapse the details */ collapse(): void { this.expanded = false; } /** * Toggle the expand/collapse status */ toggleExpanded(): void { this.expanded = !this.expanded; } /** * Flip the card */ flip(): void { // Return if not flippable if ( !this.flippable ) { return; } this.flipped = !this.flipped; // Update the class name if ( this.flipped ) { this._renderer2.addClass(this._elementRef.nativeElement, 'treo-card-flipped'); } else { this._renderer2.removeClass(this._elementRef.nativeElement, 'treo-card-flipped'); } } } ================================================ FILE: webapp/frontend/src/@treo/components/card/card.module.ts ================================================ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { TreoCardComponent } from '@treo/components/card/card.component'; @NgModule({ declarations: [ TreoCardComponent ], imports : [ CommonModule ], exports : [ TreoCardComponent ] }) export class TreoCardModule { } ================================================ FILE: webapp/frontend/src/@treo/components/card/index.ts ================================================ export * from '@treo/components/card/public-api'; ================================================ FILE: webapp/frontend/src/@treo/components/card/public-api.ts ================================================ export * from '@treo/components/card/card.component'; export * from '@treo/components/card/card.module'; ================================================ FILE: webapp/frontend/src/@treo/components/date-range/date-range.component.html ================================================
{{range.startDate}}
{{range.startTime}}
-
{{range.endDate}}
{{range.endTime}}
{{getMonthLabel(1)}}
Start time
{{getMonthLabel(2)}}
End time
================================================ FILE: webapp/frontend/src/@treo/components/date-range/date-range.component.scss ================================================ @import 'treo'; // Variables $body-cell-padding: 2px; treo-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: 5px; border-width: 1px; line-height: 1; .date { white-space: nowrap; + .time { margin-left: 8px; } } .time { white-space: nowrap; } } .separator { margin: 0 12px; @include treo-breakpoint('xs') { margin: 0 2px; } } } } .treo-date-range-panel { border-radius: 4px; padding: 24px; .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 { @include treo-icon-size(20); } } .previous-button { left: 0; } .next-button { right: 0; } .month-label { font-weight: 500; } } 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.mat-calendar-body-cell { width: 28px !important; height: 28px !important; padding: $body-cell-padding !important; &.treo-date-range { position: relative; &:before { content: ''; position: absolute; top: $body-cell-padding; right: 0; bottom: $body-cell-padding; left: 0; } &.treo-date-range-start { &:before { left: $body-cell-padding; border-radius: 999px 0 0 999px; } &.treo-date-range-end, &:last-child { &:before { right: $body-cell-padding; border-radius: 999px; } } } &.treo-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 { &.treo-date-range { &:before { border-radius: 999px 0 0 999px; } &.treo-date-range-start { &.treo-date-range-end { border-radius: 999px; } } &.treo-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; } } } } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $background: map-get($theme, background); $foreground: map-get($theme, foreground); $primary: map-get($theme, primary); $is-dark: map-get($theme, is-dark); treo-date-range { .range { .start, .end { @if ($is-dark) { background-color: rgba(0, 0, 0, 0.05); border-color: treo-color('cool-gray', 500); } @else { background-color: treo-color('cool-gray', 50); border-color: treo-color('cool-gray', 300); } } } } .treo-date-range-panel { background: map-get($background, card); @include treo-elevation('2xl'); .start, .end { .month { .month-header { .month-label { color: map-get($foreground, secondary-text); } } mat-month-view { .mat-calendar-table { tbody { tr { td, td:hover { &.treo-date-range { &:before { background-color: map-get($primary, 200); } .mat-calendar-body-cell-content { background-color: transparent; } } &.treo-date-range-start, &.treo-date-range-end { .mat-calendar-body-cell-content { background-color: map-get($primary, default); color: map-get($primary, default-contrast); } } .mat-calendar-body-today { border: none; } } } } } } } } } } ================================================ FILE: webapp/frontend/src/@treo/components/date-range/date-range.component.ts ================================================ 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 : 'treo-date-range', templateUrl : './date-range.component.html', styleUrls : ['./date-range.component.scss'], encapsulation: ViewEncapsulation.None, exportAs : 'treoDateRange', providers : [ { provide : NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TreoDateRangeComponent), multi : true } ] }) export class TreoDateRangeComponent implements ControlValueAccessor, OnInit, OnDestroy { // Range changed @Output() readonly rangeChanged: EventEmitter<{ start: string, end: string }>; activeDates: { month1: Moment, month2: Moment }; setWhichDate: 'start' | 'end'; startTimeFormControl: FormControl; endTimeFormControl: FormControl; // Private @HostBinding('class.treo-date-range') private _defaultClassNames; @ViewChild('matMonthView1') private _matMonthView1: MatMonthView; @ViewChild('matMonthView2') private _matMonthView2: MatMonthView; @ViewChild('pickerPanelOrigin', {read: ElementRef}) private _pickerPanelOrigin: ElementRef; @ViewChild('pickerPanel') private _pickerPanel: TemplateRef; private _dateFormat: string; private _onChange: (value: any) => void; private _onTouched: (value: any) => void; private _programmaticChange: boolean; private _range: { start: Moment, end: Moment }; private _timeFormat: string; private _timeRange: boolean; private readonly _timeRegExp: RegExp; private _unsubscribeAll: Subject; /** * Constructor * * @param {ChangeDetectorRef} _changeDetectorRef * @param {ElementRef} _elementRef * @param {Overlay} _overlay * @param {Renderer2} _renderer2 * @param {ViewContainerRef} _viewContainerRef */ constructor( private _changeDetectorRef: ChangeDetectorRef, private _elementRef: ElementRef, private _overlay: Overlay, private _renderer2: Renderer2, private _viewContainerRef: ViewContainerRef ) { // Set the private defaults this._defaultClassNames = true; this._onChange = () => { }; this._onTouched = () => { }; this._range = { start: null, end : null }; this._timeRegExp = new RegExp('^(0[0-9]|1[0-9]|2[0-4]|[0-9]):([0-5][0-9])(A|(?:AM)|P|(?:PM))?$', 'i'); this._unsubscribeAll = new Subject(); // Set the defaults this.activeDates = { month1: null, month2: null }; this.dateFormat = 'DD/MM/YYYY'; this.rangeChanged = new EventEmitter(); this.setWhichDate = 'start'; this.timeFormat = '12'; // Initialize the component this._init(); } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Setter and 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 and 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 and 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 and 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 = () => { }; } // ----------------------------------------------------------------------------------------------------- // @ 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); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Open the picker panel */ openPickerPanel(): void { // Create the overlay const overlayRef = this._overlay.create({ panelClass : 'treo-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 ['treo-date-range', 'treo-date-range-start', 'treo-date-range-end']; } // If the date is the start date... if ( date.isSame(this._range.start, 'day') ) { return ['treo-date-range', 'treo-date-range-start']; } // If the date is the end date... if ( date.isSame(this._range.end, 'day') ) { return ['treo-date-range', 'treo-date-range-end']; } // If the date is in between start and end dates... if ( date.isBetween(this._range.start, this._range.end, 'day') ) { return ['treo-date-range', 'treo-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' }; } } ================================================ FILE: webapp/frontend/src/@treo/components/date-range/date-range.module.ts ================================================ 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 { TreoDateRangeComponent } from '@treo/components/date-range/date-range.component'; @NgModule({ declarations: [ TreoDateRangeComponent ], imports : [ CommonModule, ReactiveFormsModule, MatButtonModule, MatDatepickerModule, MatFormFieldModule, MatInputModule, MatIconModule, MatMomentDateModule ], exports : [ TreoDateRangeComponent ] }) export class TreoDateRangeModule { } ================================================ FILE: webapp/frontend/src/@treo/components/date-range/index.ts ================================================ export * from '@treo/components/date-range/public-api'; ================================================ FILE: webapp/frontend/src/@treo/components/date-range/public-api.ts ================================================ export * from '@treo/components/date-range/date-range.component'; export * from '@treo/components/date-range/date-range.module'; ================================================ FILE: webapp/frontend/src/@treo/components/drawer/drawer.component.html ================================================
================================================ FILE: webapp/frontend/src/@treo/components/drawer/drawer.component.scss ================================================ @import 'treo'; $treo-drawer-width: 320; treo-drawer { position: relative; display: flex; flex-direction: column; flex: 1 1 auto; width: #{$treo-drawer-width}px; min-width: #{$treo-drawer-width}px; max-width: #{$treo-drawer-width}px; z-index: 300; box-shadow: 0 2px 8px 0 rgba(0, 0, 0, .35); // Animations &.treo-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; .treo-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 &.treo-drawer-mode-over { position: absolute; top: 0; bottom: 0; // Fixed mode &.treo-drawer-fixed { position: fixed; } } // Left position &.treo-drawer-position-left { // Side mode &.treo-drawer-mode-side { margin-left: #{$treo-drawer-width}px; &.treo-drawer-opened { margin-left: 0; } } // Over mode &.treo-drawer-mode-over { left: 0; transform: translate3d(-100%, 0, 0); &.treo-drawer-opened { transform: translate3d(0, 0, 0); } } // Content .treo-drawer-content { left: 0; } } // Right position &.treo-drawer-position-right { // Side mode &.treo-drawer-mode-side { margin-right: -#{$treo-drawer-width}px; &.treo-drawer-opened { margin-right: 0; } } // Over mode &.treo-drawer-mode-over { right: 0; transform: translate3d(100%, 0, 0); &.treo-drawer-opened { transform: translate3d(0, 0, 0); } } // Content .treo-drawer-content { right: 0; } } // Content .treo-drawer-content { position: absolute; display: flex; flex: 1 1 auto; top: 0; bottom: 0; width: 100%; height: 100%; overflow: hidden; } } // Overlay .treo-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 &.treo-drawer-overlay-fixed { position: fixed; } // Transparent overlay &.treo-drawer-overlay-transparent { background-color: transparent; } } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $background: map-get($theme, background); treo-drawer { background: map-get($background, card); .treo-drawer-content { background: map-get($background, card); } } } ================================================ FILE: webapp/frontend/src/@treo/components/drawer/drawer.component.ts ================================================ import { Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, OnDestroy, OnInit, Output, Renderer2, ViewEncapsulation } from '@angular/core'; import { animate, AnimationBuilder, AnimationPlayer, style } from '@angular/animations'; import { TreoDrawerMode, TreoDrawerPosition } from '@treo/components/drawer/drawer.types'; import { TreoDrawerService } from '@treo/components/drawer/drawer.service'; @Component({ selector : 'treo-drawer', templateUrl : './drawer.component.html', styleUrls : ['./drawer.component.scss'], encapsulation: ViewEncapsulation.None, exportAs : 'treoDrawer' }) export class TreoDrawerComponent implements OnInit, OnDestroy { // Name @Input() name: string; // Private private _fixed: boolean; private _mode: TreoDrawerMode; private _opened: boolean | ''; private _overlay: HTMLElement | null; private _player: AnimationPlayer; private _position: TreoDrawerPosition; private _transparentOverlay: boolean | ''; // On fixed changed @Output() readonly fixedChanged: EventEmitter; // On mode changed @Output() readonly modeChanged: EventEmitter; // On opened changed @Output() readonly openedChanged: EventEmitter; // On position changed @Output() readonly positionChanged: EventEmitter; @HostBinding('class.treo-drawer-animations-enabled') private _animationsEnabled: boolean; /** * Constructor * * @param {AnimationBuilder} _animationBuilder * @param {TreoDrawerService} _treoDrawerService * @param {ElementRef} _elementRef * @param {Renderer2} _renderer2 */ constructor( private _animationBuilder: AnimationBuilder, private _treoDrawerService: TreoDrawerService, private _elementRef: ElementRef, private _renderer2: Renderer2 ) { // Set the private defaults this._animationsEnabled = false; this._overlay = null; // Set the defaults this.fixedChanged = new EventEmitter(); this.modeChanged = new EventEmitter(); this.openedChanged = new EventEmitter(); this.positionChanged = new EventEmitter(); this.fixed = false; this.mode = 'side'; this.opened = false; this.position = 'left'; this.transparentOverlay = false; } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Setter & getter for fixed * * @param value */ @Input() set fixed(value: boolean) { // If the value is the same, return... if ( this._fixed === value ) { return; } // Store the fixed value this._fixed = value; // Update the class if ( this.fixed ) { this._renderer2.addClass(this._elementRef.nativeElement, 'treo-drawer-fixed'); } else { this._renderer2.removeClass(this._elementRef.nativeElement, 'treo-drawer-fixed'); } // Execute the observable this.fixedChanged.next(this.fixed); } get fixed(): boolean { return this._fixed; } /** * Setter & getter for mode * * @param value */ @Input() set mode(value: TreoDrawerMode) { // If the value is the same, return... if ( this._mode === value ) { return; } // Disable the animations this._disableAnimations(); // If the mode changes: 'over -> side' if ( this.mode === 'over' && value === 'side' ) { // Hide the overlay this._hideOverlay(); } // If the mode changes: 'side -> over' if ( this.mode === 'side' && value === 'over' ) { // If the drawer is opened if ( this.opened ) { // Show the overlay this._showOverlay(); } } let modeClassName; // Remove the previous mode class modeClassName = 'treo-drawer-mode-' + this.mode; this._renderer2.removeClass(this._elementRef.nativeElement, modeClassName); // Store the mode this._mode = value; // Add the new mode class modeClassName = 'treo-drawer-mode-' + this.mode; this._renderer2.addClass(this._elementRef.nativeElement, modeClassName); // Execute the observable this.modeChanged.next(this.mode); // 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); } get mode(): TreoDrawerMode { return this._mode; } /** * Setter & getter for opened * * @param value */ @Input() set opened(value: boolean | '') { // If the value is the same, return... if ( this._opened === value ) { return; } // If the provided value is an empty string, // take that as a 'true' if ( value === '' ) { value = true; } // Set the opened value this._opened = value; // If the drawer opened, and the mode // is 'over', show the overlay if ( this.mode === 'over' ) { if ( this._opened ) { this._showOverlay(); } else { this._hideOverlay(); } } // Update opened classes if ( this.opened ) { this._renderer2.setStyle(this._elementRef.nativeElement, 'visibility', 'visible'); this._renderer2.addClass(this._elementRef.nativeElement, 'treo-drawer-opened'); } else { this._renderer2.setStyle(this._elementRef.nativeElement, 'visibility', 'hidden'); this._renderer2.removeClass(this._elementRef.nativeElement, 'treo-drawer-opened'); } // Execute the observable this.openedChanged.next(this.opened); } get opened(): boolean | '' { return this._opened; } /** * Setter & getter for position * * @param value */ @Input() set position(value: TreoDrawerPosition) { // If the value is the same, return... if ( this._position === value ) { return; } let positionClassName; // Remove the previous position class positionClassName = 'treo-drawer-position-' + this.position; this._renderer2.removeClass(this._elementRef.nativeElement, positionClassName); // Store the position this._position = value; // Add the new position class positionClassName = 'treo-drawer-position-' + this.position; this._renderer2.addClass(this._elementRef.nativeElement, positionClassName); // Execute the observable this.positionChanged.next(this.position); } get position(): TreoDrawerPosition { return this._position; } /** * Setter & getter for transparent overlay * * @param value */ @Input() set transparentOverlay(value: boolean | '') { // If the value is the same, return... if ( this._opened === value ) { return; } // If the provided value is an empty string, // take that as a 'true' and set the opened value if ( value === '' ) { // Set the opened value this._transparentOverlay = true; } else { // Set the transparent overlay value this._transparentOverlay = value; } } get transparentOverlay(): boolean | '' { return this._transparentOverlay; } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Register the drawer this._treoDrawerService.registerComponent(this.name, this); } /** * On destroy */ ngOnDestroy(): void { // Deregister the drawer from the registry this._treoDrawerService.deregisterComponent(this.name); } // ----------------------------------------------------------------------------------------------------- // @ Private methods // ----------------------------------------------------------------------------------------------------- /** * Enable the animations * * @private */ private _enableAnimations(): void { // If the animations are already enabled, return... if ( this._animationsEnabled ) { return; } // Enable the animations this._animationsEnabled = true; } /** * Disable the animations * * @private */ private _disableAnimations(): void { // If the animations are already disabled, return... 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'); // Add a class to the backdrop element this._overlay.classList.add('treo-drawer-overlay'); // Add a class depending on the fixed option if ( this.fixed ) { this._overlay.classList.add('treo-drawer-overlay-fixed'); } // Add a class depending on the transparentOverlay option if ( this.transparentOverlay ) { this._overlay.classList.add('treo-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(); // Add a class this._renderer2.addClass(this._elementRef.nativeElement, 'treo-drawer-hover'); } /** * On mouseleave * * @private */ @HostListener('mouseleave') private _onMouseleave(): void { // Enable the animations this._enableAnimations(); // Remove the class this._renderer2.removeClass(this._elementRef.nativeElement, 'treo-drawer-hover'); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Open the drawer */ open(): void { // Enable the animations this._enableAnimations(); // Open this.opened = true; } /** * Close the drawer */ close(): void { // Enable the animations this._enableAnimations(); // Close this.opened = false; } /** * Toggle the opened status */ toggle(): void { // Toggle if ( this.opened ) { this.close(); } else { this.open(); } } } ================================================ FILE: webapp/frontend/src/@treo/components/drawer/drawer.module.ts ================================================ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { TreoDrawerComponent } from '@treo/components/drawer/drawer.component'; @NgModule({ declarations: [ TreoDrawerComponent ], imports : [ CommonModule ], exports : [ TreoDrawerComponent ] }) export class TreoDrawerModule { } ================================================ FILE: webapp/frontend/src/@treo/components/drawer/drawer.service.ts ================================================ import { Injectable } from '@angular/core'; import { TreoDrawerComponent } from '@treo/components/drawer/drawer.component'; @Injectable({ providedIn: 'root' }) export class TreoDrawerService { // Private private _componentRegistry: Map; /** * Constructor */ constructor() { // Set the defaults this._componentRegistry = new Map(); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Register drawer component * * @param name * @param component */ registerComponent(name: string, component: TreoDrawerComponent): 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): TreoDrawerComponent { return this._componentRegistry.get(name); } } ================================================ FILE: webapp/frontend/src/@treo/components/drawer/drawer.types.ts ================================================ export type TreoDrawerMode = 'over' | 'side'; export type TreoDrawerPosition = 'left' | 'right'; ================================================ FILE: webapp/frontend/src/@treo/components/drawer/index.ts ================================================ export * from '@treo/components/drawer/public-api'; ================================================ FILE: webapp/frontend/src/@treo/components/drawer/public-api.ts ================================================ export * from '@treo/components/drawer/drawer.component'; export * from '@treo/components/drawer/drawer.module'; export * from '@treo/components/drawer/drawer.service'; export * from '@treo/components/drawer/drawer.types'; ================================================ FILE: webapp/frontend/src/@treo/components/highlight/highlight.component.html ================================================
================================================ FILE: webapp/frontend/src/@treo/components/highlight/highlight.component.scss ================================================ textarea[treo-highlight] { display: none; } ================================================ FILE: webapp/frontend/src/@treo/components/highlight/highlight.component.ts ================================================ import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EmbeddedViewRef, Input, Renderer2, SecurityContext, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { TreoHighlightService } from '@treo/components/highlight/highlight.service'; @Component({ selector : 'textarea[treo-highlight]', templateUrl : './highlight.component.html', styleUrls : ['./highlight.component.scss'], encapsulation : ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs : 'treoHighlight' }) export class TreoHighlightComponent implements AfterViewInit { highlightedCode: string; viewRef: EmbeddedViewRef; @ViewChild(TemplateRef) templateRef: TemplateRef; // Private private _code: string; private _lang: string; /** * Constructor * * @param {TreoHighlightService} _treoHighlightService * @param {DomSanitizer} _domSanitizer * @param {ChangeDetectorRef} _changeDetectorRef * @param {ElementRef} _elementRef * @param {Renderer2} _renderer2 * @param {ViewContainerRef} _viewContainerRef */ constructor( private _treoHighlightService: TreoHighlightService, private _domSanitizer: DomSanitizer, private _changeDetectorRef: ChangeDetectorRef, private _elementRef: ElementRef, private _renderer2: Renderer2, private _viewContainerRef: ViewContainerRef ) { // Set the private defaults this._code = ''; this._lang = ''; } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Setter and getter for the code */ @Input() set code(value: string) { // If the value is the same, return... if ( this._code === value ) { return; } // Set the code this._code = value; // Highlight and insert the code if the // viewContainerRef is available. This will // ensure the highlightAndInsert method // won't run before the AfterContentInit hook. if ( this._viewContainerRef.length ) { this._highlightAndInsert(); } } get code(): string { return this._code; } /** * Setter and getter for the language */ @Input() set lang(value: string) { // If the value is the same, return... if ( this._lang === value ) { return; } // Set the language this._lang = value; // Highlight and insert the code if the // viewContainerRef is available. This will // ensure the highlightAndInsert method // won't run before the AfterContentInit hook. if ( this._viewContainerRef.length ) { this._highlightAndInsert(); } } get lang(): string { return this._lang; } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * 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 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(); } // Highlight and sanitize the code just in case this.highlightedCode = this._domSanitizer.sanitize(SecurityContext.HTML, this._treoHighlightService.highlight(this.code, this.lang)); // Render and insert the template this.viewRef = this._viewContainerRef.createEmbeddedView(this.templateRef, { highlightedCode: this.highlightedCode, lang : this.lang }); // Detect the changes this.viewRef.detectChanges(); } } ================================================ FILE: webapp/frontend/src/@treo/components/highlight/highlight.module.ts ================================================ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { TreoHighlightComponent } from '@treo/components/highlight/highlight.component'; @NgModule({ declarations : [ TreoHighlightComponent ], imports : [ CommonModule ], exports : [ TreoHighlightComponent ], entryComponents: [ TreoHighlightComponent ] }) export class TreoHighlightModule { } ================================================ FILE: webapp/frontend/src/@treo/components/highlight/highlight.service.ts ================================================ import { Injectable } from '@angular/core'; import * as hljs from 'highlight.js'; @Injectable({ providedIn: 'root' }) export class TreoHighlightService { /** * Constructor */ constructor() { } // ----------------------------------------------------------------------------------------------------- // @ 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 firstCharIndentation: number | null = null; // 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 to figure out the first // non-whitespace character indentation lines.forEach((line) => { // Skip the line if its length is zero if ( line.length === 0 ) { return; } // We look at all the lines to find the smallest indentation // of the first non-whitespace char since the first ever line // is not necessarily has to be the line with the smallest // non-whitespace char indentation firstCharIndentation = firstCharIndentation === null ? line.search(/\S|$/) : Math.min(line.search(/\S|$/), firstCharIndentation); }); // Iterate through the lines one more time, remove the extra // indentation, join them together and return it return lines.map((line) => { return line.substring(firstCharIndentation); }).join('\n'); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Highlight */ highlight(code: string, language: string): string { // Format the code code = this._format(code); // Highlight and return the code return hljs.highlight(language, code).value; } } ================================================ FILE: webapp/frontend/src/@treo/components/highlight/index.ts ================================================ export * from '@treo/components/highlight/public-api'; ================================================ FILE: webapp/frontend/src/@treo/components/highlight/public-api.ts ================================================ export * from '@treo/components/highlight/highlight.component'; export * from '@treo/components/highlight/highlight.module'; export * from '@treo/components/highlight/highlight.service'; ================================================ FILE: webapp/frontend/src/@treo/components/message/index.ts ================================================ export * from '@treo/components/message/public-api'; ================================================ FILE: webapp/frontend/src/@treo/components/message/message.component.html ================================================

================================================ FILE: webapp/frontend/src/@treo/components/message/message.component.scss ================================================ @import 'treo'; treo-message { display: block; // Show icon &.treo-message-show-icon { .treo-message-container { padding-left: 56px; } } // Dismissible &.treo-message-dismissible { .treo-message-container { padding-right: 56px; } } // Common .treo-message-container { position: relative; display: flex; min-height: 64px; padding: 16px 24px; font-size: 14px; line-height: 1; // Icon .treo-message-icon { position: absolute; top: 20px; left: 17px; .treo-message-custom-icon, .treo-message-default-icon { display: none; align-items: center; justify-content: center; border-radius: 50%; &:not(:empty) { display: flex; } } .treo-message-custom-icon { display: none; &:not(:empty) { display: flex; + .treo-message-default-icon { display: none; } } } } // Content .treo-message-content { display: flex; flex-direction: column; justify-content: center; line-height: 1; // Title .treo-message-title { display: none; font-size: 15px; font-weight: 600; line-height: 1.2; &:not(:empty) { display: block; } p { line-height: 1.625; } } // Message .treo-message-message { display: none; &:not(:empty) { display: block; } p { line-height: 1.625; } } } // Dismiss button .treo-message-dismiss-button { position: absolute; top: 12px; right: 12px; width: 32px !important; min-width: 32px !important; height: 32px !important; min-height: 32px !important; line-height: 32px !important; margin-left: auto; .mat-icon { @include treo-icon-size(20); } } } // Dismissible &:not(.treo-message-dismissible) { .treo-message-container { .treo-message-dismiss-button { display: none !important; } } } // Border &.treo-message-appearance-border { .treo-message-container { overflow: hidden; border-left-width: 4px; border-radius: 4px; @include treo-elevation('xl'); } } // Fill &.treo-message-appearance-fill { .treo-message-container { border-radius: 4px; } } // Outline &.treo-message-appearance-outline { .treo-message-container { overflow: hidden; border-radius: 4px; &:before { content: ''; position: absolute; top: 0; left: 0; bottom: 0; width: 6px; } } } } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $background: map-get($theme, background); $foreground: map-get($theme, foreground); $primary: map-get($theme, primary); $accent: map-get($theme, accent); $warn: map-get($theme, warn); $is-dark: map-get($theme, is-dark); treo-message { .treo-message-container { // Icon .mat-icon { color: currentColor; } } // Border &.treo-message-appearance-border { .treo-message-container { background: map-get($background, card); .treo-message-message { color: map-get($foreground, secondary-text); } } // Primary &.treo-message-type-primary { .treo-message-container { border-left-color: map-get($primary, default); .treo-message-title, .treo-message-icon { color: map-get($primary, default); } } } // Accent &.treo-message-type-accent { .treo-message-container { border-left-color: map-get($accent, default); .treo-message-title, .treo-message-icon { color: map-get($accent, default); } } } // Warn &.treo-message-type-warn { .treo-message-container { border-left-color: map-get($warn, default); .treo-message-title, .treo-message-icon { color: map-get($warn, default); } } } // Basic &.treo-message-type-basic { .treo-message-container { border-left-color: treo-color('cool-gray', 600); .treo-message-title, .treo-message-icon { color: treo-color('cool-gray', 600); } } } // Info &.treo-message-type-info { .treo-message-container { border-left-color: treo-color('blue', 600); .treo-message-title, .treo-message-icon { color: treo-color('blue', 700); } } } // Success &.treo-message-type-success { .treo-message-container { border-left-color: treo-color('green', 500); .treo-message-title, .treo-message-icon { color: treo-color('green', 500); } } } // Warning &.treo-message-type-warning { .treo-message-container { border-left-color: treo-color('yellow', 400); .treo-message-title, .treo-message-icon { color: treo-color('yellow', 400); } } } // Error &.treo-message-type-error { .treo-message-container { border-left-color: treo-color('red', 600); .treo-message-title, .treo-message-icon { color: treo-color('red', 700); } } } } // Fill &.treo-message-appearance-fill { // Primary &.treo-message-type-primary { .treo-message-container { background: map-get($primary, default); color: map-get($primary, default-contrast); code { background: map-get($primary, 600); color: map-get($primary, '600-contrast'); } } } // Accent &.treo-message-type-accent { .treo-message-container { background: map-get($accent, default); color: map-get($accent, default-contrast); code { background: map-get($accent, 600); color: map-get($accent, '600-contrast'); } } } // Warn &.treo-message-type-warn { .treo-message-container { background: map-get($warn, default); color: map-get($warn, default-contrast); code { background: map-get($warn, 800); color: map-get($warn, '800-contrast'); } } } // Basic &.treo-message-type-basic { .treo-message-container { background: treo-color('cool-gray', 500); color: treo-color('cool-gray', 50); code { background: treo-color('cool-gray', 600); color: treo-color('cool-gray', 50); } } } // Info &.treo-message-type-info { .treo-message-container { background: treo-color('blue', 600); color: treo-color('blue', 50); code { background: treo-color('blue', 800); color: treo-color('blue', 50); } } } // Success &.treo-message-type-success { .treo-message-container { background: treo-color('green', 500); color: treo-color('green', 50); code { background: treo-color('green', 600); color: treo-color('green', 50); } } } // Warning &.treo-message-type-warning { .treo-message-container { background: treo-color('yellow', 400); color: treo-color('yellow', 50); code { background: treo-color('yellow', 600); color: treo-color('yellow', 50); } } } // Error &.treo-message-type-error { .treo-message-container { background: treo-color('red', 600); color: treo-color('red', 50); code { background: treo-color('red', 800); color: treo-color('red', 50); } } } } // Outline &.treo-message-appearance-outline { // Primary &.treo-message-type-primary { .treo-message-container { @if ($is-dark) { background: transparent; color: map-get($primary, 300); box-shadow: inset 0 0 0 1px map-get($primary, 300); } @else { background: map-get($primary, 50); color: map-get($primary, 800); box-shadow: inset 0 0 0 1px map-get($primary, 400); } code { background: map-get($primary, 200); color: map-get($primary, 800); } } } // Accent &.treo-message-type-accent { .treo-message-container { @if ($is-dark) { background: transparent; color: map-get($accent, 300); box-shadow: inset 0 0 0 1px map-get($accent, 300); } @else { background: map-get($accent, 50); color: map-get($accent, 800); box-shadow: inset 0 0 0 1px map-get($accent, 400); } code { background: map-get($accent, 200); color: map-get($accent, 800); } } } // Warn &.treo-message-type-warn { .treo-message-container { @if ($is-dark) { background: transparent; color: map-get($warn, 300); box-shadow: inset 0 0 0 1px map-get($warn, 300); } @else { background: map-get($warn, 50); color: map-get($warn, 800); box-shadow: inset 0 0 0 1px map-get($warn, 400); } code { background: map-get($warn, 200); color: map-get($warn, 800); } } } // Basic &.treo-message-type-basic { .treo-message-container { @if ($is-dark) { background: transparent; color: treo-color('cool-gray', 300); box-shadow: inset 0 0 0 1px treo-color('cool-gray', 300); } @else { background: treo-color('cool-gray', 50); color: treo-color('cool-gray', 800); box-shadow: inset 0 0 0 1px treo-color('cool-gray', 400); } code { background: treo-color('cool-gray', 200); color: treo-color('cool-gray', 800); } } } // Info &.treo-message-type-info { .treo-message-container { @if ($is-dark) { background: transparent; color: treo-color('blue', 300); box-shadow: inset 0 0 0 1px treo-color('blue', 300); } @else { background: treo-color('blue', 50); color: treo-color('blue', 800); box-shadow: inset 0 0 0 1px treo-color('blue', 400); } code { background: treo-color('blue', 200); color: treo-color('blue', 800); } } } // Success &.treo-message-type-success { .treo-message-container { @if ($is-dark) { background: transparent; color: treo-color('green', 300); box-shadow: inset 0 0 0 1px treo-color('green', 300); } @else { background: treo-color('green', 50); color: treo-color('green', 800); box-shadow: inset 0 0 0 1px treo-color('green', 400); } code { background: treo-color('green', 200); color: treo-color('green', 800); } } } // Warning &.treo-message-type-warning { .treo-message-container { @if ($is-dark) { background: transparent; color: treo-color('yellow', 300); box-shadow: inset 0 0 0 1px treo-color('yellow', 300); } @else { background: treo-color('yellow', 50); color: treo-color('yellow', 800); box-shadow: inset 0 0 0 1px treo-color('yellow', 400); } code { background: treo-color('yellow', 200); color: treo-color('yellow', 800); } } } // Error &.treo-message-type-error { .treo-message-container { @if ($is-dark) { background: transparent; color: treo-color('red', 500); box-shadow: inset 0 0 0 1px treo-color('red', 500); } @else { background: treo-color('red', 50); color: treo-color('red', 800); box-shadow: inset 0 0 0 1px treo-color('red', 400); } code { background: treo-color('red', 200); color: treo-color('red', 800); } } } } } } ================================================ FILE: webapp/frontend/src/@treo/components/message/message.component.ts ================================================ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, Renderer2, ViewEncapsulation } from '@angular/core'; import { Subject } from 'rxjs'; import { filter, takeUntil } from 'rxjs/operators'; import { TreoAnimations } from '@treo/animations'; import { TreoMessageAppearance, TreoMessageType } from '@treo/components/message/message.types'; import { TreoMessageService } from '@treo/components/message/message.service'; @Component({ selector : 'treo-message', templateUrl : './message.component.html', styleUrls : ['./message.component.scss'], encapsulation : ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, animations : TreoAnimations, exportAs : 'treoMessage' }) export class TreoMessageComponent implements OnInit, OnDestroy { // Name @Input() name: string; @Output() readonly afterDismissed: EventEmitter; @Output() readonly afterShown: EventEmitter; // Private private _appearance: TreoMessageAppearance; private _dismissed: null | boolean; private _showIcon: boolean; private _type: TreoMessageType; private _unsubscribeAll: Subject; /** * Constructor * * @param {TreoMessageService} _treoMessageService * @param {ChangeDetectorRef} _changeDetectorRef * @param {ElementRef} _elementRef * @param {Renderer2} _renderer2 */ constructor( private _treoMessageService: TreoMessageService, private _changeDetectorRef: ChangeDetectorRef, private _elementRef: ElementRef, private _renderer2: Renderer2 ) { // Set the private defaults this._unsubscribeAll = new Subject(); // Set the defaults this.afterDismissed = new EventEmitter(); this.afterShown = new EventEmitter(); this.appearance = 'fill'; this.dismissed = null; this.showIcon = true; this.type = 'primary'; } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Setter and getter for appearance * * @param value */ @Input() set appearance(value: TreoMessageAppearance) { // If the value is the same, return... if ( this._appearance === value ) { return; } // Update the class name this._renderer2.removeClass(this._elementRef.nativeElement, 'treo-message-appearance-' + this.appearance); this._renderer2.addClass(this._elementRef.nativeElement, 'treo-message-appearance-' + value); // Store the value this._appearance = value; } get appearance(): TreoMessageAppearance { return this._appearance; } /** * Setter and getter for dismissed * * @param value */ @Input() set dismissed(value: null | boolean) { // If the value is the same, return... if ( this._dismissed === value ) { return; } // Update the class name if ( value === null ) { this._renderer2.removeClass(this._elementRef.nativeElement, 'treo-message-dismissible'); } else if ( value === false ) { this._renderer2.addClass(this._elementRef.nativeElement, 'treo-message-dismissible'); this._renderer2.addClass(this._elementRef.nativeElement, 'treo-message-dismissed'); } else { this._renderer2.addClass(this._elementRef.nativeElement, 'treo-message-dismissible'); this._renderer2.removeClass(this._elementRef.nativeElement, 'treo-message-dismissed'); } // Store the value this._dismissed = value; } get dismissed(): null | boolean { return this._dismissed; } /** * Setter and getter for show icon * * @param value */ @Input() set showIcon(value: boolean) { // If the value is the same, return... if ( this._showIcon === value ) { return; } // Update the class name if ( value ) { this._renderer2.addClass(this._elementRef.nativeElement, 'treo-message-show-icon'); } else { this._renderer2.removeClass(this._elementRef.nativeElement, 'treo-message-show-icon'); } // Store the value this._showIcon = value; } get showIcon(): boolean { return this._showIcon; } /** * Setter and getter for type * * @param value */ @Input() set type(value: TreoMessageType) { // If the value is the same, return... if ( this._type === value ) { return; } // Update the class name this._renderer2.removeClass(this._elementRef.nativeElement, 'treo-message-type-' + this.type); this._renderer2.addClass(this._elementRef.nativeElement, 'treo-message-type-' + value); // Store the value this._type = value; } get type(): TreoMessageType { return this._type; } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Subscribe to the service calls if only // a name provided for the message box if ( this.name ) { // Subscribe to the dismiss calls this._treoMessageService.onDismiss .pipe( filter((name) => this.name === name), takeUntil(this._unsubscribeAll) ) .subscribe(() => { // Dismiss the message box this.dismiss(); }); // Subscribe to the show calls this._treoMessageService.onShow .pipe( filter((name) => this.name === name), takeUntil(this._unsubscribeAll) ) .subscribe(() => { // Show the message box this.show(); }); } } /** * On destroy */ ngOnDestroy(): void { // Unsubscribe from all subscriptions this._unsubscribeAll.next(); this._unsubscribeAll.complete(); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Dismiss the message box */ dismiss(): void { // Return, if already dismissed if ( this.dismissed ) { return; } // Dismiss this.dismissed = true; // Execute the observable this.afterDismissed.next(true); // Notify the change detector this._changeDetectorRef.markForCheck(); } /** * Show the dismissed message box */ show(): void { // Return, if not dismissed if ( !this.dismissed ) { return; } // Show this.dismissed = false; // Execute the observable this.afterShown.next(true); // Notify the change detector this._changeDetectorRef.markForCheck(); } } ================================================ FILE: webapp/frontend/src/@treo/components/message/message.module.ts ================================================ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { TreoMessageComponent } from '@treo/components/message/message.component'; @NgModule({ declarations: [ TreoMessageComponent ], imports : [ CommonModule, MatButtonModule, MatIconModule ], exports : [ TreoMessageComponent ] }) export class TreoMessageModule { } ================================================ FILE: webapp/frontend/src/@treo/components/message/message.service.ts ================================================ import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class TreoMessageService { // Private private _onDismiss: BehaviorSubject; private _onShow: BehaviorSubject; /** * Constructor */ constructor() { // Set the private defaults this._onDismiss = new BehaviorSubject(null); this._onShow = new BehaviorSubject(null); } // ----------------------------------------------------------------------------------------------------- // @ 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 message box * * @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 message box * * @param name */ show(name: string): void { // Return, if the name is not provided if ( !name ) { return; } // Execute the observable this._onShow.next(name); } } ================================================ FILE: webapp/frontend/src/@treo/components/message/message.types.ts ================================================ export type TreoMessageAppearance = 'border' | 'fill' | 'outline'; export type TreoMessageType = 'primary' | 'accent' | 'warn' | 'basic' | 'info' | 'success' | 'warning' | 'error'; ================================================ FILE: webapp/frontend/src/@treo/components/message/public-api.ts ================================================ export * from '@treo/components/message/message.component'; export * from '@treo/components/message/message.module'; export * from '@treo/components/message/message.service'; export * from '@treo/components/message/message.types'; ================================================ FILE: webapp/frontend/src/@treo/components/navigation/horizontal/components/basic/basic.component.html ================================================
{{item.title}}
{{item.subtitle}}
{{item.badge.title}}
================================================ FILE: webapp/frontend/src/@treo/components/navigation/horizontal/components/basic/basic.component.ts ================================================ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { TreoHorizontalNavigationComponent } from '@treo/components/navigation/horizontal/horizontal.component'; import { TreoNavigationService } from '@treo/components/navigation/navigation.service'; import { TreoNavigationItem } from '@treo/components/navigation/navigation.types'; @Component({ selector : 'treo-horizontal-navigation-basic-item', templateUrl : './basic.component.html', styles : [], changeDetection: ChangeDetectionStrategy.OnPush }) export class TreoHorizontalNavigationBasicItemComponent implements OnInit, OnDestroy { // Item @Input() item: TreoNavigationItem; // Name @Input() name: string; // Private private _treoHorizontalNavigationComponent: TreoHorizontalNavigationComponent; private _unsubscribeAll: Subject; /** * Constructor * * @param {TreoNavigationService} _treoNavigationService * @param {ChangeDetectorRef} _changeDetectorRef */ constructor( private _treoNavigationService: TreoNavigationService, private _changeDetectorRef: ChangeDetectorRef ) { // Set the private defaults this._unsubscribeAll = new Subject(); } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Get the parent navigation component this._treoHorizontalNavigationComponent = this._treoNavigationService.getComponent(this.name); // Subscribe to onRefreshed on the navigation component this._treoHorizontalNavigationComponent.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(); } } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/horizontal/components/branch/branch.component.html ================================================
{{item.title}}
{{item.subtitle}}
{{item.badge.title}}
================================================ FILE: webapp/frontend/src/@treo/components/navigation/horizontal/components/branch/branch.component.ts ================================================ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { MatMenu } from '@angular/material/menu'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { TreoHorizontalNavigationComponent } from '@treo/components/navigation/horizontal/horizontal.component'; import { TreoNavigationService } from '@treo/components/navigation/navigation.service'; import { TreoNavigationItem } from '@treo/components/navigation/navigation.types'; @Component({ selector : 'treo-horizontal-navigation-branch-item', templateUrl : './branch.component.html', styles : [], changeDetection: ChangeDetectionStrategy.OnPush }) export class TreoHorizontalNavigationBranchItemComponent implements OnInit, OnDestroy { // Child @Input() child: boolean; // Item @Input() item: TreoNavigationItem; // Mat menu @ViewChild('matMenu', {static: true}) matMenu: MatMenu; // Name @Input() name: string; // Private private _treoHorizontalNavigationComponent: TreoHorizontalNavigationComponent; private _unsubscribeAll: Subject; /** * Constructor * * @param {TreoNavigationService} _treoNavigationService * @param {ChangeDetectorRef} _changeDetectorRef */ constructor( private _treoNavigationService: TreoNavigationService, private _changeDetectorRef: ChangeDetectorRef ) { // Set the private defaults this._unsubscribeAll = new Subject(); // Set the defaults this.child = false; } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Get the parent navigation component this._treoHorizontalNavigationComponent = this._treoNavigationService.getComponent(this.name); // Subscribe to onRefreshed on the navigation component this._treoHorizontalNavigationComponent.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(); } } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/horizontal/components/divider/divider.component.html ================================================
================================================ FILE: webapp/frontend/src/@treo/components/navigation/horizontal/components/divider/divider.component.ts ================================================ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { TreoHorizontalNavigationComponent } from '@treo/components/navigation/horizontal/horizontal.component'; import { TreoNavigationService } from '@treo/components/navigation/navigation.service'; import { TreoNavigationItem } from '@treo/components/navigation/navigation.types'; @Component({ selector : 'treo-horizontal-navigation-divider-item', templateUrl : './divider.component.html', styles : [], changeDetection: ChangeDetectionStrategy.OnPush }) export class TreoHorizontalNavigationDividerItemComponent implements OnInit, OnDestroy { // Item @Input() item: TreoNavigationItem; // Name @Input() name: string; // Private private _treoHorizontalNavigationComponent: TreoHorizontalNavigationComponent; private _unsubscribeAll: Subject; /** * Constructor * * @param {TreoNavigationService} _treoNavigationService * @param {ChangeDetectorRef} _changeDetectorRef */ constructor( private _treoNavigationService: TreoNavigationService, private _changeDetectorRef: ChangeDetectorRef ) { // Set the private defaults this._unsubscribeAll = new Subject(); } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Get the parent navigation component this._treoHorizontalNavigationComponent = this._treoNavigationService.getComponent(this.name); // Subscribe to onRefreshed on the navigation component this._treoHorizontalNavigationComponent.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(); } } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/horizontal/components/spacer/spacer.component.html ================================================
================================================ FILE: webapp/frontend/src/@treo/components/navigation/horizontal/components/spacer/spacer.component.ts ================================================ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; import { takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; import { TreoHorizontalNavigationComponent } from '@treo/components/navigation/horizontal/horizontal.component'; import { TreoNavigationService } from '@treo/components/navigation/navigation.service'; import { TreoNavigationItem } from '@treo/components/navigation/navigation.types'; @Component({ selector : 'treo-horizontal-navigation-spacer-item', templateUrl : './spacer.component.html', styles : [], changeDetection: ChangeDetectionStrategy.OnPush }) export class TreoHorizontalNavigationSpacerItemComponent implements OnInit, OnDestroy { // Item @Input() item: TreoNavigationItem; // Name @Input() name: string; // Private private _treoHorizontalNavigationComponent: TreoHorizontalNavigationComponent; private _unsubscribeAll: Subject; /** * Constructor * * @param {TreoNavigationService} _treoNavigationService * @param {ChangeDetectorRef} _changeDetectorRef */ constructor( private _treoNavigationService: TreoNavigationService, private _changeDetectorRef: ChangeDetectorRef ) { // Set the private defaults this._unsubscribeAll = new Subject(); } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Get the parent navigation component this._treoHorizontalNavigationComponent = this._treoNavigationService.getComponent(this.name); // Subscribe to onRefreshed on the navigation component this._treoHorizontalNavigationComponent.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(); } } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/horizontal/horizontal.component.html ================================================
================================================ FILE: webapp/frontend/src/@treo/components/navigation/horizontal/horizontal.component.scss ================================================ @import 'treo'; // Root navigation specific treo-horizontal-navigation { .treo-horizontal-navigation-wrapper { display: flex; align-items: center; // Basic, Branch treo-horizontal-navigation-basic-item, treo-horizontal-navigation-branch-item { .treo-horizontal-navigation-item-wrapper { border-radius: 4px; overflow: hidden; .treo-horizontal-navigation-item { padding: 0 16px; cursor: pointer; user-select: none; .treo-horizontal-navigation-item-icon { margin-right: 12px; } } } } // Spacer treo-horizontal-navigation-spacer-item { margin: 12px 0; } } } // Menu panel specific .treo-horizontal-navigation-menu-panel { .treo-horizontal-navigation-menu-item { height: auto; min-height: 0; line-height: normal; white-space: normal; // Basic, Branch treo-horizontal-navigation-basic-item, treo-horizontal-navigation-branch-item, treo-horizontal-navigation-divider-item { display: flex; flex: 1 1 auto; } // Divider treo-horizontal-navigation-divider-item { margin: 8px -16px; .treo-horizontal-navigation-item-wrapper { height: 1px; box-shadow: 0 1px 0 0; } } } } // Navigation menu item common .treo-horizontal-navigation-menu-item { .treo-horizontal-navigation-item-wrapper { width: 100%; &.treo-horizontal-navigation-item-has-subtitle { .treo-horizontal-navigation-item { min-height: 56px; } } .treo-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; .treo-horizontal-navigation-item-title-wrapper { .treo-horizontal-navigation-item-subtitle { font-size: 12px; } } .treo-horizontal-navigation-item-badge { margin-left: auto; .treo-horizontal-navigation-item-badge-content { display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 700; white-space: nowrap; width: 20px; height: 20px; border-radius: 50%; // Rectangle &.treo-horizontal-navigation-item-badge-style-rectangle { width: auto; min-width: 24px; height: 20px; line-height: normal; padding: 0 6px; border-radius: 4px; } // Rounded &.treo-horizontal-navigation-item-badge-style-rounded { width: auto; min-width: 24px; height: 20px; line-height: normal; padding: 0 10px; border-radius: 12px; } // Simple &.treo-horizontal-navigation-item-badge-style-simple { width: auto; font-size: 11px; background-color: transparent !important; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $background: map-get($theme, background); $primary: map-get($theme, primary); $is-dark: map-get($theme, is-dark); // Root navigation specific treo-horizontal-navigation { .treo-horizontal-navigation-wrapper { // Basic, Branch treo-horizontal-navigation-basic-item, treo-horizontal-navigation-branch-item { @include treo-breakpoint('gt-xs') { &:hover { .treo-horizontal-navigation-item-wrapper { background: map-get($background, hover); } } } } // Basic - When item active (current link) treo-horizontal-navigation-basic-item { .treo-horizontal-navigation-item-active { .treo-horizontal-navigation-item-title { color: map-get($primary, default) !important; } .treo-horizontal-navigation-item-subtitle { @if ($is-dark) { color: map-get($primary, 600) !important; } @else { color: map-get($primary, 400) !important; } } .treo-horizontal-navigation-item-icon { color: map-get($primary, default) !important; } } } // Branch - When menu open treo-horizontal-navigation-branch-item { .treo-horizontal-navigation-menu-active { .treo-horizontal-navigation-item-wrapper { background: map-get($background, hover); } } } } } // Navigation menu item common .treo-horizontal-navigation-menu-item { // Basic - When item active (current link) treo-horizontal-navigation-basic-item { .treo-horizontal-navigation-item-active { .treo-horizontal-navigation-item-title { color: map-get($primary, default) !important; } .treo-horizontal-navigation-item-subtitle { @if ($is-dark) { color: map-get($primary, 600) !important; } @else { color: map-get($primary, 400) !important; } } .treo-horizontal-navigation-item-icon { color: map-get($primary, default) !important; } } } } } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/horizontal/horizontal.component.ts ================================================ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; import { BehaviorSubject, Subject } from 'rxjs'; import { TreoAnimations } from '@treo/animations'; import { TreoNavigationItem } from '@treo/components/navigation/navigation.types'; import { TreoNavigationService } from '@treo/components/navigation/navigation.service'; @Component({ selector : 'treo-horizontal-navigation', templateUrl : './horizontal.component.html', styleUrls : ['./horizontal.component.scss'], animations : TreoAnimations, encapsulation : ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs : 'treoHorizontalNavigation' }) export class TreoHorizontalNavigationComponent implements OnInit, OnDestroy { onRefreshed: BehaviorSubject; // Name @Input() name: string; // Private private _navigation: TreoNavigationItem[]; private _unsubscribeAll: Subject; /** * Constructor * * @param {TreoNavigationService} _treoNavigationService * @param {ChangeDetectorRef} _changeDetectorRef */ constructor( private _treoNavigationService: TreoNavigationService, private _changeDetectorRef: ChangeDetectorRef ) { // Set the private defaults this._unsubscribeAll = new Subject(); // Set the defaults this.onRefreshed = new BehaviorSubject(null); } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Setter & getter for data */ @Input() set navigation(value: TreoNavigationItem[]) { // Store the data this._navigation = value; // Mark for check this._changeDetectorRef.markForCheck(); } get navigation(): TreoNavigationItem[] { return this._navigation; } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Register the navigation component this._treoNavigationService.registerComponent(this.name, this); } /** * On destroy */ ngOnDestroy(): void { // Deregister the navigation component from the registry this._treoNavigationService.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; } } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/index.ts ================================================ export * from '@treo/components/navigation/public-api'; ================================================ FILE: webapp/frontend/src/@treo/components/navigation/navigation.module.ts ================================================ 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 { TreoScrollbarModule } from '@treo/directives/scrollbar/public-api'; import { TreoHorizontalNavigationBasicItemComponent } from '@treo/components/navigation/horizontal/components/basic/basic.component'; import { TreoHorizontalNavigationBranchItemComponent } from '@treo/components/navigation/horizontal/components/branch/branch.component'; import { TreoHorizontalNavigationDividerItemComponent } from '@treo/components/navigation/horizontal/components/divider/divider.component'; import { TreoHorizontalNavigationSpacerItemComponent } from '@treo/components/navigation/horizontal/components/spacer/spacer.component'; import { TreoHorizontalNavigationComponent } from '@treo/components/navigation/horizontal/horizontal.component'; import { TreoVerticalNavigationAsideItemComponent } from '@treo/components/navigation/vertical/components/aside/aside.component'; import { TreoVerticalNavigationBasicItemComponent } from '@treo/components/navigation/vertical/components/basic/basic.component'; import { TreoVerticalNavigationCollapsableItemComponent } from '@treo/components/navigation/vertical/components/collapsable/collapsable.component'; import { TreoVerticalNavigationDividerItemComponent } from '@treo/components/navigation/vertical/components/divider/divider.component'; import { TreoVerticalNavigationGroupItemComponent } from '@treo/components/navigation/vertical/components/group/group.component'; import { TreoVerticalNavigationSpacerItemComponent } from '@treo/components/navigation/vertical/components/spacer/spacer.component'; import { TreoVerticalNavigationComponent } from '@treo/components/navigation/vertical/vertical.component'; @NgModule({ declarations: [ TreoHorizontalNavigationBasicItemComponent, TreoHorizontalNavigationBranchItemComponent, TreoHorizontalNavigationDividerItemComponent, TreoHorizontalNavigationSpacerItemComponent, TreoHorizontalNavigationComponent, TreoVerticalNavigationAsideItemComponent, TreoVerticalNavigationBasicItemComponent, TreoVerticalNavigationCollapsableItemComponent, TreoVerticalNavigationDividerItemComponent, TreoVerticalNavigationGroupItemComponent, TreoVerticalNavigationSpacerItemComponent, TreoVerticalNavigationComponent ], imports : [ CommonModule, RouterModule, MatButtonModule, MatDividerModule, MatIconModule, MatMenuModule, MatTooltipModule, TreoScrollbarModule ], exports : [ TreoHorizontalNavigationComponent, TreoVerticalNavigationComponent ] }) export class TreoNavigationModule { } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/navigation.service.ts ================================================ import { Injectable } from '@angular/core'; import { TreoNavigationItem } from '@treo/components/navigation/navigation.types'; @Injectable({ providedIn: 'root' }) export class TreoNavigationService { // Private private _componentRegistry: Map; private _navigationStore: Map; /** * Constructor */ constructor() { // Set the private defaults this._componentRegistry = new Map(); this._navigationStore = new Map(); } // ----------------------------------------------------------------------------------------------------- // @ 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: TreoNavigationItem[]): void { // Add to the store this._navigationStore.set(key, navigation); } /** * Get navigation from storage by key * * @param key * @returns {any} */ getNavigation(key: string): TreoNavigationItem[] { 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 {TreoNavigationItem[]} */ getFlatNavigation(navigation: TreoNavigationItem[], flatNavigation: TreoNavigationItem[] = []): TreoNavigationItem[] { 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: TreoNavigationItem[]): TreoNavigationItem | 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: TreoNavigationItem[], parent: TreoNavigationItem[] | TreoNavigationItem ): TreoNavigationItem[] | TreoNavigationItem | 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; } } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/navigation.types.ts ================================================ export interface TreoNavigationItem { id?: string; title?: string; subtitle?: string; type: 'aside' | 'basic' | 'collapsable' | 'divider' | 'group' | 'spacer'; hidden?: (item: TreoNavigationItem) => boolean; disabled?: boolean; link?: string; externalLink?: boolean; exactMatch?: boolean; function?: (item: TreoNavigationItem) => void; classes?: string; icon?: string; iconClasses?: string; badge?: { title?: string; style?: 'rectangle' | 'rounded' | 'simple', background?: string; color?: string; }; children?: TreoNavigationItem[]; meta?: any; } export type TreoVerticalNavigationAppearance = string; export type TreoVerticalNavigationMode = 'over' | 'side'; export type TreoVerticalNavigationPosition = 'left' | 'right'; ================================================ FILE: webapp/frontend/src/@treo/components/navigation/public-api.ts ================================================ export * from '@treo/components/navigation/horizontal/horizontal.component'; export * from '@treo/components/navigation/vertical/vertical.component'; export * from '@treo/components/navigation/navigation.module'; export * from '@treo/components/navigation/navigation.service'; export * from '@treo/components/navigation/navigation.types'; ================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/components/aside/aside.component.html ================================================
{{item.title}}
{{item.subtitle}}
{{item.badge.title}}
================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/components/aside/aside.component.ts ================================================ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { TreoVerticalNavigationComponent } from '@treo/components/navigation/vertical/vertical.component'; import { TreoNavigationService } from '@treo/components/navigation/navigation.service'; import { TreoNavigationItem } from '@treo/components/navigation/navigation.types'; @Component({ selector : 'treo-vertical-navigation-aside-item', templateUrl : './aside.component.html', styles : [], changeDetection: ChangeDetectionStrategy.OnPush }) export class TreoVerticalNavigationAsideItemComponent implements OnInit, OnDestroy { // Active @Input() active: boolean; // Auto collapse @Input() autoCollapse: boolean; // Item @Input() item: TreoNavigationItem; // Name @Input() name: string; // Skip children @Input() skipChildren: boolean; // Private private _treoVerticalNavigationComponent: TreoVerticalNavigationComponent; private _unsubscribeAll: Subject; /** * Constructor * * @param {TreoNavigationService} _treoNavigationService * @param {ChangeDetectorRef} _changeDetectorRef */ constructor( private _treoNavigationService: TreoNavigationService, private _changeDetectorRef: ChangeDetectorRef ) { // Set the private defaults this._unsubscribeAll = new Subject(); // Set the defaults this.skipChildren = false; } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Get the parent navigation component this._treoVerticalNavigationComponent = this._treoNavigationService.getComponent(this.name); // Subscribe to onRefreshed on the navigation component this._treoVerticalNavigationComponent.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; } } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/components/basic/basic.component.html ================================================
{{item.title}}
{{item.subtitle}}
{{item.badge.title}}
================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/components/basic/basic.component.ts ================================================ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { TreoVerticalNavigationComponent } from '@treo/components/navigation/vertical/vertical.component'; import { TreoNavigationService } from '@treo/components/navigation/navigation.service'; import { TreoNavigationItem } from '@treo/components/navigation/navigation.types'; @Component({ selector : 'treo-vertical-navigation-basic-item', templateUrl : './basic.component.html', styles : [], changeDetection: ChangeDetectionStrategy.OnPush }) export class TreoVerticalNavigationBasicItemComponent implements OnInit, OnDestroy { // Item @Input() item: TreoNavigationItem; // Name @Input() name: string; // Private private _treoVerticalNavigationComponent: TreoVerticalNavigationComponent; private _unsubscribeAll: Subject; /** * Constructor * * @param {TreoNavigationService} _treoNavigationService * @param {ChangeDetectorRef} _changeDetectorRef */ constructor( private _treoNavigationService: TreoNavigationService, private _changeDetectorRef: ChangeDetectorRef ) { // Set the private defaults this._unsubscribeAll = new Subject(); } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Get the parent navigation component this._treoVerticalNavigationComponent = this._treoNavigationService.getComponent(this.name); // Subscribe to onRefreshed on the navigation component this._treoVerticalNavigationComponent.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(); } } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/components/collapsable/collapsable.component.html ================================================
{{item.title}}
{{item.subtitle}}
{{item.badge.title}}
================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/components/collapsable/collapsable.component.ts ================================================ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostBinding, Input, OnDestroy, OnInit } from '@angular/core'; import { NavigationEnd, Router } from '@angular/router'; import { Subject } from 'rxjs'; import { filter, takeUntil } from 'rxjs/operators'; import { TreoAnimations } from '@treo/animations'; import { TreoVerticalNavigationComponent } from '@treo/components/navigation/vertical/vertical.component'; import { TreoNavigationService } from '@treo/components/navigation/navigation.service'; import { TreoNavigationItem } from '@treo/components/navigation/navigation.types'; @Component({ selector : 'treo-vertical-navigation-collapsable-item', templateUrl : './collapsable.component.html', styles : [], animations : TreoAnimations, changeDetection: ChangeDetectionStrategy.OnPush }) export class TreoVerticalNavigationCollapsableItemComponent implements OnInit, OnDestroy { // Auto collapse @Input() autoCollapse: boolean; // Item @Input() item: TreoNavigationItem; // Collapsed @HostBinding('class.treo-vertical-navigation-item-collapsed') isCollapsed: boolean; // Expanded @HostBinding('class.treo-vertical-navigation-item-expanded') isExpanded: boolean; // Name @Input() name: string; // Private private _treoVerticalNavigationComponent: TreoVerticalNavigationComponent; private _unsubscribeAll: Subject; /** * Constructor * * @param {TreoNavigationService} _treoNavigationService * @param {ChangeDetectorRef} _changeDetectorRef * @param {Router} _router */ constructor( private _treoNavigationService: TreoNavigationService, private _changeDetectorRef: ChangeDetectorRef, private _router: Router ) { // Set the private defaults this._unsubscribeAll = new Subject(); // Set the defaults this.isCollapsed = true; this.isExpanded = false; } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Get the parent navigation component this._treoVerticalNavigationComponent = this._treoNavigationService.getComponent(this.name); // If the item has a children that has a matching url with the current url, expand... if ( this._hasCurrentUrlInChildren(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._treoVerticalNavigationComponent.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._treoVerticalNavigationComponent.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._hasCurrentUrlInChildren(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 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._hasCurrentUrlInChildren(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._treoVerticalNavigationComponent.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 url * @private */ private _hasCurrentUrlInChildren(item, url): boolean { const children = item.children; if ( !children ) { return false; } for ( const child of children ) { if ( child.children ) { if ( this._hasCurrentUrlInChildren(child, url) ) { return true; } } // Check if the item's link is the exact same of the // current url if ( child.link === url ) { return true; } // If exactMatch is not set for the item, also check // if the current url starts with the item's link and // continues with a question mark, a pound sign or a // slash if ( !child.exactMatch && (child.link === url || url.startsWith(child.link + '?') || url.startsWith(child.link + '#') || url.startsWith(child.link + '/')) ) { return true; } } return false; } /** * Check if this is a children * of the given item * * @param parent * @param item * @return {boolean} * @private */ private _isChildrenOf(parent, item): 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 = false; // Mark for check this._changeDetectorRef.markForCheck(); // Execute the observable this._treoVerticalNavigationComponent.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 = true; // Mark for check this._changeDetectorRef.markForCheck(); // Execute the observable this._treoVerticalNavigationComponent.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; } } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/components/divider/divider.component.html ================================================
================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/components/divider/divider.component.ts ================================================ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { TreoVerticalNavigationComponent } from '@treo/components/navigation/vertical/vertical.component'; import { TreoNavigationService } from '@treo/components/navigation/navigation.service'; import { TreoNavigationItem } from '@treo/components/navigation/navigation.types'; @Component({ selector : 'treo-vertical-navigation-divider-item', templateUrl : './divider.component.html', styles : [], changeDetection: ChangeDetectionStrategy.OnPush }) export class TreoVerticalNavigationDividerItemComponent implements OnInit, OnDestroy { // Item @Input() item: TreoNavigationItem; // Name @Input() name: string; // Private private _treoVerticalNavigationComponent: TreoVerticalNavigationComponent; private _unsubscribeAll: Subject; /** * Constructor * * @param {TreoNavigationService} _treoNavigationService * @param {ChangeDetectorRef} _changeDetectorRef */ constructor( private _treoNavigationService: TreoNavigationService, private _changeDetectorRef: ChangeDetectorRef ) { // Set the private defaults this._unsubscribeAll = new Subject(); } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Get the parent navigation component this._treoVerticalNavigationComponent = this._treoNavigationService.getComponent(this.name); // Subscribe to onRefreshed on the navigation component this._treoVerticalNavigationComponent.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(); } } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/components/group/group.component.html ================================================
{{item.title}}
{{item.subtitle}}
{{item.badge.title}}
================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/components/group/group.component.ts ================================================ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { TreoVerticalNavigationComponent } from '@treo/components/navigation/vertical/vertical.component'; import { TreoNavigationService } from '@treo/components/navigation/navigation.service'; import { TreoNavigationItem } from '@treo/components/navigation/navigation.types'; @Component({ selector : 'treo-vertical-navigation-group-item', templateUrl : './group.component.html', styles : [], changeDetection: ChangeDetectionStrategy.OnPush }) export class TreoVerticalNavigationGroupItemComponent implements OnInit, OnDestroy { // Auto collapse @Input() autoCollapse: boolean; // Item @Input() item: TreoNavigationItem; // Name @Input() name: string; // Private private _treoVerticalNavigationComponent: TreoVerticalNavigationComponent; private _unsubscribeAll: Subject; /** * Constructor * * @param {TreoNavigationService} _treoNavigationService * @param {ChangeDetectorRef} _changeDetectorRef */ constructor( private _treoNavigationService: TreoNavigationService, private _changeDetectorRef: ChangeDetectorRef ) { // Set the private defaults this._unsubscribeAll = new Subject(); } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Get the parent navigation component this._treoVerticalNavigationComponent = this._treoNavigationService.getComponent(this.name); // Subscribe to onRefreshed on the navigation component this._treoVerticalNavigationComponent.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; } } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/components/spacer/spacer.component.html ================================================
================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/components/spacer/spacer.component.ts ================================================ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; import { takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; import { TreoVerticalNavigationComponent } from '@treo/components/navigation/vertical/vertical.component'; import { TreoNavigationService } from '@treo/components/navigation/navigation.service'; import { TreoNavigationItem } from '@treo/components/navigation/navigation.types'; @Component({ selector : 'treo-vertical-navigation-spacer-item', templateUrl : './spacer.component.html', styles : [], changeDetection: ChangeDetectionStrategy.OnPush }) export class TreoVerticalNavigationSpacerItemComponent implements OnInit, OnDestroy { // Item @Input() item: TreoNavigationItem; // Name @Input() name: string; // Private private _treoVerticalNavigationComponent: TreoVerticalNavigationComponent; private _unsubscribeAll: Subject; /** * Constructor * * @param {TreoNavigationService} _treoNavigationService * @param {ChangeDetectorRef} _changeDetectorRef */ constructor( private _treoNavigationService: TreoNavigationService, private _changeDetectorRef: ChangeDetectorRef ) { // Set the private defaults this._unsubscribeAll = new Subject(); } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Get the parent navigation component this._treoVerticalNavigationComponent = this._treoNavigationService.getComponent(this.name); // Subscribe to onRefreshed on the navigation component this._treoVerticalNavigationComponent.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(); } } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/vertical.component.html ================================================
================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/vertical.component.scss ================================================ @import 'treo'; $treo-vertical-navigation-width: 280; treo-vertical-navigation { position: sticky; display: flex; flex-direction: column; flex: 1 0 auto; top: 0; width: #{$treo-vertical-navigation-width}px; min-width: #{$treo-vertical-navigation-width}px; max-width: #{$treo-vertical-navigation-width}px; height: 100vh; min-height: 100vh; max-height: 100vh; z-index: 200; // ----------------------------------------------------------------------------------------------------- // @ Navigation Drawer // ----------------------------------------------------------------------------------------------------- // Animations &.treo-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 .treo-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 &.treo-vertical-navigation-mode-over { position: fixed; top: 0; bottom: 0; } // Left position &.treo-vertical-navigation-position-left { // Side mode &.treo-vertical-navigation-mode-side { margin-left: -#{$treo-vertical-navigation-width}px; &.treo-vertical-navigation-opened { margin-left: 0; } } // Over mode &.treo-vertical-navigation-mode-over { left: 0; transform: translate3d(-100%, 0, 0); &.treo-vertical-navigation-opened { transform: translate3d(0, 0, 0); } } // Wrapper .treo-vertical-navigation-wrapper { left: 0; } } // Right position &.treo-vertical-navigation-position-right { // Side mode &.treo-vertical-navigation-mode-side { margin-right: -#{$treo-vertical-navigation-width}px; &.treo-vertical-navigation-opened { margin-right: 0; } } // Over mode &.treo-vertical-navigation-mode-over { right: 0; transform: translate3d(100%, 0, 0); &.treo-vertical-navigation-opened { transform: translate3d(0, 0, 0); } } // Wrapper .treo-vertical-navigation-wrapper { right: 0; } } // Wrapper .treo-vertical-navigation-wrapper { position: absolute; display: flex; flex: 1 1 auto; flex-direction: column; top: 0; bottom: 0; width: 100%; height: 100%; border-right-width: 1px; overflow: hidden; z-index: 10; // Header .treo-vertical-navigation-header { } // Content .treo-vertical-navigation-content { flex: 1 1 auto; overflow-x: hidden; overflow-y: auto; // Divider > treo-vertical-navigation-divider-item { margin: 24px 0; } // Group > treo-vertical-navigation-group-item { margin-top: 24px; } } // Footer .treo-vertical-navigation-footer { } } // Aside wrapper .treo-vertical-navigation-aside-wrapper { position: absolute; display: flex; flex: 1 1 auto; flex-direction: column; top: 0; bottom: 0; left: #{$treo-vertical-navigation-width}px; width: #{$treo-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); > treo-vertical-navigation-aside-item { padding: 24px 0; // First item of the aside > .treo-vertical-navigation-item-wrapper { display: none !important; } } } &.treo-vertical-navigation-position-right { .treo-vertical-navigation-aside-wrapper { left: auto; right: #{$treo-vertical-navigation-width}px; } } // ----------------------------------------------------------------------------------------------------- // @ Navigation Items // ----------------------------------------------------------------------------------------------------- // Navigation items common treo-vertical-navigation-aside-item, treo-vertical-navigation-basic-item, treo-vertical-navigation-collapsable-item, treo-vertical-navigation-divider-item, treo-vertical-navigation-group-item, treo-vertical-navigation-spacer-item { display: flex; flex-direction: column; flex: 1 0 auto; user-select: none; .treo-vertical-navigation-item-wrapper { .treo-vertical-navigation-item { position: relative; display: flex; align-items: center; justify-content: flex-start; padding: 12px 24px; font-size: 13px; font-weight: 500; line-height: 20px; text-decoration: none; transition: background-color 375ms cubic-bezier(0.25, 0.8, 0.25, 1); .treo-vertical-navigation-item-icon { margin-right: 16px; transition: color 375ms cubic-bezier(0.25, 0.8, 0.25, 1); } .treo-vertical-navigation-item-title-wrapper { .treo-vertical-navigation-item-title { transition: color 375ms cubic-bezier(0.25, 0.8, 0.25, 1); } .treo-vertical-navigation-item-subtitle { font-size: 11px; line-height: 1.5; transition: color 375ms cubic-bezier(0.25, 0.8, 0.25, 1); } } .treo-vertical-navigation-item-badge { margin-left: auto; .treo-vertical-navigation-item-badge-content { display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 700; white-space: nowrap; width: 20px; height: 20px; border-radius: 50%; // Rectangle &.treo-vertical-navigation-item-badge-style-rectangle { width: auto; min-width: 24px; height: 20px; line-height: normal; padding: 0 6px; border-radius: 4px; } // Rounded &.treo-vertical-navigation-item-badge-style-rounded { width: auto; min-width: 24px; height: 20px; line-height: normal; padding: 0 10px; border-radius: 12px; } // Simple &.treo-vertical-navigation-item-badge-style-simple { width: auto; font-size: 11px; background-color: transparent !important; } } } } } } treo-vertical-navigation-aside-item, treo-vertical-navigation-basic-item, treo-vertical-navigation-collapsable-item { .treo-vertical-navigation-item { cursor: pointer; } } // Aside treo-vertical-navigation-aside-item { } // Basic treo-vertical-navigation-basic-item { } // Collapsable treo-vertical-navigation-collapsable-item { > .treo-vertical-navigation-item-wrapper { .treo-vertical-navigation-item { .treo-vertical-navigation-item-badge { + .treo-vertical-navigation-item-arrow { margin-left: 8px; } } .treo-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); } } } &.treo-vertical-navigation-item-expanded { > .treo-vertical-navigation-item-wrapper { .treo-vertical-navigation-item { .treo-vertical-navigation-item-arrow { transform: rotate(90deg); } } } } > .treo-vertical-navigation-item-children { > *:last-child { padding-bottom: 6px; > .treo-vertical-navigation-item-children { > *:last-child { padding-bottom: 0; } } } .treo-vertical-navigation-item { padding: 10px 24px; } } // 1st level .treo-vertical-navigation-item-children { overflow: hidden; .treo-vertical-navigation-item { padding-left: 64px; } // 2nd level .treo-vertical-navigation-item-children { .treo-vertical-navigation-item { padding-left: 80px; } // 3rd level .treo-vertical-navigation-item-children { .treo-vertical-navigation-item { padding-left: 96px; } // 4th level .treo-vertical-navigation-item-children { .treo-vertical-navigation-item { padding-left: 112px; } } } } } } // Divider treo-vertical-navigation-divider-item { margin: 12px 0; .treo-vertical-navigation-item-wrapper { height: 1px; box-shadow: 0 1px 0 0; } } // Group treo-vertical-navigation-group-item { > .treo-vertical-navigation-item-wrapper { .treo-vertical-navigation-item { .treo-vertical-navigation-item-badge, .treo-vertical-navigation-item-icon { display: none !important; } .treo-vertical-navigation-item-title { font-size: 12px; font-weight: 600; letter-spacing: 0.05em; text-transform: uppercase; } } } } // Spacer treo-vertical-navigation-spacer-item { margin: 6px 0; } // ----------------------------------------------------------------------------------------------------- // @ [inner] // ----------------------------------------------------------------------------------------------------- &.treo-vertical-navigation-inner { position: relative; width: auto; min-width: 0; max-width: none; height: auto; min-height: 0; max-height: none; box-shadow: none; .treo-vertical-navigation-wrapper { position: relative; overflow: visible; height: auto; .treo-vertical-navigation-content { overflow: visible !important; } } } } // Overlay .treo-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); + .treo-vertical-navigation-aside-overlay { background-color: transparent; } } // Aside overlay .treo-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); } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $background: map-get($theme, background); $foreground: map-get($theme, foreground); $primary: map-get($theme, primary); $is-dark: map-get($theme, is-dark); treo-vertical-navigation { // Wrapper .treo-vertical-navigation-wrapper { background: inherit; } // Aside wrapper .treo-vertical-navigation-aside-wrapper { background: inherit; } // Navigation items common .treo-vertical-navigation-item { color: currentColor; // Normal state .treo-vertical-navigation-item-icon { color: treo-color('cool-gray', 400); } .treo-vertical-navigation-item-title { @if ($is-dark) { color: treo-color('cool-gray', 300); } @else { color: treo-color('cool-gray', 600); } } .treo-vertical-navigation-item-subtitle { @if ($is-dark) { color: treo-color('cool-gray', 400); } @else { color: treo-color('cool-gray', 500); } } // Active state &.treo-vertical-navigation-item-active:not(.treo-vertical-navigation-item-disabled) { @if ($is-dark) { background-color: rgba(0, 0, 0, 0.25); } @else { background-color: treo-color('cool-gray', 100); } .treo-vertical-navigation-item-icon { @if ($is-dark) { color: treo-color('cool-gray', 100); } @else { color: treo-color('cool-gray', 500); } } .treo-vertical-navigation-item-title { @if ($is-dark) { color: treo-color('cool-gray', 50); } @else { color: treo-color('cool-gray', 900); } } .treo-vertical-navigation-item-subtitle { @if ($is-dark) { color: treo-color('cool-gray', 300); } @else { color: treo-color('cool-gray', 700); } } } // Disabled state &.treo-vertical-navigation-item-disabled { cursor: default; .treo-vertical-navigation-item-icon, .treo-vertical-navigation-item-title, .treo-vertical-navigation-item-subtitle, .treo-vertical-navigation-item-arrow { @if ($is-dark) { color: treo-color('cool-gray', 600); } @else { color: treo-color('cool-gray', 300); } } } } // Aside, Basic, Collapsable treo-vertical-navigation-aside-item, treo-vertical-navigation-basic-item, treo-vertical-navigation-collapsable-item { > .treo-vertical-navigation-item-wrapper { .treo-vertical-navigation-item { // Hover state &:hover:not(.treo-vertical-navigation-item-active):not(.treo-vertical-navigation-item-disabled) { @if ($is-dark) { background-color: rgba(0, 0, 0, 0.25); } @else { background-color: treo-color('gray', 50); } .treo-vertical-navigation-item-icon { @if ($is-dark) { color: treo-color('cool-gray', 100); } @else { color: treo-color('cool-gray', 500); } } .treo-vertical-navigation-item-title, .treo-vertical-navigation-item-arrow { @if ($is-dark) { color: treo-color('cool-gray', 50); } @else { color: treo-color('cool-gray', 900); } } .treo-vertical-navigation-item-subtitle { @if ($is-dark) { color: treo-color('cool-gray', 300); } @else { color: treo-color('cool-gray', 700); } } } } } } // Collapsable - Expanded state treo-vertical-navigation-collapsable-item { &.treo-vertical-navigation-item-expanded { > .treo-vertical-navigation-item-wrapper { .treo-vertical-navigation-item { .treo-vertical-navigation-item-icon { @if ($is-dark) { color: treo-color('cool-gray', 100); } @else { color: treo-color('cool-gray', 500); } } .treo-vertical-navigation-item-title, .treo-vertical-navigation-item-arrow { @if ($is-dark) { color: treo-color('cool-gray', 50); } @else { color: treo-color('cool-gray', 900); } } .treo-vertical-navigation-item-subtitle { @if ($is-dark) { color: treo-color('cool-gray', 300); } @else { color: treo-color('cool-gray', 700); } } } } } } // Group - Normal state treo-vertical-navigation-group-item { > .treo-vertical-navigation-item-wrapper { .treo-vertical-navigation-item { .treo-vertical-navigation-item-icon { color: treo-color('cool-gray', 400); } .treo-vertical-navigation-item-title { @if ($is-dark) { color: map-get($primary, 400); } @else { color: map-get($primary, 600); } } .treo-vertical-navigation-item-subtitle { color: treo-color('cool-gray', 500); } } } } // DARK THEME &.theme-dark { // Navigation items common .treo-vertical-navigation-item { .treo-vertical-navigation-item-title { color: treo-color('cool-gray', 300); } .treo-vertical-navigation-item-subtitle { color: treo-color('cool-gray', 400); } // Active state &.treo-vertical-navigation-item-active:not(.treo-vertical-navigation-item-disabled) { background-color: rgba(0, 0, 0, 0.25); .treo-vertical-navigation-item-icon { color: treo-color('cool-gray', 100); } .treo-vertical-navigation-item-title { color: treo-color('cool-gray', 50); } .treo-vertical-navigation-item-subtitle { color: treo-color('cool-gray', 300); } } // Disabled state &.treo-vertical-navigation-item-disabled { cursor: default; .treo-vertical-navigation-item-icon, .treo-vertical-navigation-item-title, .treo-vertical-navigation-item-subtitle, .treo-vertical-navigation-item-arrow { color: treo-color('cool-gray', 600); } } } // Aside, Basic, Collapsable treo-vertical-navigation-aside-item, treo-vertical-navigation-basic-item, treo-vertical-navigation-collapsable-item { > .treo-vertical-navigation-item-wrapper { .treo-vertical-navigation-item { // Hover state &:hover:not(.treo-vertical-navigation-item-active):not(.treo-vertical-navigation-item-disabled) { background-color: rgba(0, 0, 0, 0.25); .treo-vertical-navigation-item-icon { color: treo-color('cool-gray', 100); } .treo-vertical-navigation-item-title, .treo-vertical-navigation-item-arrow { color: treo-color('cool-gray', 50); } .treo-vertical-navigation-item-subtitle { color: treo-color('cool-gray', 300); } } } } } // Collapsable - Expanded state treo-vertical-navigation-collapsable-item { &.treo-vertical-navigation-item-expanded { > .treo-vertical-navigation-item-wrapper { .treo-vertical-navigation-item { .treo-vertical-navigation-item-icon { color: treo-color('cool-gray', 100); } .treo-vertical-navigation-item-title, .treo-vertical-navigation-item-arrow { color: treo-color('cool-gray', 50); } .treo-vertical-navigation-item-subtitle { color: treo-color('cool-gray', 300); } } } } } // Group - Normal state treo-vertical-navigation-group-item { > .treo-vertical-navigation-item-wrapper { .treo-vertical-navigation-item { .treo-vertical-navigation-item-title { color: map-get($primary, 400); } } } } } } } ================================================ FILE: webapp/frontend/src/@treo/components/navigation/vertical/vertical.component.ts ================================================ import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, OnDestroy, OnInit, Output, QueryList, Renderer2, 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 { BehaviorSubject, merge, Subject, Subscription } from 'rxjs'; import { delay, filter, takeUntil } from 'rxjs/operators'; import { TreoAnimations } from '@treo/animations'; import { TreoVerticalNavigationAppearance, TreoNavigationItem, TreoVerticalNavigationMode, TreoVerticalNavigationPosition } from '@treo/components/navigation/navigation.types'; import { TreoNavigationService } from '@treo/components/navigation/navigation.service'; import { TreoScrollbarDirective } from '@treo/directives/scrollbar/scrollbar.directive'; @Component({ selector : 'treo-vertical-navigation', templateUrl : './vertical.component.html', styleUrls : ['./vertical.component.scss'], animations : TreoAnimations, encapsulation : ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs : 'treoVerticalNavigation' }) export class TreoVerticalNavigationComponent implements OnInit, AfterViewInit, OnDestroy { activeAsideItemId: null | string; onCollapsableItemCollapsed: BehaviorSubject; onCollapsableItemExpanded: BehaviorSubject; onRefreshed: BehaviorSubject; // Auto collapse @Input() autoCollapse: boolean; // Name @Input() name: string; // On appearance changed @Output() readonly appearanceChanged: EventEmitter; // On mode changed @Output() readonly modeChanged: EventEmitter; // On opened changed @Output() readonly openedChanged: EventEmitter; // On position changed @Output() readonly positionChanged: EventEmitter; // Private private _appearance: TreoVerticalNavigationAppearance; private _asideOverlay: HTMLElement | null; private _treoScrollbarDirectives: QueryList; private _treoScrollbarDirectivesSubscription: Subscription; private _handleAsideOverlayClick: any; private _handleOverlayClick: any; private _inner: boolean; private _mode: TreoVerticalNavigationMode; private _navigation: TreoNavigationItem[]; private _opened: boolean | ''; private _overlay: HTMLElement | null; private _player: AnimationPlayer; private _position: TreoVerticalNavigationPosition; private _scrollStrategy: ScrollStrategy; private _transparentOverlay: boolean | ''; private _unsubscribeAll: Subject; @HostBinding('class.treo-vertical-navigation-animations-enabled') private _animationsEnabled: boolean; @ViewChild('navigationContent') private _navigationContentEl: ElementRef; /** * Constructor * * @param {AnimationBuilder} _animationBuilder * @param {TreoNavigationService} _treoNavigationService * @param {ChangeDetectorRef} _changeDetectorRef * @param {ElementRef} _elementRef * @param {Renderer2} _renderer2 * @param {Router} _router * @param {ScrollStrategyOptions} _scrollStrategyOptions */ constructor( private _animationBuilder: AnimationBuilder, private _treoNavigationService: TreoNavigationService, private _changeDetectorRef: ChangeDetectorRef, private _elementRef: ElementRef, private _renderer2: Renderer2, private _router: Router, private _scrollStrategyOptions: ScrollStrategyOptions ) { // Set the private defaults this._animationsEnabled = false; this._asideOverlay = null; this._handleAsideOverlayClick = () => { this.closeAside(); }; this._handleOverlayClick = () => { this.close(); }; this._overlay = null; this._scrollStrategy = this._scrollStrategyOptions.block(); this._unsubscribeAll = new Subject(); // Set the defaults this.appearanceChanged = new EventEmitter(); this.modeChanged = new EventEmitter(); this.openedChanged = new EventEmitter(); this.positionChanged = new EventEmitter(); this.onCollapsableItemCollapsed = new BehaviorSubject(null); this.onCollapsableItemExpanded = new BehaviorSubject(null); this.onRefreshed = new BehaviorSubject(null); this.activeAsideItemId = null; this.appearance = 'classic'; this.autoCollapse = true; this.inner = false; this.mode = 'side'; this.opened = false; this.position = 'left'; this.transparentOverlay = false; } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Setter & getter for appearance * * @param value */ @Input() set appearance(value: TreoVerticalNavigationAppearance) { // If the value is the same, return... if ( this._appearance === value ) { return; } let appearanceClassName; // Remove the previous appearance class appearanceClassName = 'treo-vertical-navigation-appearance-' + this.appearance; this._renderer2.removeClass(this._elementRef.nativeElement, appearanceClassName); // Store the appearance this._appearance = value; // Add the new appearance class appearanceClassName = 'treo-vertical-navigation-appearance-' + this.appearance; this._renderer2.addClass(this._elementRef.nativeElement, appearanceClassName); // Execute the observable this.appearanceChanged.next(this.appearance); } get appearance(): TreoVerticalNavigationAppearance { return this._appearance; } /** * Setter for treoScrollbarDirectives */ @ViewChildren(TreoScrollbarDirective) set treoScrollbarDirectives(treoScrollbarDirectives: QueryList) { // Store the directives this._treoScrollbarDirectives = treoScrollbarDirectives; // Return, if there are no directives if ( treoScrollbarDirectives.length === 0 ) { return; } // Unsubscribe the previous subscriptions if ( this._treoScrollbarDirectivesSubscription ) { this._treoScrollbarDirectivesSubscription.unsubscribe(); } // Update the scrollbars on collapsable items' collapse/expand this._treoScrollbarDirectivesSubscription = merge( this.onCollapsableItemCollapsed, this.onCollapsableItemExpanded ) .pipe( takeUntil(this._unsubscribeAll), delay(250) ) .subscribe(() => { // Loop through the scrollbars and update them treoScrollbarDirectives.forEach((treoScrollbarDirective) => { treoScrollbarDirective.update(); }); }); } /** * Setter & getter for data */ @Input() set navigation(value: TreoNavigationItem[]) { // Store the data this._navigation = value; // Mark for check this._changeDetectorRef.markForCheck(); } get navigation(): TreoNavigationItem[] { return this._navigation; } /** * Setter & getter for inner * * @param value */ @Input() set inner(value: boolean) { // If the value is the same, return... if ( this._inner === value ) { return; } // Set the naked value this._inner = value; // Update the class if ( this.inner ) { this._renderer2.addClass(this._elementRef.nativeElement, 'treo-vertical-navigation-inner'); } else { this._renderer2.removeClass(this._elementRef.nativeElement, 'treo-vertical-navigation-inner'); } } get inner(): boolean { return this._inner; } /** * Setter & getter for mode * * @param value */ @Input() set mode(value: TreoVerticalNavigationMode) { // If the value is the same, return... if ( this._mode === value ) { return; } // Disable the animations this._disableAnimations(); // If the mode changes: 'over -> side' if ( this.mode === 'over' && value === 'side' ) { // Hide the overlay this._hideOverlay(); } // If the mode changes: 'side -> over' if ( this.mode === 'side' && value === 'over' ) { // Close the aside this.closeAside(); // If the navigation is opened if ( this.opened ) { // Show the overlay this._showOverlay(); } } let modeClassName; // Remove the previous mode class modeClassName = 'treo-vertical-navigation-mode-' + this.mode; this._renderer2.removeClass(this._elementRef.nativeElement, modeClassName); // Store the mode this._mode = value; // Add the new mode class modeClassName = 'treo-vertical-navigation-mode-' + this.mode; this._renderer2.addClass(this._elementRef.nativeElement, modeClassName); // Execute the observable this.modeChanged.next(this.mode); // 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); } get mode(): TreoVerticalNavigationMode { return this._mode; } /** * Setter & getter for opened * * @param value */ @Input() set opened(value: boolean | '') { // If the value is the same, return... if ( this._opened === value ) { return; } // If the provided value is an empty string, // take that as a 'true' if ( value === '' ) { value = true; } // Set the opened value this._opened = value; // If the navigation opened, and the mode // is 'over', show the overlay if ( this.mode === 'over' ) { if ( this._opened ) { this._showOverlay(); } else { this._hideOverlay(); } } if ( this.opened ) { // Update styles and classes this._renderer2.setStyle(this._elementRef.nativeElement, 'visibility', 'visible'); this._renderer2.addClass(this._elementRef.nativeElement, 'treo-vertical-navigation-opened'); } else { // Update styles and classes this._renderer2.setStyle(this._elementRef.nativeElement, 'visibility', 'hidden'); this._renderer2.removeClass(this._elementRef.nativeElement, 'treo-vertical-navigation-opened'); } // Execute the observable this.openedChanged.next(this.opened); } get opened(): boolean | '' { return this._opened; } /** * Setter & getter for position * * @param value */ @Input() set position(value: TreoVerticalNavigationPosition) { // If the value is the same, return... if ( this._position === value ) { return; } let positionClassName; // Remove the previous position class positionClassName = 'treo-vertical-navigation-position-' + this.position; this._renderer2.removeClass(this._elementRef.nativeElement, positionClassName); // Store the position this._position = value; // Add the new position class positionClassName = 'treo-vertical-navigation-position-' + this.position; this._renderer2.addClass(this._elementRef.nativeElement, positionClassName); // Execute the observable this.positionChanged.next(this.position); } get position(): TreoVerticalNavigationPosition { return this._position; } /** * Setter & getter for transparent overlay * * @param value */ @Input() set transparentOverlay(value: boolean | '') { // If the value is the same, return... if ( this._opened === value ) { return; } // If the provided value is an empty string, // take that as a 'true' and set the opened value if ( value === '' ) { // Set the opened value this._transparentOverlay = true; } else { // Set the transparent overlay value this._transparentOverlay = value; } } get transparentOverlay(): boolean | '' { return this._transparentOverlay; } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Register the navigation component this._treoNavigationService.registerComponent(this.name, this); // Subscribe to the 'NavigationEnd' event this._router.events .pipe( filter(event => event instanceof NavigationEnd), takeUntil(this._unsubscribeAll) ) .subscribe(() => { if ( this.mode === 'over' && this.opened ) { // Close the navigation this.close(); } }); } /** * After view init */ ngAfterViewInit(): void { setTimeout(() => { // 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('.treo-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._treoScrollbarDirectives.forEach((treoScrollbarDirective) => { // Skip if not enabled if ( !treoScrollbarDirective.enabled ) { return; } // Scroll to the active element treoScrollbarDirective.scrollToElement('.treo-vertical-navigation-item-active', -120, true); }); } }); } /** * On destroy */ ngOnDestroy(): void { // Deregister the navigation component from the registry this._treoNavigationService.deregisterComponent(this.name); // Unsubscribe from all subscriptions this._unsubscribeAll.next(); this._unsubscribeAll.complete(); } // ----------------------------------------------------------------------------------------------------- // @ Private methods // ----------------------------------------------------------------------------------------------------- /** * Enable the animations * * @private */ private _enableAnimations(): void { // If the animations are already enabled, return... if ( this._animationsEnabled ) { return; } // Enable the animations this._animationsEnabled = true; } /** * Disable the animations * * @private */ private _disableAnimations(): void { // If the animations are already disabled, return... if ( !this._animationsEnabled ) { return; } // Disable the animations this._animationsEnabled = false; } /** * Show the overlay * * @private */ private _showOverlay(): void { // If there is already an overlay, return... 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('treo-vertical-navigation-overlay'); // Add a class depending on the transparentOverlay option if ( this.transparentOverlay ) { this._overlay.classList.add('treo-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 { // If there is already an overlay, return... 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('treo-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(); // Add a class this._renderer2.addClass(this._elementRef.nativeElement, 'treo-vertical-navigation-hover'); } /** * On mouseleave * * @private */ @HostListener('mouseleave') private _onMouseleave(): void { // Enable the animations this._enableAnimations(); // Remove the class this._renderer2.removeClass(this._elementRef.nativeElement, 'treo-vertical-navigation-hover'); } // ----------------------------------------------------------------------------------------------------- // @ 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 { // Enable the animations this._enableAnimations(); // Open this.opened = true; } /** * Close the navigation */ close(): void { // Enable the animations this._enableAnimations(); // Close the aside this.closeAside(); // Close this.opened = false; } /** * Toggle the opened status */ toggle(): void { // Toggle if ( this.opened ) { this.close(); } else { this.open(); } } /** * Open the aside * * @param item */ openAside(item: TreoNavigationItem): void { // Return if the item is disabled if ( item.disabled ) { 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: TreoNavigationItem): 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; } } ================================================ FILE: webapp/frontend/src/@treo/directives/autogrow/autogrow.directive.ts ================================================ import { Directive, ElementRef, HostBinding, HostListener, Input, OnDestroy, OnInit, Renderer2 } from '@angular/core'; import { Subject } from 'rxjs'; @Directive({ selector: 'textarea[treoAutogrow]', exportAs: 'treoAutogrow' }) export class TreoAutogrowDirective implements OnInit, OnDestroy { @HostBinding('rows') rows: number; // Private private _padding: number; private _unsubscribeAll: Subject; /** * Constructor * * @param {ElementRef} _elementRef * @param {Renderer2} _renderer2 */ constructor( private _elementRef: ElementRef, private _renderer2: Renderer2 ) { // Set the private defaults this._unsubscribeAll = new Subject(); // Set the defaults this.padding = 8; this.rows = 1; } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Setter and getter for padding * * @param value */ @Input('treoAutogrowVerticalPadding') set padding(value) { // Store the value this._padding = value; } get padding(): number { return this._padding; } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Set base styles this._renderer2.setStyle(this._elementRef.nativeElement, 'resize', 'none'); this._renderer2.setStyle(this._elementRef.nativeElement, 'overflow', 'hidden'); // Set the height for the first time setTimeout(() => { 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 { // Set the height to 'auto' so we can correctly read the scrollHeight this._renderer2.setStyle(this._elementRef.nativeElement, 'height', 'auto'); // Get the scrollHeight and subtract the vertical padding const height = this._elementRef.nativeElement.scrollHeight - this.padding + 'px'; this._renderer2.setStyle(this._elementRef.nativeElement, 'height', height); } } ================================================ FILE: webapp/frontend/src/@treo/directives/autogrow/autogrow.module.ts ================================================ import { NgModule } from '@angular/core'; import { TreoAutogrowDirective } from '@treo/directives/autogrow/autogrow.directive'; @NgModule({ declarations: [ TreoAutogrowDirective ], exports : [ TreoAutogrowDirective ] }) export class TreoAutogrowModule { } ================================================ FILE: webapp/frontend/src/@treo/directives/autogrow/index.ts ================================================ export * from '@treo/directives/autogrow/public-api'; ================================================ FILE: webapp/frontend/src/@treo/directives/autogrow/public-api.ts ================================================ export * from '@treo/directives/autogrow/autogrow.directive'; export * from '@treo/directives/autogrow/autogrow.module'; ================================================ FILE: webapp/frontend/src/@treo/directives/scrollbar/index.ts ================================================ export * from '@treo/directives/scrollbar/public-api'; ================================================ FILE: webapp/frontend/src/@treo/directives/scrollbar/public-api.ts ================================================ export * from '@treo/directives/scrollbar/scrollbar.directive'; export * from '@treo/directives/scrollbar/scrollbar.module'; ================================================ FILE: webapp/frontend/src/@treo/directives/scrollbar/scrollbar.directive.ts ================================================ import { Directive, ElementRef, Input, OnDestroy, OnInit } from '@angular/core'; import { Router } from '@angular/router'; import { Platform } from '@angular/cdk/platform'; import { fromEvent, Subject } from 'rxjs'; import { debounceTime, takeUntil } from 'rxjs/operators'; import PerfectScrollbar from 'perfect-scrollbar'; import * as _ from 'lodash'; import { ScrollbarGeometry, ScrollbarPosition } from '@treo/directives/scrollbar/scrollbar.interfaces'; // ----------------------------------------------------------------------------------------------------- // Wrapper directive for the Perfect Scrollbar: https://github.com/mdbootstrap/perfect-scrollbar // Based on https://github.com/zefoy/ngx-perfect-scrollbar // ----------------------------------------------------------------------------------------------------- @Directive({ selector: '[treoScrollbar]', exportAs: 'treoScrollbar' }) export class TreoScrollbarDirective implements OnInit, OnDestroy { isMobile: boolean; ps: PerfectScrollbar | any; // Private private _animation: number | null; private _enabled: boolean; private _options: any; private _unsubscribeAll: Subject; /** * Constructor * * @param {ElementRef} _elementRef * @param {Platform} _platform * @param {Router} _router */ constructor( private _elementRef: ElementRef, private _platform: Platform, private _router: Router ) { // Set the private defaults this._animation = null; this._options = {}; this._unsubscribeAll = new Subject(); // Set the defaults this.enabled = true; this.isMobile = false; } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Scrollbar options * * @param value */ @Input() set treoScrollbarOptions(value: any) { // Merge the options this._options = _.merge({}, this._options, value); // Destroy and re-init the PerfectScrollbar to update its options setTimeout(() => { this._destroy(); }); setTimeout(() => { this._init(); }); } get treoScrollbarOptions(): any { // Return the options return this._options; } /** * Is enabled * * @param value */ @Input('treoScrollbar') set enabled(value: boolean | '') { // If the value is an empty string, interpret it as 'true' if ( value === '' ) { value = true; } // If the value is the same, return... if ( this._enabled === value ) { return; } // Store the value this._enabled = value; // If enabled... if ( this.enabled ) { // Init the directive this._init(); } else { // Otherwise destroy it this._destroy(); } } get enabled(): boolean | '' { // Return the enabled status return this._enabled; } /** * Getter for _elementRef */ get elementRef(): ElementRef { return this._elementRef; } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * 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(); } // ----------------------------------------------------------------------------------------------------- // @ Private methods // ----------------------------------------------------------------------------------------------------- /** * Initialize * * @private */ private _init(): void { // Return, if already initialized if ( this.ps ) { return; } // Check if is mobile if ( this._platform.ANDROID || this._platform.IOS ) { this.isMobile = true; } // Return if it's mobile or the platform is not a browser if ( this.isMobile || !this._platform.isBrowser ) { // Silently set the enabled to false this._enabled = false; return; } // Initialize the PerfectScrollbar this.ps = new PerfectScrollbar(this._elementRef.nativeElement, {...this.treoScrollbarOptions}); } /** * Destroy * * @private */ private _destroy(): void { if ( !this.ps ) { return; } // Destroy the PerfectScrollbar this.ps.destroy(); // Clean up this.ps = null; } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Update the scrollbar */ update(): void { 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 { const scrollbarGeometry = new ScrollbarGeometry( this._elementRef.nativeElement[prefix + 'Left'], this._elementRef.nativeElement[prefix + 'Top'], this._elementRef.nativeElement[prefix + 'Width'], this._elementRef.nativeElement[prefix + 'Height']); return scrollbarGeometry; } /** * 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); } } } ================================================ FILE: webapp/frontend/src/@treo/directives/scrollbar/scrollbar.interfaces.ts ================================================ 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; } } ================================================ FILE: webapp/frontend/src/@treo/directives/scrollbar/scrollbar.module.ts ================================================ import { NgModule } from '@angular/core'; import { TreoScrollbarDirective } from '@treo/directives/scrollbar/scrollbar.directive'; @NgModule({ declarations: [ TreoScrollbarDirective ], exports : [ TreoScrollbarDirective ] }) export class TreoScrollbarModule { } ================================================ FILE: webapp/frontend/src/@treo/index.ts ================================================ export * from './treo.module'; ================================================ FILE: webapp/frontend/src/@treo/lib/mock-api/index.ts ================================================ export * from '@treo/lib/mock-api/mock-api.module'; ================================================ FILE: webapp/frontend/src/@treo/lib/mock-api/mock-api.interceptor.ts ================================================ import { 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 { TreoMockApiRequestHandler } from '@treo/lib/mock-api/mock-api.request-handler'; import { TreoMockApiService } from '@treo/lib/mock-api/mock-api.service'; @Injectable({ providedIn: 'root' }) export class TreoMockApiInterceptor implements HttpInterceptor { /** * Constructor * * @param {TreoMockApiService} _treoMockApiService */ constructor( private _treoMockApiService: TreoMockApiService ) { } /** * Intercept * * @param request * @param next */ intercept(request: HttpRequest, next: HttpHandler): Observable> { // Try to get the request handler const requestHandler: TreoMockApiRequestHandler = this._treoMockApiService.requestHandlers[request.method.toLowerCase()].get(request.url); // If the request handler exists.. if ( requestHandler ) { // Set the intercepted request on the requestHandler requestHandler.interceptedRequest = request; // Subscribe to the reply function observable return requestHandler.replyCallback.pipe( delay(requestHandler.delay), switchMap((response) => { // Throw a not found response, if there is no response data if ( !response ) { response = new HttpErrorResponse({ error : 'NOT FOUND', status : 404, statusText: 'NOT FOUND' }); return throwError(response); } // Parse the response data const data = { status: response[0], body : response[1] }; // If the status is in between 200 and 300, // it's a success response if ( data.status >= 200 && data.status < 300 ) { response = new HttpResponse({ body : data.body, status : data.status, statusText: 'OK' }); return of(response); } // Error response response = new HttpErrorResponse({ error : data.body.error, status : data.status, statusText: 'ERROR' }); return throwError(response); })); } // Pass through if the request handler does not exists return next.handle(request); } } ================================================ FILE: webapp/frontend/src/@treo/lib/mock-api/mock-api.interfaces.ts ================================================ export interface TreoMockApi { register(): void; } ================================================ FILE: webapp/frontend/src/@treo/lib/mock-api/mock-api.module.ts ================================================ import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'; import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { TreoMockApiInterceptor } from '@treo/lib/mock-api/mock-api.interceptor'; import { TreoMockApiService } from '@treo/lib/mock-api/mock-api.service'; @NgModule({ providers: [ TreoMockApiService, { provide : HTTP_INTERCEPTORS, useClass: TreoMockApiInterceptor, multi : true } ] }) export class TreoMockApiModule { /** * forRoot method for setting user configuration * * @param mockDataServices */ static forRoot(mockDataServices: any[]): ModuleWithProviders { return { ngModule : TreoMockApiModule, providers: [ { provide : APP_INITIALIZER, deps : mockDataServices, useFactory: () => () => null, multi : true }, ] }; } } ================================================ FILE: webapp/frontend/src/@treo/lib/mock-api/mock-api.request-handler.ts ================================================ import { Injectable } from '@angular/core'; import { HttpRequest } from '@angular/common/http'; import { Observable, of, throwError } from 'rxjs'; import { take } from 'rxjs/operators'; @Injectable() export class TreoMockApiRequestHandler { // Private private _delay: number; private _executionCount: number; private _executionLimit: number; private _interceptedRequest: HttpRequest; private _replyCallback: any; private _url: string; /** * Constructor */ constructor() { // Set the private defaults this._executionCount = 0; this._executionLimit = 0; } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Setter and getter for delay * * @param value */ set delay(value: number) { // Return, if the value is the same if ( this._delay === value ) { return; } // Store the delay this._delay = value; } get delay(): number { return this._delay; } /** * Setter and getter for url * * @param value */ set url(value: string) { // Return, if the value is the same if ( this._url === value ) { return; } // Store the url this._url = value; } get url(): string { return this._url; } /** * Setter and getter for intercepted request * * @param value */ set interceptedRequest(value: HttpRequest) { // Return, if the value is the same if ( this._interceptedRequest === value ) { return; } // Store the intercepted request this._interceptedRequest = value; } get interceptedRequest(): HttpRequest { return this._interceptedRequest; } /** * Getter for reply callback */ get replyCallback(): Observable { // Throw an error, if the execution limit has been reached if ( this._executionLimit > 0 && this._executionCount === this._executionLimit ) { return throwError('Execution limit reached'); } // Throw an error, if the intercepted request has not been set if ( !this.interceptedRequest ) { return throwError('Intercepted request does not exist!'); } // Increase the execution count this._executionCount++; // Execute the reply callback const replyCallbackResult = this._replyCallback(this.interceptedRequest); // If the result of the reply function is an observable... if ( replyCallbackResult instanceof Observable ) { // Return the result as it is return replyCallbackResult.pipe(take(1)); } // Otherwise, return the result as an observable return of(replyCallbackResult).pipe(take(1)); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Reply * * @param callback */ reply(callback: (req: HttpRequest) => ([number, any | string] | Observable)): void { // Store the reply callback this._replyCallback = callback; } /** * Reply once * * @param callback */ replyOnce(callback: (req: HttpRequest) => ([number, any | string] | Observable)): void { // Set the execute limit to 1 this._executionLimit = 1; // Call reply as normal this.reply(callback); } } ================================================ FILE: webapp/frontend/src/@treo/lib/mock-api/mock-api.service.ts ================================================ import { Injectable } from '@angular/core'; import { TreoMockApiRequestHandler } from '@treo/lib/mock-api/mock-api.request-handler'; @Injectable({ providedIn: 'root' }) export class TreoMockApiService { requestHandlers: any; /** * Constructor */ constructor() { // Set the defaults this.requestHandlers = { delete: new Map(), get : new Map(), patch : new Map(), post : new Map(), put : new Map() }; } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Register 'delete' request handler * * @param url * @param delay */ onDelete(url: string, delay: number = 0): TreoMockApiRequestHandler { return this._registerRequestHandler('delete', url, delay); } /** * Register 'get' request handler * * @param url * @param delay */ onGet(url: string, delay: number = 0): TreoMockApiRequestHandler { return this._registerRequestHandler('get', url, delay); } /** * Register 'patch' request handler * * @param url * @param delay */ onPatch(url: string, delay: number = 0): TreoMockApiRequestHandler { return this._registerRequestHandler('patch', url, delay); } /** * Register 'post' request handler * * @param url * @param delay */ onPost(url: string, delay: number = 0): TreoMockApiRequestHandler { return this._registerRequestHandler('post', url, delay); } /** * Register 'put' request handler * * @param url * @param delay */ onPut(url: string, delay: number = 0): TreoMockApiRequestHandler { return this._registerRequestHandler('put', url, delay); } // ----------------------------------------------------------------------------------------------------- // @ Private methods // ----------------------------------------------------------------------------------------------------- /** * Register a request handler * * @param requestType * @param url * @param delay * @private */ private _registerRequestHandler(requestType, url, delay): TreoMockApiRequestHandler { // Create a new instance of TreoMockApiRequestHandler const treoMockHttp = new TreoMockApiRequestHandler(); // Store the url treoMockHttp.url = url; // Store the delay treoMockHttp.delay = delay; // Store the request handler to access them from the interceptor this.requestHandlers[requestType].set(url, treoMockHttp); // Return the instance return treoMockHttp; } } ================================================ FILE: webapp/frontend/src/@treo/lib/mock-api/mock-api.utils.ts ================================================ export class TreoMockApiUtils { /** * 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 */ } } ================================================ FILE: webapp/frontend/src/@treo/pipes/find-by-key/find-by-key.module.ts ================================================ import { NgModule } from '@angular/core'; import { TreoFindByKeyPipe } from '@treo/pipes/find-by-key/find-by-key.pipe'; @NgModule({ declarations: [ TreoFindByKeyPipe ], exports : [ TreoFindByKeyPipe ] }) export class TreoFindByKeyPipeModule { } ================================================ FILE: webapp/frontend/src/@treo/pipes/find-by-key/find-by-key.pipe.ts ================================================ import { Pipe, PipeTransform } from '@angular/core'; /** * Finds an object from given source using the given key - value pairs */ @Pipe({ name: 'treoFindByKey', pure: false }) export class TreoFindByKeyPipe 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); } } ================================================ FILE: webapp/frontend/src/@treo/pipes/find-by-key/index.ts ================================================ export * from '@treo/pipes/find-by-key/public-api'; ================================================ FILE: webapp/frontend/src/@treo/pipes/find-by-key/public-api.ts ================================================ export * from '@treo/pipes/find-by-key/find-by-key.pipe'; export * from '@treo/pipes/find-by-key/find-by-key.module'; ================================================ FILE: webapp/frontend/src/@treo/services/config/config.constants.ts ================================================ import { InjectionToken } from '@angular/core'; export const TREO_APP_CONFIG = new InjectionToken('Default configuration for the app'); ================================================ FILE: webapp/frontend/src/@treo/services/config/config.module.ts ================================================ import { ModuleWithProviders, NgModule } from '@angular/core'; import { TreoConfigService } from '@treo/services/config/config.service'; import { TREO_APP_CONFIG } from '@treo/services/config/config.constants'; @NgModule() export class TreoConfigModule { /** * Constructor * * @param {TreoConfigService} _treoConfigService */ constructor( private _treoConfigService: TreoConfigService ) { } /** * forRoot method for setting user configuration * * @param config */ static forRoot(config: any): ModuleWithProviders { return { ngModule : TreoConfigModule, providers: [ { provide : TREO_APP_CONFIG, useValue: config } ] }; } } ================================================ FILE: webapp/frontend/src/@treo/services/config/config.service.ts ================================================ import { Inject, Injectable } from '@angular/core'; import { BehaviorSubject, Observable } from 'rxjs'; import * as _ from 'lodash'; import { TREO_APP_CONFIG } from '@treo/services/config/config.constants'; import { AppConfig } from 'app/core/config/app.config'; const SCRUTINY_CONFIG_LOCAL_STORAGE_KEY = 'scrutiny'; @Injectable({ providedIn: 'root' }) export class TreoConfigService { // Private private _config: BehaviorSubject; /** * Constructor */ constructor(@Inject(TREO_APP_CONFIG) defaultConfig: any) { let currentScrutinyConfig = defaultConfig const localConfigStr = localStorage.getItem(SCRUTINY_CONFIG_LOCAL_STORAGE_KEY) if (localConfigStr){ // check localstorage for a value const localConfig = JSON.parse(localConfigStr) currentScrutinyConfig = Object.assign({}, currentScrutinyConfig, localConfig) // make sure defaults are available if missing from localStorage. } // Set the private defaults this._config = new BehaviorSubject(currentScrutinyConfig); } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Setter and getter for config */ // Setter set config(value: any) { // Merge the new config over to the current config const config = _.merge({}, this._config.getValue(), value); // Store the config in localstorage localStorage.setItem(SCRUTINY_CONFIG_LOCAL_STORAGE_KEY, JSON.stringify(config)); // Execute the observable this._config.next(config); } // Getter get config$(): Observable { return this._config.asObservable(); } // ----------------------------------------------------------------------------------------------------- // @ Private methods // ----------------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Resets the config to the default */ reset(): void { // Set the config this._config.next(this.config); } } ================================================ FILE: webapp/frontend/src/@treo/services/config/index.ts ================================================ export * from '@treo/services/config/public-api'; ================================================ FILE: webapp/frontend/src/@treo/services/config/public-api.ts ================================================ export * from '@treo/services/config/config.module'; export * from '@treo/services/config/config.service'; ================================================ FILE: webapp/frontend/src/@treo/services/media-watcher/index.ts ================================================ export * from '@treo/services/media-watcher/public-api'; ================================================ FILE: webapp/frontend/src/@treo/services/media-watcher/media-watcher.module.ts ================================================ import { NgModule } from '@angular/core'; import { TreoMediaWatcherService } from '@treo/services/media-watcher/media-watcher.service'; @NgModule({ providers: [ TreoMediaWatcherService ] }) export class TreoMediaWatcherModule { /** * Constructor * * @param {TreoMediaWatcherService} _treoMediaWatcherService */ constructor( private _treoMediaWatcherService: TreoMediaWatcherService ) { } } ================================================ FILE: webapp/frontend/src/@treo/services/media-watcher/media-watcher.service.ts ================================================ import { Injectable } from '@angular/core'; import { BreakpointObserver, BreakpointState } from '@angular/cdk/layout'; import { BehaviorSubject, Observable } from 'rxjs'; import { treoBreakpoints } from '@treo/tailwind/exported/variables'; @Injectable() export class TreoMediaWatcherService { private _onMediaChange: BehaviorSubject<{ matchingAliases: string[], matchingRules: any }>; /** * Constructor * * @param {BreakpointObserver} _breakpointObserver */ constructor( private _breakpointObserver: BreakpointObserver ) { // Set the defaults this._onMediaChange = new BehaviorSubject(null); // Initialize this._init(); } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Getter for _onMediaChange */ get onMediaChange$(): Observable<{ matchingAliases: string[], matchingRules: any }> { return this._onMediaChange.asObservable(); } // ----------------------------------------------------------------------------------------------------- // @ Private methods // ----------------------------------------------------------------------------------------------------- /** * Initialize * * @private */ private _init(): void { // Subscribe to the breakpoint observer this._breakpointObserver.observe(Object.values(treoBreakpoints)) .subscribe((state) => { const matchingAliases = []; const matchingRules = {}; // If there are no matching rules, execute the observable and bail if ( !state.matches ) { this._onMediaChange.next({ matchingAliases, matchingRules }); return; } // Go through the breakpoints and find the ones that match for ( const [query, matches] of Object.entries(state.breakpoints) ) { if ( !matches ) { continue; } // Get the alias of the matching query const alias = Object.keys(treoBreakpoints).find(key => treoBreakpoints[key] === query); // Prepare the observable values matchingAliases.push(alias); matchingRules[alias] = query; } // Execute the observable this._onMediaChange.next({ matchingAliases, matchingRules }); }); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * On media query change * * @param query */ onMediaQueryChange$(query: string): Observable { return this._breakpointObserver.observe(query); } } ================================================ FILE: webapp/frontend/src/@treo/services/media-watcher/public-api.ts ================================================ export * from '@treo/services/media-watcher/media-watcher.module'; export * from '@treo/services/media-watcher/media-watcher.service'; ================================================ FILE: webapp/frontend/src/@treo/services/splash-screen/index.ts ================================================ export * from '@treo/services/splash-screen/public-api'; ================================================ FILE: webapp/frontend/src/@treo/services/splash-screen/public-api.ts ================================================ export * from '@treo/services/splash-screen/splash-screen.module'; export * from '@treo/services/splash-screen/splash-screen.service'; ================================================ FILE: webapp/frontend/src/@treo/services/splash-screen/splash-screen.module.ts ================================================ import { NgModule } from '@angular/core'; import { TreoSplashScreenService } from '@treo/services/splash-screen/splash-screen.service'; @NgModule({ providers: [ TreoSplashScreenService ] }) export class TreoSplashScreenModule { /** * Constructor * * @param {TreoSplashScreenService} _treoSplashScreenService */ constructor( private _treoSplashScreenService: TreoSplashScreenService ) { } } ================================================ FILE: webapp/frontend/src/@treo/services/splash-screen/splash-screen.service.ts ================================================ 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 TreoSplashScreenService { /** * Constructor * * @param {DOCUMENT} _document * @param {Router} _router */ constructor( @Inject(DOCUMENT) private _document: any, private _router: Router ) { // Initialize this._init(); } // ----------------------------------------------------------------------------------------------------- // @ Private methods // ----------------------------------------------------------------------------------------------------- /** * Initialize * * @private */ private _init(): void { // Hide it on the first NavigationEnd event this._router.events .pipe( filter(event => event instanceof NavigationEnd), take(1) ) .subscribe(() => { // Hide the splash screen this.hide(); }); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Show the splash screen */ show(): void { this._document.body.classList.remove('treo-splash-screen-hidden'); } /** * Hide the splash screen */ hide(): void { this._document.body.classList.add('treo-splash-screen-hidden'); } } ================================================ FILE: webapp/frontend/src/@treo/styles/base/_colors.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Generate and apply base theme colors // ----------------------------------------------------------------------------------------------------- @include treo-theme { $background: map-get($theme, background); $foreground: map-get($theme, foreground); $is-dark: map-get($theme, is-dark); // Base color and background & { color: map-get($foreground, text); background-color: map-get($background, background); } // Base border color for all elements *, *::before, *::after { border-color: map-get($foreground, divider); } // Force the disabled colors on disabled elements [disabled] { * { color: map-get($foreground, disabled) !important; } } .mat-icon { @if ($is-dark) { color: map-get($foreground, secondary-text); } @else { color: map-get($foreground, icon); } } .text-card { color: map-get($background, card); } .text-default { color: map-get($foreground, text); } .text-secondary { color: map-get($foreground, secondary-text); } .text-hint { color: map-get($foreground, hint-text); } .text-disabled { color: map-get($foreground, disabled-text); } .divider { color: map-get($foreground, divider); } // Background colors .bg-default { background-color: map-get($background, background); } .bg-dialog, .bg-card { background-color: map-get($background, card); } .bg-hover { background-color: map-get($background, hover); } // Dark - light variants @if ($is-dark) { &.dark\:text-normal, .dark\:text-normal { color: map-get($foreground, text); } &.dark\:text-secondary, .dark\:text-secondary { color: map-get($foreground, secondary-text); } &.dark\:text-hint, .dark\:text-hint { color: map-get($foreground, hint-text); } &.dark\:text-disabled, .dark\:text-disabled { color: map-get($foreground, disabled-text); } &.dark\:text-divider, .dark\:text-divider { color: map-get($foreground, divider); } &.dark\:bg-default, .dark\:bg-default { background-color: map-get($background, background); } &.dark\:bg-dialog, .dark\:bg-dialog, &.dark\:bg-card, .dark\:bg-card { background-color: map-get($background, card); } &.dark\:bg-hover, .dark\:bg-hover { background-color: map-get($background, hover); } } @else { &.light\:text-normal, .light\:text-normal { color: map-get($foreground, text); } &.light\:text-secondary, .light\:text-secondary { color: map-get($foreground, secondary-text); } &.light\:text-hint, .light\:text-hint { color: map-get($foreground, hint-text); } &.light\:text-disabled, .light\:text-disabled { color: map-get($foreground, disabled-text); } &.light\:text-divider, .light\:text-divider { color: map-get($foreground, divider); } &.light\:bg-default, .light\:bg-default { background-color: map-get($background, background); } &.light\:bg-dialog, .light\:bg-dialog, &.light\:bg-card, .light\:bg-card { background-color: map-get($background, card); } &.light\:bg-hover, .light\:bg-hover { background-color: map-get($background, hover); } } } ================================================ FILE: webapp/frontend/src/@treo/styles/base/_preflight.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Manually forked from TailwindCSS preflight.css // ----------------------------------------------------------------------------------------------------- /** * Manually forked from SUIT CSS Base: https://github.com/suitcss/base * A thin layer on top of normalize.css that provides a starting point more * suitable for web applications. */ /** * 1. Prevent padding and border from affecting element width * https://goo.gl/pYtbK7 * 2. Change the default font family in all browsers (opinionated) */ html { box-sizing: border-box; /* 1 */ font-family: sans-serif; /* 2 */ } *, *::before, *::after { box-sizing: inherit; } /** * Removes the default spacing and border for appropriate elements. */ blockquote, dl, dd, h1, h2, h3, h4, h5, h6, figure, p, pre { margin: 0; } button { background: transparent; padding: 0; } /** * Work around a Firefox/IE bug where the transparent `button` background * results in a loss of the default `button` focus styles. */ button:focus { outline: 1px dotted; outline: 5px auto -webkit-focus-ring-color; } fieldset { margin: 0; padding: 0; } ol, ul { list-style: none; margin: 0; padding: 0; } /** * Tailwind custom reset styles */ /** * 1. Use the system font stack as a sane default. * 2. Use Tailwind's default "normal" line-height so the user isn't forced * to override it to ensure consistency even when using the default theme. */ html { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 1 */ line-height: 1.5; /* 2 */ } /** * Allow adding a border to an element by just adding a border-width. * * By default, the way the browser specifies that an element should have no * border is by setting it's border-style to `none` in the user-agent * stylesheet. * * In order to easily add borders to elements by just setting the `border-width` * property, we change the default border-style for all elements to `solid`, and * use border-width to hide them instead. This way our `border` utilities only * need to set the `border-width` property instead of the entire `border` * shorthand, making our border utilities much more straightforward to compose. * * https://github.com/tailwindcss/tailwindcss/pull/116 */ *, *::before, *::after { border-width: 0; border-style: solid; // Default border color is defined in 'styles/base/_colors.scss' file for convenience } /** * Undo the `border-style: none` reset that Normalize applies to images so that * our `border-{width}` utilities have the expected effect. * * The Normalize reset is unnecessary for us since we default the border-width * to 0 on all elements. * * https://github.com/tailwindcss/tailwindcss/issues/362 */ img { border-style: solid; } textarea { resize: vertical; } input::placeholder, textarea::placeholder { color: inherit; //opacity: 0.5; } button, [role="button"] { cursor: pointer; } table { border-collapse: collapse; } h1, h2, h3, h4, h5, h6 { font-size: inherit; font-weight: inherit; } /** * Reset links to optimize for opt-in styling instead of * opt-out. */ a { color: inherit; text-decoration: inherit; } /** * Reset form element properties that are easy to forget to * style explicitly so you don't inadvertently introduce * styles that deviate from your design system. These styles * supplement a partial reset that is already applied by * normalize.css. */ button, input, optgroup, select, textarea { padding: 0; line-height: inherit; color: inherit; } /** * Use the configured 'mono' font family for elements that * are expected to be rendered with a monospace font, falling * back to the system monospace stack if there is no configured * 'mono' font family. */ pre, code, kbd, samp { font-family: $treo-font-mono; } /** * Make replaced elements `display: block` by default as that's * the behavior you want almost all of the time. Inspired by * CSS Remedy, with `svg` added as well. * * https://github.com/mozdevs/cssremedy/issues/14 */ img, svg, video, canvas, audio, iframe, embed, object { display: block; vertical-align: middle; } /** * Constrain images and videos to the parent width and preserve * their instrinsic aspect ratio. * * https://github.com/mozdevs/cssremedy/issues/14 */ img, video { max-width: 100%; height: auto; } // ----------------------------------------------------------------------------------------------------- // @ Treo custom reset styles // ----------------------------------------------------------------------------------------------------- * { // 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; // Disable default focus outline &:focus { outline: none !important; } // Enable focus outline only on keyboard focused buttons button.cdk-focused.cdk-keyboard-focused { outline: 1px dotted !important; outline: 5px auto -webkit-focus-ring-color !important; } } 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; } hr { margin: 32px 0; border-bottom-width: 1px; } img { width: 100%; vertical-align: top; } // Fix: Disabled placeholder color is too faded on Safari input[disabled] { opacity: 1; -webkit-text-fill-color: currentColor; } ================================================ FILE: webapp/frontend/src/@treo/styles/base/_theming.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Apply Angular Material theme and generate Treo color classes for the theme // ----------------------------------------------------------------------------------------------------- @include treo-theme { // Generate Angular Material theme @include angular-material-theme($theme); // Generate Treo color classes for the theme @include treo-color-classes( ( primary: map-get($theme, primary), accent: map-get($theme, accent), warn: map-get($theme, warn) ) ); } ================================================ FILE: webapp/frontend/src/@treo/styles/base/_typography.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Angular Material typography config // ----------------------------------------------------------------------------------------------------- @include angular-material-typography( mat-typography-config( $font-family: $treo-font-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 ) ); // ----------------------------------------------------------------------------------------------------- // @ General // ----------------------------------------------------------------------------------------------------- html { font-size: 16px; } body { font-size: 0.875rem; font-family: $treo-font-sans; } // Headings h1, h2, h3, h4, h5, h6 { margin: 1.25em 0 0.5em 0; } h1 { font-size: 32px; font-weight: 800; letter-spacing: -0.022em; line-height: 1.25; } h2 { font-size: 32px; font-weight: 600; letter-spacing: -0.022em; line-height: 1.25; } h3 { font-size: 24px; font-weight: 600; letter-spacing: -0.019em; line-height: 1.25; } h4 { font-size: 20px; font-weight: 500; letter-spacing: -0.017em; } h5 { font-size: 18px; font-weight: 500; letter-spacing: -0.014em; } h6 { font-size: 16px; font-weight: 500; letter-spacing: -0.011em; } // Override links for web apps a { color: currentColor; text-decoration: none; } // Link helper for applying default 'a' style .link { cursor: pointer; &:focus, &:hover { text-decoration: underline; } } // Breadcrumb .breadcrumb { display: flex; flex-wrap: wrap; align-items: center; font-size: 12px; font-weight: 700; text-transform: uppercase; .path { white-space: nowrap; &a { color: inherit; } &.current { } } .separator { margin: 0 6px; } } // ----------------------------------------------------------------------------------------------------- // @ Code and Pre // ----------------------------------------------------------------------------------------------------- code, pre { font-family: $treo-font-mono; font-size: 14px; line-height: 1.6; border-radius: 4px; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; white-space: pre-wrap; word-break: break-word; word-wrap: break-word; } pre { padding: 24px; margin: 0; @include treo-elevation(); } :not(pre) > code { padding: 2px 5px; } // ----------------------------------------------------------------------------------------------------- // @ Rich text // ----------------------------------------------------------------------------------------------------- .rich-text { h1, h2, h3, h4, h5, h6 { margin: 0; } h1 { font-size: 36px; font-weight: 600; line-height: 1; } h1 + * { margin-top: 32px; } h2 { font-size: 24px; font-weight: 600; line-height: 1.25; } * + h2 { margin-top: 32px; } h2 + * { margin-top: 16px; } h3 { font-size: 20px; font-weight: 600; line-height: 1.25; } * + h3 { margin-top: 32px; } h2 + h3 { margin-top: 16px; } h3 + * { margin-top: 8px; } h4 { font-size: 16px; font-weight: 600; line-height: 1.5; } * + h4 { margin-top: 24px; } h3 + h4 { margin-top: 8px; } h4 + * { margin-top: 8px; } h5 { font-size: 14px; font-weight: 600; line-height: 1.5; } h6 { font-size: 14px; font-weight: 500; line-height: 1.5; } p { line-height: 1.75; } p + p { margin-top: 16px; } ol { list-style-type: decimal; padding-left: 20px; } * + ol { margin-top: 16px; } ol + * { margin-top: 16px; } li ol { margin-top: 8px; } ul { list-style-type: disc; padding-left: 20px; } * + ul { margin-top: 16px; } ul + *:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) { margin-top: 16px; } li ul { margin-top: 8px; } li + li { margin-top: 8px; } li p { margin-top: 16px; } li p + p { margin-top: 8px; } li:first-child p:first-child { margin-top: 8px; } a { font-weight: 500; } a:hover { text-decoration: underline; } abbr { cursor: help; border-bottom-width: 1px; border-bottom-style: dotted; } blockquote { border-left-width: 3px; font-style: italic; margin: 16px 0; padding-left: 16px; footer { font-style: normal; &:before { content: '\2014 \00A0'; } } &.reverse { border-left-width: 0; border-right-width: 3px; text-align: right; padding-left: 0; padding-right: 16px; footer { &:before { content: ''; } &:after { content: '\2014 \00A0'; } } } } * + blockquote { margin-top: 16px; } blockquote + * { margin-top: 16px; } dl { dt { font-weight: 700; } dd { margin: 4px 0 16px 0; } } fieldset { margin-inline-start: 0; margin-inline-end: 0; padding-inline-start: 0; padding-inline-end: 0; padding-block-start: 0; padding-block-end: 0; width: 100%; border-width: 1px; border-radius: 4px; padding: 24px; legend { padding: 0 6px; margin-left: -6px; } } img { margin-top: 32px; margin-bottom: 32px; } * + pre { margin-top: 16px; } pre + * { margin-top: 16px; } pre code { padding: 0; } strong { font-weight: 700; } // treo-highlight * + .treo-highlight { margin-top: 16px; } .treo-highlight + p { margin-top: 24px; } // treo-message * + treo-message { margin-top: 24px; } treo-message + p { margin-top: 24px; } } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $foreground: map-get($theme, foreground); $primary: map-get($theme, primary); $is-dark: map-get($theme, is-dark); // ----------------------------------------------------------------------------------------------------- // @ General // ----------------------------------------------------------------------------------------------------- // Link helper for applying default 'a' style .link { color: map-get($primary, default); border-bottom-color: map-get($primary, default); } // Breadcrumb .breadcrumb { .path { color: map-get($primary, default); &.current { color: map-get($foreground, secondary-text); } } .separator { color: map-get($foreground, secondary-text); } } // ----------------------------------------------------------------------------------------------------- // @ Code and Pre // ----------------------------------------------------------------------------------------------------- code, pre { @if ($is-dark) { color: treo-color('cool-gray', 400); background: treo-color('cool-gray', 800); } @else { background: #FFFFFF; color: #728FCB; } } :not(pre) > code { @if ($is-dark) { color: treo-color('cool-gray', 400); background: treo-color('cool-gray', 700); } @else { color: treo-color('cool-gray', 500); background: treo-color('cool-gray', 200); } } // ----------------------------------------------------------------------------------------------------- // @ Rich text // ----------------------------------------------------------------------------------------------------- .rich-text { a { color: map-get($primary, default); border-bottom-color: map-get($primary, default); } mark { background: #F7F49A; } } } ================================================ FILE: webapp/frontend/src/@treo/styles/components/_card.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Extended styles for treo-card // ----------------------------------------------------------------------------------------------------- treo-card { &.auth-card { margin: 8px; @include treo-breakpoint('xs') { justify-content: center; width: 100%; height: 100%; margin: 0; box-shadow: none; border-radius: 0; } // Classic style &.classic { .content-container { display: none !important; } } // Modern style &.modern, &.modern-alt { max-width: 1200px; width: calc(100% - 16px); @include treo-breakpoint('lt-md') { width: auto; } .form-container { @include treo-breakpoint('gt-sm') { padding: 64px; } } } &.modern-alt { .form-container { order: 2; } .content-container { order: 1; } } // Fullscreen style &.fullscreen, &.fullscreen-alt { width: 100%; height: 100%; margin: 0; box-shadow: none; border-radius: 0; @include treo-breakpoint('lt-md') { justify-content: center; } .form-container { width: 45%; @include treo-breakpoint('lt-md') { width: auto; padding: 40px; } .form { margin: auto 32px auto auto; @include treo-breakpoint('lt-md') { margin: 0; } } } } &.fullscreen-alt { .form-container { order: 2; .form { margin: auto auto auto 32px; @include treo-breakpoint('lt-md') { margin: 0; } } } .content-container { order: 1; } } // Form container .form-container { display: flex; flex-direction: column; order: 1; padding: 48px; @include treo-breakpoint('xs') { padding: 40px; } .form { width: 100%; min-width: 320px; max-width: 320px; @include treo-breakpoint('xs') { max-width: 0; } .logo { width: 48px; } .title { margin: 32px 0 0 0; font-size: 30px; font-weight: 800; letter-spacing: -0.022em; line-height: 1.25; } .subtitle { display: flex; align-items: baseline; margin-top: 2px; font-weight: 500; .link { margin-left: 4px; } } treo-message { margin-top: 32px; margin-bottom: -16px; } form { margin-top: 32px; .mat-form-field { width: 100%; } } .field-footer { display: flex; align-items: baseline; justify-content: space-between; margin: 6px 0 12px 0; .link { font-size: 13px; font-weight: 500; } } .submit-button { width: 100%; margin-top: 12px; } .sso { display: flex; flex-direction: column; .separator { position: relative; display: flex; align-items: center; justify-content: center; flex: 1 1 auto; margin: 32px 0; &:before, &:after { content: ''; display: flex; flex: 1 1 auto; height: 1px; } &:before { margin-right: 8px; } &:after { margin-left: 8px; } } .buttons { display: flex; align-items: center; button { flex: 1 1 auto; margin-right: 8px; &:last-child { margin-right: 0; } .mat-icon { @include treo-icon-size(20); } } } } .form-footer { width: 100%; margin-top: 32px; font-size: 13px; font-weight: 500; .link { margin-left: 4px; } } } } // Content container .content-container { position: relative; display: flex; flex: 1 1 auto; align-items: center; justify-content: center; order: 2; overflow: hidden; @include treo-breakpoint('lt-md') { display: none; } .background { position: absolute; top: 0; left: 0; width: 100%; height: 900px; pointer-events: none; path { opacity: 0.1; } } .content { position: relative; display: flex; flex-direction: column; max-width: 480px; width: 100%; margin: 64px; .title { display: flex; flex-direction: column; span { font-size: 40px; font-weight: 700; line-height: 1.2; } } .description { margin-top: 12px; font-size: 15px; } .learn-more-button { width: 160px; margin-top: 40px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $foreground: map-get($theme, foreground); $is-dark: map-get($theme, is-dark); treo-card { &.auth-card { @include treo-breakpoint('xs') { background: transparent; } // Fullscreen style &.fullscreen, &.fullscreen-alt { @include treo-breakpoint('lt-md') { background: transparent; } } .form-container { .form { .form-footer { span { color: map-get($foreground, secondary-text); } } .sso { .separator { color: map-get($foreground, secondary-text); &:before, &:after { background: map-get($foreground, divider); } } } } } // Content container .content-container { @if ($is-dark) { background: treo-color('cool-gray', 700); } @else { background: treo-color('indigo', 700); } color: white; .background { path { @if ($is-dark) { fill: treo-color('cool-gray', 900); } @else { fill: treo-color('indigo', 100); } } } .content { .description { opacity: 0.7; } } } } } } ================================================ FILE: webapp/frontend/src/@treo/styles/components/_input.scss ================================================ input { } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $foreground: map-get($theme, foreground); input, textarea { background: transparent; // Placeholder color &::placeholder { color: map-get($foreground, hint-text); } &::-moz-placeholder { color: map-get($foreground, hint-text); } &::-webkit-input-placeholder { color: map-get($foreground, hint-text); } &:-ms-input-placeholder { color: map-get($foreground, hint-text); } &:-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; } } } ================================================ FILE: webapp/frontend/src/@treo/styles/components/_table.scss ================================================ .rich-text { table { width: 100%; border-spacing: 0; thead { tr { th { padding: 16px; border-bottom-width: 2px; text-align: left; font-weight: 500; &:first-child { padding-left: 24px; } &:last-child { padding-right: 24px; } } } } tbody { tr { td { padding: 16px; border-bottom-width: 1px; text-align: left; &:first-child { padding-left: 24px; } &:last-child { padding-right: 24px; } } &:last-child { td { border-bottom: none; } } } } tfoot { tr { th { padding: 16px; border-top-width: 2px; text-align: left; font-weight: 500; &:first-child { padding-left: 24px; } &:last-child { padding-right: 24px; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { } ================================================ FILE: webapp/frontend/src/@treo/styles/layout/_content.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Common // ----------------------------------------------------------------------------------------------------- // Header %content-layout-header { display: flex; padding: 40px; @include treo-breakpoint('lt-md') { flex-direction: column; } @include treo-breakpoint('xs') { padding: 32px 24px; } .breadcrumb { margin-bottom: 8px; } h1, h2, h3, h4, h5, h6 { margin: 0; } .left { align-self: center; margin-right: 24px; @include treo-breakpoint('lt-md') { align-self: flex-start; justify-self: center; } } .right { display: flex; align-items: center; align-self: center; margin-left: auto; white-space: nowrap; @include treo-breakpoint('lt-md') { align-self: flex-start; justify-self: center; margin-top: 24px; margin-left: 0; } } } // ----------------------------------------------------------------------------------------------------- // @ Content layout // ----------------------------------------------------------------------------------------------------- .content-layout { display: flex; flex-direction: column; flex: 1 1 auto; width: 100%; max-width: 100%; min-width: 0; // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Basic - Normal scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-basic-normal-scroll { > .main { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Basic - Content scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-basic-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .main { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Standard - Normal scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-standard-normal-scroll { > .header { @extend %content-layout-header; } > .main { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Standard - Content scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-standard-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .header { @extend %content-layout-header; } > .main { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Standard - Inner scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-standard-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .header { @extend %content-layout-header; } > .main { flex: 1 1 auto; padding: 40px; overflow-y: auto; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Tabs - Normal scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-tabs-normal-scroll { > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { flex: 1 1 auto; .mat-tab-group { .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Tabs - Content scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-tabs-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { display: flex; flex-direction: column; flex: 1 1 auto; .mat-tab-group { .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Tabs - Inner scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-tabs-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { display: flex; flex-direction: column; flex: 1 1 auto; overflow: hidden; .mat-tab-group { overflow: hidden; .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Tabs navigation - Normal scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-tabs-navigation-normal-scroll { > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { display: flex; flex-direction: column; flex: 1 1 auto; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; } } .main-inner { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Tabs navigation - Content scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-tabs-navigation-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { display: flex; flex-direction: column; flex: 1 1 auto; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; } } .main-inner { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Tabs navigation - Inner scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-tabs-navigation-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { display: flex; flex-direction: column; flex: 1 1 auto; overflow: hidden; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; } } .main-inner { flex: 1 1 auto; padding: 40px; overflow-y: auto; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Basic - Normal scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-basic-normal-scroll { > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Basic - Content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-basic-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .mat-drawer-container { flex: 1 1 auto; overflow: visible; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Basic - Inner scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-basic-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .mat-drawer-container { flex: 1 1 auto; height: 100%; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Standard - Normal scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-standard-normal-scroll { > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; } > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Standard - Content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-standard-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .mat-drawer-container { flex: 1 1 auto; overflow: visible; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; } > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Standard - Drawer content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-standard-drawer-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; } > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Standard - Inner scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-standard-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .mat-drawer-container { flex: 1 1 auto; height: 100%; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { display: flex; flex-direction: column; overflow: hidden; > .header { @extend %content-layout-header; } > .main { padding: 40px; overflow-y: auto; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs - Normal scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-normal-scroll { > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { flex: 1 1 auto; .mat-tab-group { .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs - Content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .mat-drawer-container { flex: 1 1 auto; overflow: visible; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { flex: 1 1 auto; .mat-tab-group { .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs - Drawer content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-drawer-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { flex: 1 1 auto; .mat-tab-group { .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs - Inner scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .mat-drawer-container { flex: 1 1 auto; height: 100%; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { display: flex; flex-direction: column; overflow: hidden; > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { flex: 1 1 auto; overflow: hidden; .mat-tab-group { height: 100%; .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs navigation - Normal scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-navigation-normal-scroll { > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { display: flex; flex-direction: column; flex: 1 1 auto; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; } } .main-inner { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs navigation - Content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-navigation-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .mat-drawer-container { flex: 1 1 auto; overflow: visible; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { display: flex; flex-direction: column; flex: 1 1 auto; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; } } .main-inner { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs navigation - Drawer content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-navigation-drawer-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { display: flex; flex-direction: column; flex: 1 1 auto; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; } } .main-inner { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs navigation - Inner scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-navigation-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .mat-drawer-container { flex: 1 1 auto; height: 100%; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { display: flex; flex-direction: column; overflow: hidden; > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { display: flex; flex-direction: column; flex: 1 1 auto; overflow: hidden; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; } } .main-inner { flex: 1 1 auto; padding: 40px; overflow-y: auto; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Standard - Normal scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-standard-normal-scroll { > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Standard - Content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-standard-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; overflow: visible; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Standard - Inner scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-standard-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; height: 100%; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { display: flex; flex-direction: column; overflow: hidden; > .main { padding: 40px; overflow-y: auto; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Tabs - Normal scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-tabs-normal-scroll { > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { flex: 1 1 auto; .mat-tab-group { .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; height: 56px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Tabs - Content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-tabs-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; overflow: visible; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { flex: 1 1 auto; .mat-tab-group { .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; height: 56px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Tabs - Inner scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-tabs-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; height: 100%; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { display: flex; flex-direction: column; overflow: hidden; > .main { flex: 1 1 auto; overflow: hidden; .mat-tab-group { height: 100%; .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; height: 56px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Tabs navigation - Normal scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-tabs-navigation-normal-scroll { > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { display: flex; flex-direction: column; flex: 1 1 auto; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; height: 56px; } } .main-inner { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Tabs navigation - Content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-tabs-navigation-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; overflow: visible; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { display: flex; flex-direction: column; flex: 1 1 auto; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; height: 56px; } } .main-inner { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Tabs navigation - Inner scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-tabs-navigation-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; height: 100%; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { display: flex; flex-direction: column; overflow: hidden; > .main { display: flex; flex-direction: column; flex: 1 1 auto; overflow: hidden; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; height: 56px; } } .main-inner { flex: 1 1 auto; padding: 40px; overflow-y: auto; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Basic - Normal scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-basic-normal-scroll { > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Basic - Content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-basic-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .mat-drawer-container { flex: 1 1 auto; overflow: visible; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Basic - Inner scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-basic-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .mat-drawer-container { flex: 1 1 auto; height: 100%; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Standard - Normal scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-standard-normal-scroll { > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; } > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Standard - Content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-standard-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .mat-drawer-container { flex: 1 1 auto; overflow: visible; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; } > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Standard - Drawer content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-standard-drawer-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; } > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Standard - Inner scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-standard-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { display: flex; flex-direction: column; overflow: hidden; > .header { @extend %content-layout-header; } > .main { padding: 40px; overflow-y: auto; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs - Normal scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-normal-scroll { > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { flex: 1 1 auto; .mat-tab-group { .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs - Content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .mat-drawer-container { flex: 1 1 auto; overflow: visible; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { flex: 1 1 auto; .mat-tab-group { .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs - Drawer content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-drawer-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { flex: 1 1 auto; .mat-tab-group { .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs - Inner scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .mat-drawer-container { flex: 1 1 auto; height: 100%; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { display: flex; flex-direction: column; overflow: hidden; > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { flex: 1 1 auto; overflow: hidden; .mat-tab-group { height: 100%; .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs navigation - Normal scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-navigation-normal-scroll { > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { display: flex; flex-direction: column; flex: 1 1 auto; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; } } .main-inner { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs navigation - Content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-navigation-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .mat-drawer-container { flex: 1 1 auto; overflow: visible; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { display: flex; flex-direction: column; flex: 1 1 auto; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; } } .main-inner { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs navigation - Drawer content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-navigation-drawer-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { display: flex; flex-direction: column; flex: 1 1 auto; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; } } .main-inner { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs navigation - Inner scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-navigation-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .mat-drawer-container { flex: 1 1 auto; height: 100%; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { display: flex; flex-direction: column; overflow: hidden; > .header { @extend %content-layout-header; padding-bottom: 24px; } > .main { display: flex; flex-direction: column; flex: 1 1 auto; overflow: hidden; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; } } .main-inner { flex: 1 1 auto; padding: 40px; overflow-y: auto; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Standard - Normal scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-standard-normal-scroll { > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Standard - Content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-standard-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; overflow: visible; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Standard - Inner scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-standard-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; height: 100%; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { display: flex; flex-direction: column; overflow: hidden; > .main { padding: 40px; overflow-y: auto; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Tabs - Normal scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-tabs-normal-scroll { > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { flex: 1 1 auto; .mat-tab-group { .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; height: 56px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Tabs - Content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-tabs-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; overflow: visible; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { flex: 1 1 auto; .mat-tab-group { .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; height: 56px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Tabs - Inner scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-tabs-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; height: 100%; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { display: flex; flex-direction: column; overflow: hidden; > .main { flex: 1 1 auto; overflow: hidden; .mat-tab-group { height: 100%; .mat-tab-header { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } &.mat-tab-header-pagination-controls-enabled { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0; } } .mat-tab-header-pagination { padding: 0; box-shadow: none; } .mat-tab-label { min-width: 128px; height: 56px; } } .mat-tab-body-wrapper { .mat-tab-body { .mat-tab-body-content { padding: 40px; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } } } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Tabs navigation - Normal scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-tabs-navigation-normal-scroll { > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { display: flex; flex-direction: column; flex: 1 1 auto; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; height: 56px; } } .main-inner { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Tabs navigation - Content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-tabs-navigation-content-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; overflow: visible; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { > .main { display: flex; flex-direction: column; flex: 1 1 auto; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; height: 56px; } } .main-inner { flex: 1 1 auto; padding: 40px; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Tabs navigation - Inner scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-tabs-navigation-inner-scroll { position: absolute; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; > .header { @extend %content-layout-header; } > .mat-drawer-container { flex: 1 1 auto; height: 100%; .mat-drawer { min-width: 288px; max-width: 288px; width: 288px; } .mat-drawer-content { display: flex; flex-direction: column; overflow: hidden; > .main { display: flex; flex-direction: column; flex: 1 1 auto; overflow: hidden; nav { margin: 0; padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px; } .mat-tab-link { min-width: 128px; height: 56px; } } .main-inner { flex: 1 1 auto; padding: 40px; overflow-y: auto; -webkit-overflow-scrolling: touch; @include treo-breakpoint('xs') { padding: 24px; } > *:not(router-outlet) { display: block; } } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $background: map-get($theme, background); $foreground: map-get($theme, foreground); $primary: map-get($theme, primary); $is-dark: map-get($theme, is-dark); .content-layout { // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Basic - Normal scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-basic-normal-scroll { } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Basic - Content scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-basic-content-scroll { } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Standard - Normal scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-standard-normal-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Standard - Content scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-standard-content-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Standard - Inner scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-standard-inner-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Tabs - Normal scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-tabs-normal-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Tabs - Content scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-tabs-content-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Tabs - Inner scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-tabs-inner-scroll { > .header { background: map-get($background, card); } > .main { .mat-tab-group { .mat-tab-header { background: map-get($background, card); } } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Tabs navigation - Normal scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-tabs-navigation-normal-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { nav { @if (not $is-dark) { background: map-get($background, card); } } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Tabs navigation - Content scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-tabs-navigation-content-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { nav { @if (not $is-dark) { background: map-get($background, card); } } } } // ----------------------------------------------------------------------------------------------------- // @ Fullwidth - Tabs navigation - Inner scroll // ----------------------------------------------------------------------------------------------------- &.fullwidth-tabs-navigation-inner-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { nav { @if (not $is-dark) { background: map-get($background, card); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Basic - Normal scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-basic-normal-scroll { > .mat-drawer-container { .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Basic - Content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-basic-content-scroll { > .mat-drawer-container { .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Basic - Inner scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-basic-inner-scroll { > .mat-drawer-container { .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Standard - Normal scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-standard-normal-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Standard - Content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-standard-content-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Standard - Drawer content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-standard-drawer-content-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Standard - Inner scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-standard-inner-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs - Normal scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-normal-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs - Content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-content-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs - Drawer content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-drawer-content-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs - Inner scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-inner-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs navigation - Normal scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-navigation-normal-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-nav-bar { &.mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs navigation - Content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-navigation-content-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-nav-bar { &.mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs navigation - Drawer content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-navigation-drawer-content-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-nav-bar { &.mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar fullheight - Tabs navigation - Inner scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-fullheight-tabs-navigation-inner-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-nav-bar { &.mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Standard - Normal scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-standard-normal-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Standard - Content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-standard-content-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Standard - Inner scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-standard-inner-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Tabs - Normal scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-tabs-normal-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer-content { > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Tabs - Content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-tabs-content-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer-content { > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Tabs - Inner scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-tabs-inner-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer-content { > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Tabs navigation - Normal scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-tabs-navigation-normal-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer-content { > .main { .mat-tab-nav-bar { &.mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Tabs navigation - Content scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-tabs-navigation-content-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer-content { > .main { .mat-tab-nav-bar { &.mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Left sidebar content - Tabs navigation - Inner scroll // ----------------------------------------------------------------------------------------------------- &.left-sidebar-content-tabs-navigation-inner-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer-content { > .main { .mat-tab-nav-bar { &.mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Basic - Normal scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-basic-normal-scroll { > .mat-drawer-container { .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Basic - Content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-basic-content-scroll { > .mat-drawer-container { .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Basic - Inner scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-basic-inner-scroll { > .mat-drawer-container { .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Standard - Normal scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-standard-normal-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Standard - Content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-standard-content-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Standard - Drawer content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-standard-drawer-content-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Standard - Inner scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-standard-inner-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs - Normal scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-normal-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs - Content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-content-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs - Drawer content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-drawer-content-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs - Inner scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-inner-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs navigation - Normal scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-navigation-normal-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-nav-bar { &.mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs navigation - Content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-navigation-content-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-nav-bar { &.mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs navigation - Drawer content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-navigation-drawer-content-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-nav-bar { &.mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar fullheight - Tabs navigation - Inner scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-fullheight-tabs-navigation-inner-scroll { > .mat-drawer-container { .mat-drawer-content { > .header { @if (not $is-dark) { background: map-get($background, card); } } > .main { .mat-tab-nav-bar { &.mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Standard - Normal scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-standard-normal-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Standard - Content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-standard-content-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Standard - Inner scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-standard-inner-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Tabs - Normal scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-tabs-normal-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer-content { > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Tabs - Content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-tabs-content-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer-content { > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Tabs - Inner scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-tabs-inner-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer-content { > .main { .mat-tab-group { .mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Tabs navigation - Normal scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-tabs-navigation-normal-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer-content { > .main { .mat-tab-nav-bar { &.mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Tabs navigation - Content scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-tabs-navigation-content-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer-content { > .main { .mat-tab-nav-bar { &.mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } // ----------------------------------------------------------------------------------------------------- // @ Right sidebar content - Tabs navigation - Inner scroll // ----------------------------------------------------------------------------------------------------- &.right-sidebar-content-tabs-navigation-inner-scroll { > .header { @if (not $is-dark) { background: map-get($background, card); } border-bottom: 1px solid map-get($foreground, divider); } > .mat-drawer-container { .mat-drawer-content { > .main { .mat-tab-nav-bar { &.mat-tab-header { @if (not $is-dark) { background: map-get($background, card); } } } } } .mat-drawer { @if ($is-dark) { background: treo-color('cool-gray', 900); } } } } } } ================================================ FILE: webapp/frontend/src/@treo/styles/main.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ This file meant to be imported only once! // Use treo.scss to access to the Angular Material and Treo utilities // ----------------------------------------------------------------------------------------------------- // 1. Utilities @import 'treo'; // 2. Vendors @import 'vendors/normalize'; @import 'vendors/angular-material'; // 3. Base @import 'base/preflight'; @import 'base/typography'; @import 'base/colors'; @import 'base/theming'; // 4. Layout @import 'layout/content'; // 5. Components @import 'components/card'; @import 'components/input'; @import 'components/table'; // 6. Overrides @import 'overrides/angular-material'; @import 'overrides/highlightjs'; @import 'overrides/perfect-scrollbar'; @import 'overrides/quill'; ================================================ FILE: webapp/frontend/src/@treo/styles/overrides/_angular-material.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Angular Material styles, overrides and extensions // ----------------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------------- // @ 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); @include treo-elevation('default', true); &:last-child { margin-bottom: 0; } &.mat-expanded, &:hover { @include treo-elevation('lg', true); } .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; } } } // ----------------------------------------------------------------------------------------------------- // @ 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 { display: inline-flex !important; align-items: center; justify-content: center; height: 100%; } // Large button &.treo-mat-button-large { height: 48px; min-height: 48px; max-height: 48px; } } .mat-fab { max-height: 56px; } // 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; animation-duration: 6000ms; } } } } // ----------------------------------------------------------------------------------------------------- // @ Button Toggle // ----------------------------------------------------------------------------------------------------- .mat-button-toggle-group { &.mat-button-toggle-group-appearance-standard { .mat-button-toggle + .mat-button-toggle { background-clip: padding-box; } } } // ----------------------------------------------------------------------------------------------------- // @ 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; } // ----------------------------------------------------------------------------------------------------- // @ Form fields // ----------------------------------------------------------------------------------------------------- // Treo only uses 'fill' style form fields and therefore // only provides fixes and tweaks for that style .mat-form-field.mat-form-field-appearance-fill { // 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; } &: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; @include treo-elevation('sm'); .mat-form-field-prefix { > .mat-icon { margin-right: 12px; } > .mat-icon-button { margin: 0 4px 0 -8px; } > .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 -8px 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; .mat-icon-button { width: 40px; min-width: 40px; height: 40px; min-height: 40px; } // 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; @include treo-icon-size(24); } } // Datepicker default icon size .mat-datepicker-toggle-default-icon { @include treo-icon-size(24); } // 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; } } } } // 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; } } } // Adds better alignment for textarea inputs &.treo-mat-textarea { &.mat-form-field.mat-form-field-appearance-fill { .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 &.treo-mat-no-subscript { &.mat-form-field.mat-form-field-appearance-fill { .mat-form-field-wrapper { padding-bottom: 0; margin-bottom: 0; .mat-form-field-subscript-wrapper { display: none !important; height: 0 !important; } } } } // Rounded &.treo-mat-rounded { &.mat-form-field.mat-form-field-appearance-fill { .mat-form-field-wrapper { .mat-form-field-flex { border-radius: 24px; } } // Emphasized affix &.treo-mat-emphasized-affix { .mat-form-field-wrapper { .mat-form-field-flex { .mat-form-field-prefix { border-radius: 24px 0 0 24px; } .mat-form-field-suffix { border-radius: 0 24px 24px 0; } } } } } } // Dense &.treo-mat-dense { &.mat-form-field.mat-form-field-appearance-fill { .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: -4px; margin-right: 12px; } } .mat-form-field-suffix { > .mat-icon-button { margin-left: 12px; margin-right: -4px; } } .mat-form-field-infix { .mat-input-element { padding: 11px 0; } } } } } // Rounded &.treo-mat-rounded { &.mat-form-field.mat-form-field-appearance-fill { .mat-form-field-wrapper { .mat-form-field-flex { border-radius: 20px; } } } // Emphasized affix &.treo-mat-emphasized-affix { &.mat-form-field.mat-form-field-appearance-fill { .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 &.treo-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 8px 0 -8px; } > .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 -8px 0 8px; } > .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; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ 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; } &::-moz-placeholder { transition: none !important; } &::-webkit-input-placeholder { transition: none !important; } &:-ms-input-placeholder { transition: none !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; @include treo-breakpoint('xs') { justify-content: space-between; } // Page size select .mat-paginator-page-size { align-items: center; min-height: 40px; margin: 8px; .mat-paginator-page-size-label { margin-right: 12px; @include treo-breakpoint('xs') { display: none; } } .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; } .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; } } } // ----------------------------------------------------------------------------------------------------- // @ 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-label { opacity: 0.87 !important; } // ----------------------------------------------------------------------------------------------------- // @ Textarea // ----------------------------------------------------------------------------------------------------- textarea.mat-input-element { box-sizing: content-box !important; } // ----------------------------------------------------------------------------------------------------- // @ Theming overrides and fixes // ----------------------------------------------------------------------------------------------------- @include treo-theme { $background: map-get($theme, background); $foreground: map-get($theme, foreground); $primary: map-get($theme, primary); $warn: map-get($theme, warn); $is-dark: map-get($theme, is-dark); // ----------------------------------------------------------------------------------------------------- // @ Accordion // ----------------------------------------------------------------------------------------------------- .mat-accordion { .mat-expansion-panel { &:not(.mat-expanded) { .mat-expansion-panel-header { &:not([aria-disabled=true]) { &.cdk-keyboard-focused, &.cdk-program-focused, &:hover { background: transparent !important; } } } } .mat-expansion-panel-body { color: map-get($foreground, secondary-text); } } } // ----------------------------------------------------------------------------------------------------- // @ Buttons // ----------------------------------------------------------------------------------------------------- // Colored background buttons .mat-flat-button, .mat-raised-button, .mat-fab, .mat-mini-fab { // Apply palette's contrasting color rather than main foreground color @each $palette in (primary, accent, warn) { $palette-contrast-color: map-get(map-get($theme, $palette), default-contrast); &.mat-#{$palette}:not([disabled]) { .mat-icon { color: $palette-contrast-color; } } } .mat-icon { color: currentColor !important; } // Add hover and focus style on all buttons .mat-button-focus-overlay { @if ($is-dark) { background-color: rgba(0, 0, 0, 0.05); } @else { background-color: rgba(treo-color('cool-gray', 400), 0.2); } } // On palette colored buttons, use a darker color @each $palette in (primary, accent, warn) { &.mat-#{$palette} { .mat-button-focus-overlay { background-color: rgba(0, 0, 0, 0.1); } } } &:hover, &.cdk-keyboard-focused, &.cdk-program-focused { .mat-button-focus-overlay { opacity: 1; } } @media (hover: none) { &:hover { .mat-button-focus-overlay { opacity: 0 !important; } } } &[disabled] { .mat-button-focus-overlay { opacity: 0 !important; } } } // Transparent background buttons .mat-button, .mat-icon-button, .mat-stroked-button { // Apply palette's color rather than main foreground color @each $palette in (primary, accent, warn) { $palette-color: map-get(map-get($theme, $palette), default); &.mat-#{$palette}:not([disabled]) { .mat-icon { color: $palette-color; } } } // Add hover and focus styles .mat-button-focus-overlay { @if ($is-dark) { background-color: rgba(0, 0, 0, 0.05) !important; } @else { background-color: rgba(treo-color('cool-gray', 400), 0.2) !important; } } // On palette colored buttons, use a the palette color @each $palette in (primary, accent, warn) { &.mat-#{$palette} { .mat-button-focus-overlay { background-color: rgba(map-get(map-get($theme, $palette), default), 0.1) !important; } } } &:hover, &.cdk-keyboard-focused, &.cdk-program-focused { .mat-button-focus-overlay { opacity: 1; } } @media (hover: none) { &:hover { .mat-button-focus-overlay { opacity: 0 !important; } } } &[disabled] { .mat-button-focus-overlay { opacity: 0 !important; } } } // All buttons .mat-flat-button, .mat-raised-button, .mat-fab, .mat-mini-fab, .mat-button, .mat-icon-button, .mat-stroked-button { // Move mat-button-wrapper above the ripple and focus overlay .mat-button-wrapper { position: relative; z-index: 2; } .mat-button-focus-overlay, .mat-button-ripple { z-index: 1; } } // Stroked buttons .mat-stroked-button { // Border color &:not([disabled]) { @if ($is-dark) { border-color: treo-color('cool-gray', 500); } @else { border-color: treo-color('cool-gray', 300); } } &[disabled] { @if ($is-dark) { border-color: treo-color('cool-gray', 600); } @else { border-color: treo-color('cool-gray', 200); } } } // ----------------------------------------------------------------------------------------------------- // @ Drawer // ----------------------------------------------------------------------------------------------------- .mat-drawer-backdrop.mat-drawer-shown { background-color: rgba(0, 0, 0, 0.6); } // ----------------------------------------------------------------------------------------------------- // @ Form fields // ----------------------------------------------------------------------------------------------------- .mat-form-field.mat-form-field-appearance-fill { .mat-form-field-label { color: map-get($foreground, text) !important; } .mat-hint { color: map-get($foreground, hint-text); } // Border color on disabled fields &.mat-form-field-disabled { .mat-form-field-wrapper { .mat-form-field-flex { @if ($is-dark) { border-color: treo-color('cool-gray', 700); } @else { border-color: treo-color('cool-gray', 200); } } } } // Border color on invalid fields &.mat-form-field-invalid { .mat-form-field-wrapper { .mat-form-field-flex { border-color: map-get($warn, default); } } } // Background color on focused fields &.mat-focused { .mat-form-field-wrapper { .mat-form-field-flex { background-color: map-get($background, card); } } } // Border color on focused and valid fields &.mat-focused:not(.mat-form-field-invalid) { .mat-form-field-wrapper { .mat-form-field-flex { border-color: map-get($primary, default); } } } // Placeholder &.mat-form-field-hide-placeholder { .mat-input-element { &::placeholder { color: map-get($foreground, hint-text) !important; -webkit-text-fill-color: currentColor !important; } &::-moz-placeholder { color: map-get($foreground, hint-text) !important; -webkit-text-fill-color: currentColor !important; } &::-webkit-input-placeholder { color: map-get($foreground, hint-text) !important; -webkit-text-fill-color: currentColor !important; } &:-ms-input-placeholder { color: map-get($foreground, hint-text) !important; -webkit-text-fill-color: currentColor !important; } } } // Use svg arrow for native select &.mat-form-field-type-mat-native-select { .mat-form-field-infix { select { @if ($is-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"); } @else { 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; } } } .mat-form-field-wrapper { .mat-form-field-flex { @if ($is-dark) { background-color: rgba(0, 0, 0, 0.05); border-color: treo-color('cool-gray', 500); } @else { background-color: white; border-color: treo-color('cool-gray', 300); } .mat-form-field-prefix, .mat-form-field-suffix { color: map-get($foreground, hint-text); .mat-icon, .mat-icon-button, .mat-select-value { color: map-get($foreground, hint-text); } } } } // Emphasized affix &.treo-mat-emphasized-affix { .mat-form-field-wrapper { .mat-form-field-flex { .mat-form-field-prefix, .mat-form-field-suffix { background: map-get($background, background); @if ($is-dark) { border-color: treo-color('cool-gray', 500); } @else { border-color: treo-color('cool-gray', 300); } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Inputs // ----------------------------------------------------------------------------------------------------- .mat-input-element { // Placeholder color &::placeholder { color: map-get($foreground, hint-text); } &::-moz-placeholder { color: map-get($foreground, hint-text); } &::-webkit-input-placeholder { color: map-get($foreground, hint-text); } &:-ms-input-placeholder { color: map-get($foreground, hint-text); } } // If inside an invalid form field .mat-form-field-invalid { .mat-input-element { // Placeholder color (error) &::placeholder { color: map-get($warn, default); } &::-moz-placeholder { color: map-get($warn, default); } &::-webkit-input-placeholder { color: map-get($warn, default); } &:-ms-input-placeholder { color: map-get($warn, default); } } } // ----------------------------------------------------------------------------------------------------- // @ Select // ----------------------------------------------------------------------------------------------------- .mat-select { // Placeholder color .mat-select-placeholder { color: map-get($foreground, hint-text); } } // If inside an invalid form .mat-form-field-invalid { // Placeholder color (error) .mat-select-placeholder { color: map-get($warn, default); } } // ----------------------------------------------------------------------------------------------------- // @ Toolbar // ----------------------------------------------------------------------------------------------------- .mat-toolbar { // Apply palette's contrasting color rather than main foreground color @each $palette in (primary, accent, warn) { $palette-contrast-color: map-get(map-get($theme, $palette), default-contrast); &.mat-#{$palette} { .mat-icon { color: $palette-contrast-color; } .text-secondary { color: rgba(rgba($palette-contrast-color, 1), 0.6); } .text-hint { color: rgba(rgba($palette-contrast-color, 1), 0.38); } .text-disabled { color: rgba(rgba($palette-contrast-color, 1), 0.38); } .divider { color: rgba($palette-contrast-color, 0.12); } } } } } ================================================ FILE: webapp/frontend/src/@treo/styles/overrides/_highlightjs.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Highlight.js color scheme overrides // ----------------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $foreground: map-get($theme, foreground); $is-dark: map-get($theme, is-dark); // DARK COLOR SCHEME @if ($is-dark) { code, pre { .hljs-built_in, .hljs-selector-tag, .hljs-section, .hljs-link { color: #8BE9FD; } .hljs-keyword { color: #FF79C6; } .hljs, .hljs-subst { color: #F8F8F2; } .hljs-title { color: #50FA7B; } .hljs-meta, .hljs-type, .hljs-symbol, .hljs-bullet, .hljs-addition, .hljs-variable, .hljs-template-tag, .hljs-template-variable { color: #F1FA8C; } .hljs-name { color: #80DEEA; } .hljs-attr { color: #E1BEE7; } .hljs-string { color: #A5D6A7; } .hljs-comment, .hljs-quote, .hljs-deletion { color: #6272A4; } .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-title, .hljs-section, .hljs-doctag, .hljs-type, .hljs-name, .hljs-strong { font-weight: 700; } .hljs-literal, .hljs-number { color: #BD93F9; } .hljs-emphasis { font-style: italic; } } } // LIGHT COLOR SCHEME @else { code[class*='language-'], pre[class*='language-'] { .hljs-comment, .hljs-quote { color: #A0A1A7; font-style: italic; } .hljs-doctag, .hljs-keyword, .hljs-formula { color: #A626A4; } .hljs-name { color: #7986CB; } .hljs-tag { color: #B9BBD2; } .hljs-section, .hljs-selector-tag, .hljs-deletion, .hljs-subst { color: #E45649; } .hljs-literal { color: #0184BB; } .hljs-string, .hljs-regexp, .hljs-addition, .hljs-attribute, .hljs-meta-string { color: #50A14F; } .hljs-built_in, .hljs-class .hljs-title { color: #C18401; } .hljs-attr, .hljs-variable, .hljs-template-variable, .hljs-type, .hljs-selector-class, .hljs-selector-attr, .hljs-selector-pseudo, .hljs-number { color: #BA68C8; } .hljs-symbol, .hljs-bullet, .hljs-link, .hljs-meta, .hljs-selector-id, .hljs-title { color: #4078F2; } .hljs-emphasis { font-style: italic; } .hljs-strong { font-weight: 700; } .hljs-link { text-decoration: underline; } } } } ================================================ FILE: webapp/frontend/src/@treo/styles/overrides/_perfect-scrollbar.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ 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); } } } ================================================ FILE: webapp/frontend/src/@treo/styles/overrides/_quill.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Quill editor style overrides // ----------------------------------------------------------------------------------------------------- .ql-toolbar { border-radius: 6px 6px 0 0; padding: 0 !important; .ql-formats { margin: 11px 8px !important; } .ql-picker { &.ql-expanded { .ql-picker-options { z-index: 10 !important; } } } } .ql-container { overflow: hidden; border-radius: 0 0 6px 6px; @include treo-elevation('sm'); .ql-editor { min-height: 160px; max-height: 160px; height: 160px; } } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $background: map-get($theme, background); $foreground: map-get($theme, foreground); $primary: map-get($theme, primary); $is-dark: map-get($theme, is-dark); .ql-toolbar { @if ($is-dark) { background-color: rgba(0, 0, 0, 0.05); border-color: treo-color('cool-gray', 500); } @else { background: treo-color('cool-gray', 100); border-color: treo-color('cool-gray', 300); } .ql-picker { &.ql-expanded { .ql-picker-label { @if ($is-dark) { border-color: treo-color('cool-gray', 500); } @else { border-color: treo-color('cool-gray', 300); } } .ql-picker-options { @if ($is-dark) { border-color: treo-color('cool-gray', 500); } @else { border-color: treo-color('cool-gray', 300); } background: map-get($background, card); } } .ql-picker-label { color: map-get($foreground, text); } .ql-picker-options { .ql-picker-item { color: map-get($foreground, text); } } } .ql-stroke, .ql-stroke-mitter { stroke: map-get($foreground, icon); } .ql-fill { fill: map-get($foreground, 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 { color: map-get($primary, default) !important; .ql-stroke, .ql-stroke-mitter { stroke: map-get($primary, default) !important; } .ql-fill { fill: map-get($primary, default) !important; } } } .ql-container { @if ($is-dark) { border-color: treo-color('cool-gray', 500); } @else { border-color: treo-color('cool-gray', 300); } .ql-editor { @if ($is-dark) { background-color: rgba(0, 0, 0, 0.05); } @else { background-color: treo-color('cool-gray', 50); } &:focus { background-color: map-get($background, card); } &.ql-blank::before { color: map-get($foreground, hint-text); } } } } ================================================ FILE: webapp/frontend/src/@treo/styles/treo.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Use this file to access to the core Angular Material and Treo utilities // ----------------------------------------------------------------------------------------------------- // 1. Angular Material theming tools @import '~@angular/material/theming'; // 2. Utilities @import '../tailwind/exported/variables'; @import 'utilities/theming'; @import 'utilities/breakpoints'; @import 'utilities/colors'; @import 'utilities/elevations'; @import 'utilities/icons'; @import 'utilities/keyframes'; // 3. Themes definition file that includes $treo-themes map @import 'src/styles/themes'; ================================================ FILE: webapp/frontend/src/@treo/styles/utilities/_breakpoints.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Mixins // ----------------------------------------------------------------------------------------------------- /// /// Wrap the mixin content with the given media breakpoint. /// If breakpoint name does not exist on the breakpoints list, /// apply the given name as a media rule. /// /// @access public /// @param {String} $breakpoint - Name of the breakpoint or a media rule /// @mixin treo-breakpoint($breakpoint) { $mediaQuery: map-get($treo-breakpoints, $breakpoint); @if ($mediaQuery != null) { @media #{$mediaQuery} { @content } } @else { @media #{$breakpoint} { @content } } } ================================================ FILE: webapp/frontend/src/@treo/styles/utilities/_colors.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Functions // ----------------------------------------------------------------------------------------------------- /// /// Get color from treo color maps /// /// @access public /// @param {String} $color - Desired color /// @param {String|Number} $hue - Desired hue /// @param {Number} $opacity - Desired opacity /// @function treo-color($color, $hue: 500, $opacity: 1) { // Get the color palette $palette: map-get($treo-colors, $color); // Make sure the palette is available @if ($palette == null) { @error "Color '#{$color}' is not available!"; } // Get the color $color: map-get($palette, $hue); // Make sure the hue is available @if ($color == null) { @error "Hue '#{$hue}' is not available!"; } // Apply the opacity if possible @if (type-of($color) == color) { $color: rgba($color, $opacity); } // Return the color @return $color; } /// /// Get contrast color from treo color maps /// /// @access public /// @param {String} $contrast - Desired contrast /// @param {String|Number} $hue - Desired hue /// @param {Number} $opacity - Desired opacity /// @function treo-contrast($contrast, $hue: 500, $opacity: 1) { // Get the color palette $palette: map-get($treo-colors, $contrast); // Make sure the palette is available @if ($palette == null) { @error "Contrast '#{$contrast}' is not available!"; } // Get the contrast $contrast: map-get(map-get($palette, contrast), $hue); // Make sure the hue is available @if ($contrast == null) { @error "Hue '#{$hue}' is not available!"; } // Apply the opacity if possible @if (type-of($contrast) == color) { $color: rgba($contrast, $opacity); } // Return the contrast @return $contrast; } /// /// Modify the Angular Material theme object to soften foreground colors /// on light themes and increase contrast on dark themes /// /// @access private /// @param {Map} $theme - Angular Material theme map /// @function _treo-modify-angular-material-theme-colors($theme) { // Store the is-dark for convenience $is-dark: map-get($theme, is-dark); // Generate the modified foreground palette based on // Angular Material's mat-xxx-theme-foreground map $foreground: ( base: if($is-dark, white, black), divider: if($is-dark, rgba(treo-color('cool-gray', 100), 0.12), treo-color('cool-gray', 200)), dividers: if($is-dark, rgba(treo-color('cool-gray', 100), 0.12), treo-color('cool-gray', 200)), disabled: if($is-dark, treo-color('cool-gray', 600), treo-color('cool-gray', 400)), disabled-button: if($is-dark, treo-color('cool-gray', 800), treo-color('cool-gray', 400)), disabled-text: if($is-dark, treo-color('cool-gray', 600), treo-color('cool-gray', 400)), elevation: black, hint-text: if($is-dark, treo-color('cool-gray', 500), treo-color('cool-gray', 400)), secondary-text: if($is-dark, treo-color('cool-gray', 400), treo-color('cool-gray', 500)), icon: if($is-dark, treo-color('cool-gray', 100), treo-color('cool-gray', 500)), icons: if($is-dark, treo-color('cool-gray', 100), treo-color('cool-gray', 500)), text: if($is-dark, white, treo-color('cool-gray', 800)), slider-min: if($is-dark, white, treo-color('cool-gray', 800)), slider-off: if($is-dark, treo-color('cool-gray', 500), treo-color('cool-gray', 300)), slider-off-active: if($is-dark, treo-color('cool-gray', 400), treo-color('cool-gray', 400)), ); // Generate the modified background palette based on // Angular Material's mat-xxx-theme-background map $background: ( status-bar: if($is-dark, treo-color('cool-gray', 900), treo-color('cool-gray', 300)), app-bar: if($is-dark, treo-color('cool-gray', 900), white), background: if($is-dark, treo-color('cool-gray', 900), treo-color('cool-gray', 100)), hover: if($is-dark, rgba(255, 255, 255, 0.05), rgba(treo-color('cool-gray', 400), 0.12)), card: if($is-dark, treo-color('cool-gray', 800), white), dialog: if($is-dark, treo-color('cool-gray', 800), white), disabled-button: if($is-dark, rgba(treo-color('cool-gray', 900), 0.38), rgba(treo-color('cool-gray', 400), 0.38)), raised-button: if($is-dark, treo-color('cool-gray', 900), white), focused-button: if($is-dark, treo-color('cool-gray', 200), treo-color('cool-gray', 500)), selected-button: if($is-dark, rgba(255, 255, 255, 0.05), treo-color('cool-gray', 200)), selected-disabled-button: if($is-dark, treo-color('cool-gray', 800), treo-color('cool-gray', 200)), disabled-button-toggle: if($is-dark, treo-color('cool-gray', 900), treo-color('cool-gray', 300)), unselected-chip: if($is-dark, treo-color('cool-gray', 600), treo-color('cool-gray', 200)), disabled-list-option: if($is-dark, treo-color('cool-gray', 200), treo-color('cool-gray', 300)), tooltip: if($is-dark, treo-color('cool-gray', 500), treo-color('cool-gray', 800)), ); // Store the modified theme. // // Since modifications only being done on 'foreground' // and 'background' palettes, add them from above but // keep everything else original $modified-theme: ( primary: map-get($theme, primary), accent: map-get($theme, accent), warn: map-get($theme, warn), is-dark: map-get($theme, is-dark), foreground: $foreground, background: $background ); // Return the modified theme @return $modified-theme; } /// /// Generate an Angular Material light theme /// and modify it before returning /// /// @access public /// @param {Map} $primary-palette - Desired primary palette /// @param {Map} $accent-palette - Desired accent palette /// @param {Map} $warn-palette - Desired warn palette /// @function treo-light-theme($primary-palette, $accent-palette, $warn-palette) { // Generate the Angular Material theme $angular-material-theme: mat-light-theme($primary-palette, $accent-palette, $warn-palette); // Modify and return the theme @return _treo-modify-angular-material-theme-colors($angular-material-theme); } /// /// Generate an Angular Material dark theme /// and modify it before returning /// /// @access public /// @param {Map} $primary-palette - Desired primary palette /// @param {Map} $accent-palette - Desired accent palette /// @param {Map} $warn-palette - Desired warn palette /// @function treo-dark-theme($primary-palette, $accent-palette, $warn-palette) { // Generate the Angular Material theme $angular-material-theme: mat-dark-theme($primary-palette, $accent-palette, $warn-palette); // Modify and return the theme @return _treo-modify-angular-material-theme-colors($angular-material-theme); } /// /// Generate an Angular Material compatible palette /// /// @access public /// @param {Map} $palette - Name of the palette /// @param {Map} $default - Default hue /// @param {Map} $lighter - Lighter hue /// @param {Map} $darker - Darker hue /// @param {Map} $text - Text color /// @function treo-palette($palette, $default: 500, $lighter: 100, $darker: 700, $text: $default) { @return mat-palette(map-get($treo-colors, $palette), $default, $lighter, $darker, $text); } // ----------------------------------------------------------------------------------------------------- // @ Mixins // ----------------------------------------------------------------------------------------------------- /// /// Generate color classes /// /// @access private /// @param {String} $color-name - Name of the color /// @param {Color} $color - Color /// @param {Color} $contrast-color - Contrasting color of the Color /// @param {String} $hue-value - Hue value of the Color /// @mixin _generate-color-classes($color-name, $color, $contrast-color, $hue-value) { // Text color .text-#{$color-name}#{$hue-value} { color: $color !important; } // Background color .bg-#{$color-name}#{$hue-value} { background: $color !important; } // Background and text color .#{$color-name}#{$hue-value} { background: $color !important; color: $contrast-color !important; // Icon .mat-icon { color: $contrast-color !important; } // Text &.text-secondary, .text-secondary { color: rgba($contrast-color, 0.6) !important; } &.text-hint, .text-hint { color: rgba($contrast-color, 0.38) !important; } &.text-disabled, .text-disabled { color: rgba($contrast-color, 0.38) !important; } &.divider, .divider { color: rgba($contrast-color, 0.12) !important; } } // Border color .border-#{$color-name}#{$hue-value} { border-color: $color !important; } .hover\:border-#{$color-name}#{$hue-value}:hover { border-color: $color !important; } .focus\:border-#{$color-name}#{$hue-value}:focus { border-color: $color !important; } .active\:border-#{$color-name}#{$hue-value}:active { border-color: $color !important; } } /// /// Generate helper classes for 'primary', 'accent' and 'warn' colors /// /// @access public /// @param {Map} $palettes - Palettes to generate classes for /// @mixin treo-color-classes($palettes) { // Go through each palette @each $palette-name, $palette in $palettes { // Get each hue value @each $hue in (100, 200, 300, 400, 500, 600, 700, 800, 900) { // Get color and contrast $color: map-get($palette, $hue); $contrast: map-get($palette, '#{$hue}-contrast'); // If both color and its contrasting color exist, generate the color classes... @if ($color != null and $contrast != null) { // Generate color classes @include _generate-color-classes($palette-name, $color, $contrast, '-#{$hue}'); // If the hue equals to 500, generate color classes one more time, // but without the hue value suffix @if ($hue == 500) { // Generate color classes @include _generate-color-classes($palette-name, $color, $contrast, ''); } } } } } ================================================ FILE: webapp/frontend/src/@treo/styles/utilities/_elevations.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Mixins // ----------------------------------------------------------------------------------------------------- /// /// Adds an elevation from pre-defined elevations map. Elevation values are the same /// as default TailwindCSS elevations to keep things consistent. /// /// @access public /// @param {String} $elevation - The amount of the elevation that the element will have /// @param {Boolean} $important - Whether to add an !important tag to the shadow rule /// @param {Color} $color - Color of the shadow /// @mixin treo-elevation($elevation: 'default', $important: false, $color: rgb(0, 0, 0)) { // Get the shadow value $shadow: map-get($treo-elevations, $elevation); // Throw an error if the shadow does not exist @if ($shadow == null) { @error 'Elevation `' + $elevation + '` does not exists!'; } box-shadow: #{$shadow} if($important, !important, null); } ================================================ FILE: webapp/frontend/src/@treo/styles/utilities/_icons.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Mixins // ----------------------------------------------------------------------------------------------------- /// /// Correctly sets the icon size /// /// @access public /// @param {String} $size - Size of the icon (px) /// @param {Boolean} $important - Set the '!important' tag on the rules /// @mixin treo-icon-size($size, $important: false) { width: #{($size) + 'px'} if($important, !important, null); height: #{($size) + 'px'} if($important, !important, null); min-width: #{($size) + 'px'} if($important, !important, null); min-height: #{($size) + 'px'} if($important, !important, null); font-size: #{($size) + 'px'} if($important, !important, null); line-height: #{($size) + 'px'} if($important, !important, null); svg { width: #{($size) + 'px'} if($important, !important, null); height: #{($size) + 'px'} if($important, !important, null); } } ================================================ FILE: webapp/frontend/src/@treo/styles/utilities/_keyframes.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Rotation - animation: rotation 8s infinite linear; // ----------------------------------------------------------------------------------------------------- @keyframes rotation { from { transform: rotate(0deg); } to { transform: rotate(359deg); } } ================================================ FILE: webapp/frontend/src/@treo/styles/utilities/_theming.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ Mixins // ----------------------------------------------------------------------------------------------------- /// /// Go through the each defined theme and apply it to whatever content this mixin has /// /// @access public /// @param {Boolean} $encapsulated - Should the generated rules compatible with encapsulated components? /// @mixin treo-theme($encapsulated: false) { @each $class-name, $theme in $treo-themes { // Set the theme as global so it can be accessible from outside $theme: $theme !global; // If encapsulated... @if ($encapsulated) { // Do everything inside a host context :host-context(.#{$class-name}) { @content; } } @else { // Do everything openly .#{$class-name} { @content; } } } } ================================================ FILE: webapp/frontend/src/@treo/styles/vendors/_angular-material.scss ================================================ // Include core Angular Material styles from '~@angular/material/theming' @include mat-core(); ================================================ FILE: webapp/frontend/src/@treo/styles/vendors/_normalize.scss ================================================ /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ /* Document ========================================================================== */ /** * 1. Correct the line height in all browsers. * 2. Prevent adjustments of font size after orientation changes in iOS. */ html { line-height: 1.15; /* 1 */ -webkit-text-size-adjust: 100%; /* 2 */ } /* Sections ========================================================================== */ /** * Remove the margin in all browsers. */ body { margin: 0; } /** * Render the `main` element consistently in IE. */ main { display: block; } /** * Correct the font size and margin on `h1` elements within `section` and * `article` contexts in Chrome, Firefox, and Safari. */ h1 { //font-size: 2em; //margin: 0.67em 0; } /* Grouping content ========================================================================== */ /** * 1. Add the correct box sizing in Firefox. * 2. Show the overflow in Edge and IE. */ hr { box-sizing: content-box; /* 1 */ height: 0; /* 1 */ overflow: visible; /* 2 */ } /** * 1. Correct the inheritance and scaling of font size in all browsers. * 2. Correct the odd `em` font sizing in all browsers. */ pre { font-family: monospace, monospace; /* 1 */ font-size: 1em; /* 2 */ } /* Text-level semantics ========================================================================== */ /** * Remove the gray background on active links in IE 10. */ a { background-color: transparent; } /** * 1. Remove the bottom border in Chrome 57- * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. */ abbr[title] { border-bottom: none; /* 1 */ text-decoration: underline; /* 2 */ -webkit-text-decoration: underline dotted; text-decoration: underline dotted; /* 2 */ } /** * Add the correct font weight in Chrome, Edge, and Safari. */ b, strong { font-weight: bolder; } /** * 1. Correct the inheritance and scaling of font size in all browsers. * 2. Correct the odd `em` font sizing in all browsers. */ code, kbd, samp { font-family: monospace, monospace; /* 1 */ font-size: 1em; /* 2 */ } /** * Add the correct font size in all browsers. */ small { font-size: 80%; } /** * Prevent `sub` and `sup` elements from affecting the line height in * all browsers. */ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sub { bottom: -0.25em; } sup { top: -0.5em; } /* Embedded content ========================================================================== */ /** * Remove the border on images inside links in IE 10. */ img { border-style: none; } /* Forms ========================================================================== */ /** * 1. Change the font styles in all browsers. * 2. Remove the margin in Firefox and Safari. */ button, input, optgroup, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 1 */ line-height: 1.15; /* 1 */ margin: 0; /* 2 */ } /** * Show the overflow in IE. * 1. Show the overflow in Edge. */ button, input { /* 1 */ overflow: visible; } /** * Remove the inheritance of text transform in Edge, Firefox, and IE. * 1. Remove the inheritance of text transform in Firefox. */ button, select { /* 1 */ text-transform: none; } /** * Correct the inability to style clickable types in iOS and Safari. */ button, [type='button'], [type='reset'], [type='submit'] { -webkit-appearance: button; } /** * Remove the inner border and padding in Firefox. */ button::-moz-focus-inner, [type='button']::-moz-focus-inner, [type='reset']::-moz-focus-inner, [type='submit']::-moz-focus-inner { border-style: none; padding: 0; } /** * Restore the focus styles unset by the previous rule. */ button:-moz-focusring, [type='button']:-moz-focusring, [type='reset']:-moz-focusring, [type='submit']:-moz-focusring { outline: 1px dotted ButtonText; } /** * Correct the padding in Firefox. */ fieldset { padding: 0.35em 0.75em 0.625em; } /** * 1. Correct the text wrapping in Edge and IE. * 2. Correct the color inheritance from `fieldset` elements in IE. * 3. Remove the padding so developers are not caught out when they zero out * `fieldset` elements in all browsers. */ legend { box-sizing: border-box; /* 1 */ color: inherit; /* 2 */ display: table; /* 1 */ max-width: 100%; /* 1 */ padding: 0; /* 3 */ white-space: normal; /* 1 */ } /** * Add the correct vertical alignment in Chrome, Firefox, and Opera. */ progress { vertical-align: baseline; } /** * Remove the default vertical scrollbar in IE 10+. */ textarea { overflow: auto; } /** * 1. Add the correct box sizing in IE 10. * 2. Remove the padding in IE 10. */ [type='checkbox'], [type='radio'] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } /** * Correct the cursor style of increment and decrement buttons in Chrome. */ [type='number']::-webkit-inner-spin-button, [type='number']::-webkit-outer-spin-button { height: auto; } /** * 1. Correct the odd appearance in Chrome and Safari. * 2. Correct the outline style in Safari. */ [type='search'] { -webkit-appearance: textfield; /* 1 */ outline-offset: -2px; /* 2 */ } /** * Remove the inner padding in Chrome and Safari on macOS. */ [type='search']::-webkit-search-decoration { -webkit-appearance: none; } /** * 1. Correct the inability to style clickable types in iOS and Safari. * 2. Change font properties to `inherit` in Safari. */ ::-webkit-file-upload-button { -webkit-appearance: button; /* 1 */ font: inherit; /* 2 */ } /* Interactive ========================================================================== */ /* * Add the correct display in Edge, IE 10+, and Firefox. */ details { display: block; } /* * Add the correct display in all browsers. */ summary { display: list-item; } /* Misc ========================================================================== */ /** * Add the correct display in IE 10+. */ template { display: none; } /** * Add the correct display in IE 10. */ [hidden] { display: none; } ================================================ FILE: webapp/frontend/src/@treo/tailwind/export.css ================================================ /** * This file is being used by injecting custom TailwindCSS variants. * * These variants are different because these will not generate any * CSS rules, but they will generate SCSS variables from your Tailwind * config file. * * The generated output will be used by Treo. * Do NOT modify or use this file to generate your own variants. */ @variants export-boxShadow, export-colors, export-fontFamily, export-screens {} ================================================ FILE: webapp/frontend/src/@treo/tailwind/export.js ================================================ #!/usr/bin/env node const fs = require('fs'); const path = require('path'); const resolveConfig = require('tailwindcss/resolveConfig'); const buildMediaQuery = require('tailwindcss/lib/util/buildMediaQuery').default; if ( !process.argv[3] || !process.argv[5] ) { console.error('Usage: -c [Relative path to Tailwind config file] -o [Relative path to Output file]'); process.exit(1); } const tailwindConfig = require(path.join(process.cwd(), process.argv[3])); const output = process.argv[5]; let outputFileContents = ''; // Read screens and build media queries const screens = resolveConfig(tailwindConfig).theme.screens; let queries = {}; Object.keys(screens).forEach((key) => { queries[key] = buildMediaQuery(screens[key]) }); queries = JSON.stringify(queries); queries = queries.replace(/"/g, '\'').replace(/,/g, ', ').replace(/:/g, ': '); outputFileContents = `${outputFileContents}export const treoBreakpoints = ${queries};\n`; // Write the output file fs.writeFile(output, outputFileContents, (err) => { if ( err ) { return console.log(err); } }); ================================================ FILE: webapp/frontend/src/@treo/tailwind/exported/_variables.scss ================================================ /** * This file is being used by injecting custom TailwindCSS variants. * * These variants are different because these will not generate any * CSS rules, but they will generate SCSS variables from your Tailwind * config file. * * The generated output will be used by Treo. * Do NOT modify or use this file to generate your own variants. */ $treo-elevations: ( 'xs': '0 0 0 1px rgba(0, 0, 0, 0.05)', 'sm': '0 1px 2px 0 rgba(0, 0, 0, 0.05)', 'default': '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)', 'md': '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)', 'lg': '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)', 'xl': '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)', '2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)', 'inner': 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)', 'outline': '0 0 0 3px rgba(66, 153, 225, 0.5)', 'none': 'none', 'solid': '0 0 0 2px currentColor', ) !default; $treo-colors: ( 'white': ( 50: #FFFFFF, 100: #FFFFFF, 200: #FFFFFF, 300: #FFFFFF, 400: #FFFFFF, 500: #FFFFFF, 600: #FFFFFF, 700: #FFFFFF, 800: #FFFFFF, 900: #FFFFFF, contrast: ( 50: #252F3F, 100: #252F3F, 200: #252F3F, 300: #252F3F, 400: #252F3F, 500: #252F3F, 600: #252F3F, 700: #252F3F, 800: #252F3F, 900: #252F3F, ) ), 'black': ( 50: #000000, 100: #000000, 200: #000000, 300: #000000, 400: #000000, 500: #000000, 600: #000000, 700: #000000, 800: #000000, 900: #000000, contrast: ( 50: #FFFFFF, 100: #FFFFFF, 200: #FFFFFF, 300: #FFFFFF, 400: #FFFFFF, 500: #FFFFFF, 600: #FFFFFF, 700: #FFFFFF, 800: #FFFFFF, 900: #FFFFFF, ) ), 'gray': ( 50: #F9FAFB, 100: #F4F5F7, 200: #E5E7EB, 300: #D2D6DC, 400: #9FA6B2, 500: #6B7280, 600: #4B5563, 700: #374151, 800: #252F3F, 900: #161E2E, contrast: ( 50: #161E2E, 100: #161E2E, 200: #161E2E, 300: #161E2E, 400: #161E2E, 500: #161E2E, 600: #F9FAFB, 700: #F9FAFB, 800: #F9FAFB, 900: #F9FAFB, ) ), 'cool-gray': ( 50: #FBFDFE, 100: #F1F5F9, 200: #E2E8F0, 300: #CFD8E3, 400: #97A6BA, 500: #64748B, 600: #475569, 700: #364152, 800: #27303F, 900: #1A202E, contrast: ( 50: #1A202E, 100: #1A202E, 200: #1A202E, 300: #1A202E, 400: #1A202E, 500: #1A202E, 600: #FBFDFE, 700: #FBFDFE, 800: #FBFDFE, 900: #FBFDFE, ) ), 'red': ( 50: #FDF2F2, 100: #FDE8E8, 200: #FBD5D5, 300: #F8B4B4, 400: #F98080, 500: #F05252, 600: #E02424, 700: #C81E1E, 800: #9B1C1C, 900: #771D1D, contrast: ( 50: #771D1D, 100: #771D1D, 200: #771D1D, 300: #771D1D, 400: #771D1D, 500: #771D1D, 600: #FDF2F2, 700: #FDF2F2, 800: #FDF2F2, 900: #FDF2F2, ) ), 'orange': ( 50: #FFF8F1, 100: #FEECDC, 200: #FCD9BD, 300: #FDBA8C, 400: #FF8A4C, 500: #FF5A1F, 600: #D03801, 700: #B43403, 800: #8A2C0D, 900: #771D1D, contrast: ( 50: #771D1D, 100: #771D1D, 200: #771D1D, 300: #771D1D, 400: #771D1D, 500: #771D1D, 600: #FFF8F1, 700: #FFF8F1, 800: #FFF8F1, 900: #FFF8F1, ) ), 'yellow': ( 50: #FDFDEA, 100: #FDF6B2, 200: #FCE96A, 300: #FACA15, 400: #E3A008, 500: #C27803, 600: #9F580A, 700: #8E4B10, 800: #723B13, 900: #633112, contrast: ( 50: #633112, 100: #633112, 200: #633112, 300: #633112, 400: #633112, 500: #633112, 600: #FDFDEA, 700: #FDFDEA, 800: #FDFDEA, 900: #FDFDEA, ) ), 'green': ( 50: #F3FAF7, 100: #DEF7EC, 200: #BCF0DA, 300: #84E1BC, 400: #31C48D, 500: #0E9F6E, 600: #057A55, 700: #046C4E, 800: #03543F, 900: #014737, contrast: ( 50: #014737, 100: #014737, 200: #014737, 300: #014737, 400: #014737, 500: #F3FAF7, 600: #F3FAF7, 700: #F3FAF7, 800: #F3FAF7, 900: #F3FAF7, ) ), 'teal': ( 50: #EDFAFA, 100: #D5F5F6, 200: #AFECEF, 300: #7EDCE2, 400: #16BDCA, 500: #0694A2, 600: #047481, 700: #036672, 800: #05505C, 900: #014451, contrast: ( 50: #014451, 100: #014451, 200: #014451, 300: #014451, 400: #014451, 500: #EDFAFA, 600: #EDFAFA, 700: #EDFAFA, 800: #EDFAFA, 900: #EDFAFA, ) ), 'blue': ( 50: #EBF5FF, 100: #E1EFFE, 200: #C3DDFD, 300: #A4CAFE, 400: #76A9FA, 500: #3F83F8, 600: #1C64F2, 700: #1A56DB, 800: #1E429F, 900: #233876, contrast: ( 50: #233876, 100: #233876, 200: #233876, 300: #233876, 400: #233876, 500: #EBF5FF, 600: #EBF5FF, 700: #EBF5FF, 800: #EBF5FF, 900: #EBF5FF, ) ), 'indigo': ( 50: #F0F5FF, 100: #E5EDFF, 200: #CDDBFE, 300: #B4C6FC, 400: #8DA2FB, 500: #6875F5, 600: #5850EC, 700: #5145CD, 800: #42389D, 900: #362F78, contrast: ( 50: #362F78, 100: #362F78, 200: #362F78, 300: #362F78, 400: #362F78, 500: #F0F5FF, 600: #F0F5FF, 700: #F0F5FF, 800: #F0F5FF, 900: #F0F5FF, ) ), 'purple': ( 50: #F6F5FF, 100: #EDEBFE, 200: #DCD7FE, 300: #CABFFD, 400: #AC94FA, 500: #9061F9, 600: #7E3AF2, 700: #6C2BD9, 800: #5521B5, 900: #4A1D96, contrast: ( 50: #4A1D96, 100: #4A1D96, 200: #4A1D96, 300: #4A1D96, 400: #4A1D96, 500: #F6F5FF, 600: #F6F5FF, 700: #F6F5FF, 800: #F6F5FF, 900: #F6F5FF, ) ), 'pink': ( 50: #FDF2F8, 100: #FCE8F3, 200: #FAD1E8, 300: #F8B4D9, 400: #F17EB8, 500: #E74694, 600: #D61F69, 700: #BF125D, 800: #99154B, 900: #751A3D, contrast: ( 50: #751A3D, 100: #751A3D, 200: #751A3D, 300: #751A3D, 400: #751A3D, 500: #FDF2F8, 600: #FDF2F8, 700: #FDF2F8, 800: #FDF2F8, 900: #FDF2F8, ) ), ) !default; $treo-font-sans: Inter,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji" !default; $treo-font-serif: Georgia,Cambria,"Times New Roman",Times,serif !default; $treo-font-mono: "IBM Plex Mono",Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace !default; $treo-breakpoints: ( xs: '(min-width: 0) and (max-width: 599px)', sm: '(min-width: 600px) and (max-width: 959px)', md: '(min-width: 960px) and (max-width: 1279px)', lg: '(min-width: 1280px) and (max-width: 1439px)', xl: '(min-width: 1440px)', lt-md: '(max-width: 959px)', lt-lg: '(max-width: 1279px)', lt-xl: '(max-width: 1439px)', gt-xs: '(min-width: 600px)', gt-sm: '(min-width: 960px)', gt-md: '(min-width: 1280px)', ) !default ================================================ FILE: webapp/frontend/src/@treo/tailwind/exported/variables.ts ================================================ export const treoBreakpoints = {'xs': '(min-width: 0) and (max-width: 599px)', 'sm': '(min-width: 600px) and (max-width: 959px)', 'md': '(min-width: 960px) and (max-width: 1279px)', 'lg': '(min-width: 1280px) and (max-width: 1439px)', 'xl': '(min-width: 1440px)', 'lt-md': '(max-width: 200px)', 'lt-lg': '(max-width: 1279px)', 'lt-xl': '(max-width: 1439px)', 'gt-xs': '(min-width: 600px)', 'gt-sm': '(min-width: 960px)', 'gt-md': '(min-width: 1280px)'}; ================================================ FILE: webapp/frontend/src/@treo/tailwind/plugins/index.js ================================================ module.exports = [ // Exporter variants require('./variants/export-box-shadow'), require('./variants/export-colors'), require('./variants/export-font-family'), require('./variants/export-screens'), // Variants require('./variants/dark-light'), // Utilities require('./utilities/color-contrasts'), require('./utilities/color-combinations'), require('./utilities/icon-color'), require('./utilities/icon-size'), require('./utilities/mirror') ]; ================================================ FILE: webapp/frontend/src/@treo/tailwind/plugins/utilities/color-combinations.js ================================================ const plugin = require('tailwindcss/plugin'); const _ = require('lodash'); /** * Adds a component that combines both background and its contrasting color * for Tailwind colors. Also adds basic utilities for the combined colors * so we can do things like '.teal.text-secondary' or '.red .text-hint' etc. */ module.exports = plugin(({addUtilities, variants, theme, e}) => { const generateCombinedColorRules = (colorName, hueName, color) => { const contrastColor = theme(`colorContrasts.${colorName}${hueName ? `.${hueName}` : ``}`); const selector = `${colorName}${hueName && hueName !== 'default' ? `-${hueName}` : ``}`; return { [`.${e(selector)}`]: { backgroundColor: `${color} !important`, color : `${contrastColor} !important`, '&.mat-icon, .mat-icon': { color: `${contrastColor} !important` }, '&.text-secondary, .text-secondary': { color: `rgba(${contrastColor}, 0.7) !important` }, '&.text-hint, .text-hint, &.text-disabled, .text-disabled': { color: `rgba(${contrastColor}, 0.38) !important` }, '&.divider, .divider': { color: `rgba(${contrastColor}, 0.12) !important` } }, [`.text-${e(selector)}`]: { '&.text-secondary, .text-secondary': { color: `rgba(${color}, 0.7) !important` }, '&.text-hint, .text-hint, &.text-disabled, .text-disabled': { color: `rgba(${color}, 0.38) !important` }, '&.divider, .divider': { color: `rgba(${color}, 0.12) !important` } } } }; const utilities = _.map(theme('colors'), (value, colorName) => { if ( _.isObject(value) ) { return _.map(value, (color, hueName) => { return generateCombinedColorRules(colorName, hueName, color); }); } else { if ( value === 'transparent' || value === 'currentColor' ) { return; } return generateCombinedColorRules(colorName, '', value); } }); addUtilities(utilities, variants('colorCombinations')); }, { variants: { colorCombinations: [] } } ); ================================================ FILE: webapp/frontend/src/@treo/tailwind/plugins/utilities/color-contrasts.js ================================================ const plugin = require('tailwindcss/plugin'); const _ = require('lodash'); /** * Adds utility classes for contrasting colors such as * 'text-red-200-contrast' and 'bg-blue-contrast' */ module.exports = plugin(({addUtilities, variants, theme, e}) => { const utilities = _.map(theme('colorContrasts'), (value, colorName) => { if ( _.isObject(value) ) { return _.map(value, (color, hueName) => { hueName = hueName === 'default' ? '' : `-${hueName}`; return { [`.${e(`text-${colorName}${hueName}-contrast`)}`]: { color: color }, [`.${e(`bg-${colorName}${hueName}-contrast`)}`] : { backgroundColor: color } } }); } else { return { [`.${e(`text-${colorName}-contrast`)}`]: { color: value }, [`.${e(`bg-${colorName}-contrast`)}`] : { backgroundColor: value } } } }); addUtilities(utilities, variants('colorContrasts')); }, { theme : { colorContrasts: theme => ({ black : theme('colors.white'), white : theme('colors.gray.800'), gray : { 50 : theme('colors.gray.900'), 100 : theme('colors.gray.900'), 200 : theme('colors.gray.900'), 300 : theme('colors.gray.900'), 400 : theme('colors.gray.900'), 500 : theme('colors.gray.900'), 600 : theme('colors.gray.50'), 700 : theme('colors.gray.50'), 800 : theme('colors.gray.50'), 900 : theme('colors.gray.50'), default: theme('colors.gray.900') }, 'cool-gray': { 50 : theme('colors.cool-gray.900'), 100 : theme('colors.cool-gray.900'), 200 : theme('colors.cool-gray.900'), 300 : theme('colors.cool-gray.900'), 400 : theme('colors.cool-gray.900'), 500 : theme('colors.cool-gray.900'), 600 : theme('colors.cool-gray.50'), 700 : theme('colors.cool-gray.50'), 800 : theme('colors.cool-gray.50'), 900 : theme('colors.cool-gray.50'), default: theme('colors.cool-gray.900') }, red : { 50 : theme('colors.red.900'), 100 : theme('colors.red.900'), 200 : theme('colors.red.900'), 300 : theme('colors.red.900'), 400 : theme('colors.red.900'), 500 : theme('colors.red.900'), 600 : theme('colors.red.50'), 700 : theme('colors.red.50'), 800 : theme('colors.red.50'), 900 : theme('colors.red.50'), default: theme('colors.red.900') }, orange : { 50 : theme('colors.orange.900'), 100 : theme('colors.orange.900'), 200 : theme('colors.orange.900'), 300 : theme('colors.orange.900'), 400 : theme('colors.orange.900'), 500 : theme('colors.orange.900'), 600 : theme('colors.orange.50'), 700 : theme('colors.orange.50'), 800 : theme('colors.orange.50'), 900 : theme('colors.orange.50'), default: theme('colors.orange.900') }, yellow : { 50 : theme('colors.yellow.900'), 100 : theme('colors.yellow.900'), 200 : theme('colors.yellow.900'), 300 : theme('colors.yellow.900'), 400 : theme('colors.yellow.900'), 500 : theme('colors.yellow.900'), 600 : theme('colors.yellow.50'), 700 : theme('colors.yellow.50'), 800 : theme('colors.yellow.50'), 900 : theme('colors.yellow.50'), default: theme('colors.yellow.900') }, green : { 50 : theme('colors.green.900'), 100 : theme('colors.green.900'), 200 : theme('colors.green.900'), 300 : theme('colors.green.900'), 400 : theme('colors.green.900'), 500 : theme('colors.green.50'), 600 : theme('colors.green.50'), 700 : theme('colors.green.50'), 800 : theme('colors.green.50'), 900 : theme('colors.green.50'), default: theme('colors.green.50') }, teal : { 50 : theme('colors.teal.900'), 100 : theme('colors.teal.900'), 200 : theme('colors.teal.900'), 300 : theme('colors.teal.900'), 400 : theme('colors.teal.900'), 500 : theme('colors.teal.50'), 600 : theme('colors.teal.50'), 700 : theme('colors.teal.50'), 800 : theme('colors.teal.50'), 900 : theme('colors.teal.50'), default: theme('colors.teal.50') }, blue : { 50 : theme('colors.blue.900'), 100 : theme('colors.blue.900'), 200 : theme('colors.blue.900'), 300 : theme('colors.blue.900'), 400 : theme('colors.blue.900'), 500 : theme('colors.blue.50'), 600 : theme('colors.blue.50'), 700 : theme('colors.blue.50'), 800 : theme('colors.blue.50'), 900 : theme('colors.blue.50'), default: theme('colors.blue.50') }, indigo : { 50 : theme('colors.indigo.900'), 100 : theme('colors.indigo.900'), 200 : theme('colors.indigo.900'), 300 : theme('colors.indigo.900'), 400 : theme('colors.indigo.900'), 500 : theme('colors.indigo.50'), 600 : theme('colors.indigo.50'), 700 : theme('colors.indigo.50'), 800 : theme('colors.indigo.50'), 900 : theme('colors.indigo.50'), default: theme('colors.indigo.50') }, purple : { 50 : theme('colors.purple.900'), 100 : theme('colors.purple.900'), 200 : theme('colors.purple.900'), 300 : theme('colors.purple.900'), 400 : theme('colors.purple.900'), 500 : theme('colors.purple.50'), 600 : theme('colors.purple.50'), 700 : theme('colors.purple.50'), 800 : theme('colors.purple.50'), 900 : theme('colors.purple.50'), default: theme('colors.purple.50') }, pink : { 50 : theme('colors.pink.900'), 100 : theme('colors.pink.900'), 200 : theme('colors.pink.900'), 300 : theme('colors.pink.900'), 400 : theme('colors.pink.900'), 500 : theme('colors.pink.50'), 600 : theme('colors.pink.50'), 700 : theme('colors.pink.50'), 800 : theme('colors.pink.50'), 900 : theme('colors.pink.50'), default: theme('colors.pink.50') } }) }, variants: { colorContrasts: [] } } ); ================================================ FILE: webapp/frontend/src/@treo/tailwind/plugins/utilities/icon-color.js ================================================ const plugin = require('tailwindcss/plugin'); const flattenColorPalette = require('tailwindcss/lib/util/flattenColorPalette').default; const _ = require('lodash'); module.exports = plugin(({addUtilities, e, theme, variants}) => { const utilities = _.fromPairs( _.map(flattenColorPalette(theme('iconColor')), (value, modifier) => { return [ `.${e(`icon-${modifier}`)}`, { [`.mat-icon`]: { color: value } } ] }) ); addUtilities(utilities, variants('iconColor')) }, { theme : { iconColor: theme => theme('colors') }, variants: { iconColor: [] } }); ================================================ FILE: webapp/frontend/src/@treo/tailwind/plugins/utilities/icon-size.js ================================================ const plugin = require('tailwindcss/plugin'); const _ = require('lodash'); /** * Adds utility classes for .mat-icon size */ module.exports = plugin(({addUtilities, variants, theme, e}) => { const utilities = _.map(theme('iconSize'), (value, key) => { return { [`.${e(`icon-size-${key}`)}`]: { width : value, height : value, minWidth : value, minHeight : value, fontSize : value, lineHeight: value, [`svg`] : { width : value, height : value } } } }); addUtilities(utilities, variants('iconSize')); }, { theme : { iconSize: { 12: '12px', 14: '14px', 16: '16px', 18: '18px', 20: '20px', 24: '24px', 32: '32px', 40: '40px', 48: '48px', 56: '56px', 64: '64px', 72: '72px', 80: '80px', 88: '88px', 96: '96px' } }, variants: { iconSize: [] } } ); ================================================ FILE: webapp/frontend/src/@treo/tailwind/plugins/utilities/mirror.js ================================================ const plugin = require('tailwindcss/plugin'); /** * Adds utility classes for mirroring */ module.exports = plugin(({addUtilities, variants}) => { const utilities = { [`.mirror`] : { transform: `scale(-1, 1)` }, [`.mirror-vertical`]: { transform: `scale(1, -1)` } }; addUtilities(utilities, variants('mirror')); }, { variants: { mirror: [] } } ); ================================================ FILE: webapp/frontend/src/@treo/tailwind/plugins/variants/dark-light.js ================================================ const plugin = require('tailwindcss/plugin'); /** * Adds 'dark-light' variants */ module.exports = plugin(({addVariant, e}) => { const variant = ({modifySelectors, separator}) => { modifySelectors(({className}) => { return `[class*="theme-dark"].${e(`dark${separator}${className}`)}, [class*="theme-dark"] .${e(`dark${separator}${className}`)}, [class*="theme-light"].${e(`light${separator}${className}`)}, [class*="theme-light"] .${e(`light${separator}${className}`)}` }) }; addVariant('dark-light', variant); }); ================================================ FILE: webapp/frontend/src/@treo/tailwind/plugins/variants/export-box-shadow.js ================================================ const plugin = require('tailwindcss/plugin'); const postcss = require('postcss'); const _ = require('lodash'); /** * Exports 'boxShadow' configuration as an SCSS map */ module.exports = plugin(({addVariant, theme}) => { const variant = ({container}) => { let map = ''; _.forEach(theme('boxShadow'), (value, key) => { map = `${map} '${key}': '${theme('boxShadow.' + key)}',\n`; }); container.append( postcss.decl({ prop : '$treo-elevations', value: `(\n ${map} ) !default` }) ); }; addVariant('export-boxShadow', variant); }); ================================================ FILE: webapp/frontend/src/@treo/tailwind/plugins/variants/export-colors.js ================================================ const plugin = require('tailwindcss/plugin'); const postcss = require('postcss'); const _ = require('lodash'); /** * Exports 'colors' configuration as an SCSS map */ module.exports = plugin(({addVariant, theme}) => { const variant = ({container}) => { let map = ''; _.forEach(theme('colors'), (value, key) => { let hues = ''; let contrasts = ''; if ( _.isObject(value) ) { // Hue _.forEach(value, (hueValue, hueName) => { // Skip the 'default' hue if ( hueName === 'default' ) { return; } // Append the new entry hues = `${hues} ${hueName}: ${hueValue},\n`; }); // Contrasts _.forEach(theme('colorContrasts.' + key), (hueValue, hueName) => { // Skip the 'default' hue if ( hueName === 'default' ) { return; } // Append the new entry contrasts = `${contrasts} ${hueName}: ${hueValue},\n`; }); } else { // Skip the 'transparent' and 'current' if ( value === 'transparent' || value === 'currentColor' ) { return; } // Hue [50, 100, 200, 300, 400, 500, 600, 700, 800, 900].forEach((hue) => { hues = `${hues} ${hue}: ${value},\n`; }); // Contrasts [50, 100, 200, 300, 400, 500, 600, 700, 800, 900].forEach((hue) => { contrasts = `${contrasts} ${hue}: ${theme('colorContrasts.' + key)},\n`; }); } // Append the new map map = `${map} '${key}': (\n ${hues} contrast: (\n ${contrasts} )\n),\n`; }); container.append( postcss.decl({ prop : '$treo-colors', value: `(\n ${map} ) !default` }) ); }; addVariant('export-colors', variant); } ); ================================================ FILE: webapp/frontend/src/@treo/tailwind/plugins/variants/export-font-family.js ================================================ const plugin = require('tailwindcss/plugin'); const postcss = require('postcss'); const _ = require('lodash'); /** * Exports 'fontFamily' configuration as an SCSS map */ module.exports = plugin(({addVariant, theme}) => { const variant = ({container}) => { _.forEach(theme('fontFamily'), (value, key) => { container.append( postcss.decl({ prop : `$treo-font-${key}`, value: `${value} !default` }) ); }); }; addVariant('export-fontFamily', variant); }); ================================================ FILE: webapp/frontend/src/@treo/tailwind/plugins/variants/export-screens.js ================================================ const plugin = require('tailwindcss/plugin'); const buildMediaQuery = require('tailwindcss/lib/util/buildMediaQuery').default; const postcss = require('postcss'); const _ = require('lodash'); /** * Exports 'screens' configuration as an SCSS map */ module.exports = plugin(({addVariant, theme}) => { const variant = ({container}) => { let map = ''; _.forEach(theme('screens'), (value, key) => { map = `${map} ${key}: '${buildMediaQuery(value)}',\n`; }); container.append( postcss.decl({ prop : '$treo-breakpoints', value: `(\n ${map} ) !default` }) ); }; addVariant('export-screens', variant); }); ================================================ FILE: webapp/frontend/src/@treo/treo.module.ts ================================================ import { NgModule, Optional, SkipSelf } from '@angular/core'; import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field'; import { TreoMediaWatcherModule } from '@treo/services/media-watcher/media-watcher.module'; import { TreoSplashScreenModule } from '@treo/services/splash-screen/splash-screen.module'; @NgModule({ imports : [ TreoMediaWatcherModule, TreoSplashScreenModule ], providers: [ { // Use the 'fill' appearance on form fields by default provide : MAT_FORM_FIELD_DEFAULT_OPTIONS, useValue: { appearance: 'fill' } } ] }) export class TreoModule { /** * Constructor * * @param parentModule */ constructor( @Optional() @SkipSelf() parentModule?: TreoModule ) { if ( parentModule ) { throw new Error('TreoModule has already been loaded. Import this module in the AppModule only!'); } } } ================================================ FILE: webapp/frontend/src/@treo/validators/index.ts ================================================ export * from './public-api'; ================================================ FILE: webapp/frontend/src/@treo/validators/public-api.ts ================================================ export * from './validators'; ================================================ FILE: webapp/frontend/src/@treo/validators/validators.ts ================================================ import { FormGroup, ValidatorFn } from '@angular/forms'; export class TreoValidators { /** * 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: FormGroup): 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; } // 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; } // Set the validation error on the matching control matchingControl.setErrors({mustMatch: true}); }; } } ================================================ FILE: webapp/frontend/src/app/app.component.html ================================================ ================================================ FILE: webapp/frontend/src/app/app.component.scss ================================================ :host { display: flex; flex: 1 1 auto; width: 100%; height: 100%; } ================================================ FILE: webapp/frontend/src/app/app.component.ts ================================================ import { Component } from '@angular/core'; @Component({ selector : 'app-root', templateUrl: './app.component.html', styleUrls : ['./app.component.scss'] }) export class AppComponent { /** * Constructor */ constructor() { } } ================================================ FILE: webapp/frontend/src/app/app.module.ts ================================================ import {enableProdMode, 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 {APP_BASE_HREF} from '@angular/common'; import {MarkdownModule} from 'ngx-markdown'; import {TreoModule} from '@treo'; import {ScrutinyConfigModule} from 'app/core/config/scrutiny-config.module'; import {TreoMockApiModule} from '@treo/lib/mock-api'; import {CoreModule} from 'app/core/core.module'; import {appConfig} from 'app/core/config/app.config'; import {mockDataServices} from 'app/data/mock'; import {LayoutModule} from 'app/layout/layout.module'; import {AppComponent} from 'app/app.component'; import {appRoutes, getAppBaseHref} from 'app/app.routing'; const routerConfig: ExtraOptions = { scrollPositionRestoration: 'enabled', preloadingStrategy: PreloadAllModules }; let dev = [ TreoMockApiModule.forRoot(mockDataServices), ]; // if production clear dev imports and set to prod mode // @ts-ignore if (process.env.NODE_ENV === 'production') { dev = []; enableProdMode(); } @NgModule({ declarations: [ AppComponent, ], imports : [ BrowserModule, BrowserAnimationsModule, RouterModule.forRoot(appRoutes, routerConfig), // Treo & Treo Mock API TreoModule, ScrutinyConfigModule.forRoot(appConfig), ...dev, // Core CoreModule, // Layout LayoutModule, // 3rd party modules MarkdownModule.forRoot({}) ], bootstrap : [ AppComponent ], providers: [ { provide: APP_BASE_HREF, useValue: getAppBaseHref() } ], }) export class AppModule { } ================================================ FILE: webapp/frontend/src/app/app.routing.ts ================================================ import { Route } from '@angular/router'; import { LayoutComponent } from 'app/layout/layout.component'; import { EmptyLayoutComponent } from 'app/layout/layouts/empty/empty.component'; // @formatter:off export function getAppBaseHref(): string { return getBasePath() + '/web'; } // @formatter:off // tslint:disable:max-line-length export function getBasePath(): string { return window.location.pathname.split('/web').slice(0, 1)[0]; } // @formatter:off // tslint:disable:max-line-length export const appRoutes: Route[] = [ // Redirect empty path to '/example' {path: '', pathMatch : 'full', redirectTo: 'dashboard'}, // Landing routes { path: '', component: EmptyLayoutComponent, children : [ {path: 'home', loadChildren: () => import('app/modules/landing/home/home.module').then(m => m.LandingHomeModule)}, ] }, // Admin routes { path : '', component : LayoutComponent, children : [ // Example {path: 'dashboard', loadChildren: () => import('app/modules/dashboard/dashboard.module').then(m => m.DashboardModule)}, {path: 'device/:wwn', loadChildren: () => import('app/modules/detail/detail.module').then(m => m.DetailModule)} // 404 & Catch all // {path: '404-not-found', pathMatch: 'full', loadChildren: () => import('app/modules/admin/pages/errors/error-404/error-404.module').then(m => m.Error404Module)}, // {path: '**', redirectTo: '404-not-found'} ] } ]; ================================================ FILE: webapp/frontend/src/app/core/config/app.config.ts ================================================ import {Layout} from 'app/layout/layout.types'; // Theme type export type Theme = 'light' | 'dark' | 'system'; // Device title to display on the dashboard export type DashboardDisplay = 'name' | 'serial_id' | 'uuid' | 'label' export type DashboardSort = 'status' | 'title' | 'age' export type TemperatureUnit = 'celsius' | 'fahrenheit' export type LineStroke = 'smooth' | 'straight' | 'stepline' export type DevicePoweredOnUnit = 'humanize' | 'device_hours' export enum MetricsNotifyLevel { Warn = 1, Fail = 2 } export enum MetricsStatusFilterAttributes { All = 0, Critical = 1 } export enum MetricsStatusThreshold { Smart = 1, Scrutiny = 2, // shortcut Both = 3 } /** * AppConfig interface. Update this interface to strictly type your config * object. */ export interface AppConfig { theme?: Theme; layout?: Layout; // Dashboard options dashboard_display?: DashboardDisplay; dashboard_sort?: DashboardSort; temperature_unit?: TemperatureUnit; file_size_si_units?: boolean; powered_on_hours_unit?: DevicePoweredOnUnit; line_stroke?: LineStroke; // Settings from Scrutiny API collector?: { discard_sct_temp_history?: boolean } metrics?: { notify_level?: MetricsNotifyLevel status_filter_attributes?: MetricsStatusFilterAttributes status_threshold?: MetricsStatusThreshold repeat_notifications?: boolean } } /** * Default configuration for the entire application. This object is used by * "ConfigService" 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 * "ConfigService". */ export const appConfig: AppConfig = { theme: 'light', layout: 'material', dashboard_display: 'name', dashboard_sort: 'status', temperature_unit: 'celsius', file_size_si_units: false, powered_on_hours_unit: 'humanize', line_stroke: 'smooth', collector: { discard_sct_temp_history : false, }, metrics: { notify_level: MetricsNotifyLevel.Fail, status_filter_attributes: MetricsStatusFilterAttributes.All, status_threshold: MetricsStatusThreshold.Both, repeat_notifications: true } }; ================================================ FILE: webapp/frontend/src/app/core/config/scrutiny-config.module.ts ================================================ import {ModuleWithProviders, NgModule} from '@angular/core'; import {ScrutinyConfigService} from 'app/core/config/scrutiny-config.service'; import {TREO_APP_CONFIG} from '@treo/services/config/config.constants'; @NgModule() export class ScrutinyConfigModule { /** * Constructor * * @param {ScrutinyConfigService} _scrutinyConfigService */ constructor( private _scrutinyConfigService: ScrutinyConfigService ) { } /** * forRoot method for setting user configuration * * @param config */ static forRoot(config: any): ModuleWithProviders { return { ngModule: ScrutinyConfigModule, providers: [ { provide: TREO_APP_CONFIG, useValue: config } ] }; } } ================================================ FILE: webapp/frontend/src/app/core/config/scrutiny-config.service.ts ================================================ import {Inject, Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; import {TREO_APP_CONFIG} from '@treo/services/config/config.constants'; import {BehaviorSubject, Observable} from 'rxjs'; import {getBasePath} from '../../app.routing'; import {map, tap} from 'rxjs/operators'; import {AppConfig} from './app.config'; import {merge} from 'lodash'; @Injectable({ providedIn: 'root' }) export class ScrutinyConfigService { // Private private _config: BehaviorSubject; private _defaultConfig: AppConfig; constructor( private _httpClient: HttpClient, @Inject(TREO_APP_CONFIG) defaultConfig: AppConfig ) { // Set the private defaults this._defaultConfig = defaultConfig this._config = new BehaviorSubject(null); } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Setter & getter for config */ set config(value: AppConfig) { // get the current config, merge the new values, and then submit. (setTheme only sets a single key, not the whole obj) const mergedSettings = merge({}, this._config.getValue(), value); console.log('saving settings...', mergedSettings) this._httpClient.post(getBasePath() + '/api/settings', mergedSettings).pipe( map((response: any) => { console.log('settings resp') return response.settings }), tap((settings: AppConfig) => { this._config.next(settings); return settings }) ).subscribe(resp => { console.log('updated settings', resp) }) } get config$(): Observable { if (this._config.getValue()) { console.log('using cached settings:', this._config.getValue()) return this._config.asObservable() } else { console.log('retrieving settings') return this._httpClient.get(getBasePath() + '/api/settings').pipe( map((response: any) => { return response.settings }), tap((settings: AppConfig) => { this._config.next(settings); return this._config.asObservable() }) ); } } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Resets the config to the default */ reset(): void { // Set the config this.config = this._defaultConfig } } ================================================ FILE: webapp/frontend/src/app/core/core.module.ts ================================================ import { NgModule, Optional, SkipSelf } from '@angular/core'; import { HttpClientModule } from '@angular/common/http'; import { DomSanitizer } from '@angular/platform-browser'; import { MatIconRegistry } from '@angular/material/icon'; @NgModule({ imports : [ HttpClientModule ], providers: [] }) export class CoreModule { /** * Constructor * * @param {DomSanitizer} _domSanitizer * @param {MatIconRegistry} _matIconRegistry * @param parentModule */ 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('dripicons', this._domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/dripicons.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')); } } ================================================ FILE: webapp/frontend/src/app/core/models/device-details-response-wrapper.ts ================================================ import {DeviceModel} from 'app/core/models/device-model'; import {SmartModel} from 'app/core/models/measurements/smart-model'; import {AttributeMetadataModel} from 'app/core/models/thresholds/attribute-metadata-model'; // maps to webapp/backend/pkg/models/device_summary.go export interface DeviceDetailsResponseWrapper { success: boolean; errors?: any[]; data: { device: DeviceModel; smart_results: SmartModel[]; }, metadata: { [key: string]: AttributeMetadataModel } | { [key: number]: AttributeMetadataModel }; } ================================================ FILE: webapp/frontend/src/app/core/models/device-model.ts ================================================ // maps to webapp/backend/pkg/models/device.go export interface DeviceModel { archived?: boolean; wwn: string; device_name?: string; device_uuid?: string; device_serial_id?: string; device_label?: string; manufacturer: string; model_name: string; interface_type: string; interface_speed: string; serial_number: string; firmware: string; rotational_speed: number; capacity: number; form_factor: string; smart_support: boolean; device_protocol: string; device_type: string; label: string; host_id: string; device_status: number; } ================================================ FILE: webapp/frontend/src/app/core/models/device-summary-model.ts ================================================ import {DeviceModel} from 'app/core/models/device-model'; import {SmartTemperatureModel} from 'app/core/models/measurements/smart-temperature-model'; // maps to webapp/backend/pkg/models/device_summary.go export interface DeviceSummaryModel { device: DeviceModel; smart?: SmartSummary; temp_history?: SmartTemperatureModel[]; } export interface SmartSummary { collector_date?: string, temp?: number power_on_hours?: number } ================================================ FILE: webapp/frontend/src/app/core/models/device-summary-response-wrapper.ts ================================================ import {DeviceSummaryModel} from 'app/core/models/device-summary-model'; // maps to webapp/backend/pkg/models/device_summary.go export interface DeviceSummaryResponseWrapper { success: boolean; errors: any[]; data: { summary: { [key: string]: DeviceSummaryModel } } } ================================================ FILE: webapp/frontend/src/app/core/models/device-summary-temp-response-wrapper.ts ================================================ import {SmartTemperatureModel} from './measurements/smart-temperature-model'; export interface DeviceSummaryTempResponseWrapper { success: boolean; errors: any[]; data: { temp_history: { [key: string]: SmartTemperatureModel[]; } } } ================================================ FILE: webapp/frontend/src/app/core/models/measurements/smart-attribute-model.ts ================================================ // maps to webapp/backend/pkg/models/measurements/smart_ata_attribute.go // maps to webapp/backend/pkg/models/measurements/smart_nvme_attribute.go // maps to webapp/backend/pkg/models/measurements/smart_scsi_attribute.go export interface SmartAttributeModel { attribute_id: number | string value: number thresh: number worst?: number raw_value?: number raw_string?: string when_failed?: string transformed_value: number status: number status_reason?: string failure_rate?: number chartData?: any[] } ================================================ FILE: webapp/frontend/src/app/core/models/measurements/smart-model.ts ================================================ // maps to webapp/backend/pkg/models/measurements/smart.go import {SmartAttributeModel} from './smart-attribute-model'; export interface SmartModel { date: string; device_wwn: string; device_protocol: string; temp: number; power_on_hours: number; power_cycle_count: number attrs: { [key: string]: SmartAttributeModel } } ================================================ FILE: webapp/frontend/src/app/core/models/measurements/smart-temperature-model.ts ================================================ // maps to webapp/backend/pkg/models/measurements/smart_temperature.go export interface SmartTemperatureModel { date: string; temp: number; } ================================================ FILE: webapp/frontend/src/app/core/models/thresholds/attribute-metadata-model.ts ================================================ // map to webapp/backend/pkg/thresholds/ata_attribute_metadata.go // map to webapp/backend/pkg/thresholds/nvme_attribute_metadata.go // map to webapp/backend/pkg/thresholds/scsi_attribute_metadata.go export interface AttributeMetadataModel { display_name: string ideal: string critical: boolean description: string transform_value_unit?: string observed_thresholds?: any[] display_type: string } ================================================ FILE: webapp/frontend/src/app/data/mock/device/details/index.ts ================================================ import { Injectable } from '@angular/core'; import * as _ from 'lodash'; import { TreoMockApi } from '@treo/lib/mock-api/mock-api.interfaces'; import { TreoMockApiService } from '@treo/lib/mock-api/mock-api.service'; import { sda } from 'app/data/mock/device/details/sda'; import { sdb } from 'app/data/mock/device/details/sdb'; import { sdc } from 'app/data/mock/device/details/sdc'; import { sdd } from 'app/data/mock/device/details/sdd'; import { sde } from 'app/data/mock/device/details/sde'; import { sdf } from 'app/data/mock/device/details/sdf'; @Injectable({ providedIn: 'root' }) export class DetailsMockApi implements TreoMockApi { // Private private _details: any; /** * Constructor * * @param _treoMockApiService */ constructor( private _treoMockApiService: TreoMockApiService ) { // Register the API endpoints this.register(); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Register */ register(): void { this._treoMockApiService .onGet('/api/device/0x5002538e40a22954/details') .reply(() => { return [ 200, _.cloneDeep(sda) ]; }); this._treoMockApiService .onGet('/api/device/0x5000cca264eb01d7/details') .reply(() => { return [ 200, _.cloneDeep(sdb) ]; }); this._treoMockApiService .onGet('/api/device/0x5000cca264ec3183/details') .reply(() => { return [ 200, _.cloneDeep(sdc) ]; }); this._treoMockApiService .onGet('/api/device/0x5000cca252c859cc/details') .reply(() => { return [ 200, _.cloneDeep(sdd) ]; }); this._treoMockApiService .onGet('/api/device/0x5000cca264ebc248/details') .reply(() => { return [ 200, _.cloneDeep(sdf) ]; }); } } ================================================ FILE: webapp/frontend/src/app/data/mock/device/details/sda.ts ================================================ export const sda = { 'data': { 'device': { 'CreatedAt': '2021-06-24T21:17:31.301226-07:00', 'UpdatedAt': '2021-10-24T16:37:56.981833-07:00', 'DeletedAt': null, 'wwn': '0x5002538e40a22954', 'device_name': 'sda', 'manufacturer': 'ATA', 'model_name': 'Samsung_SSD_860_EVO_500GB', 'interface_type': 'SCSI', 'interface_speed': '', 'serial_number': 'S3YZNB0KBXXXXXX', 'firmware': '002C', 'rotational_speed': 0, 'capacity': 500107862016, 'form_factor': '', 'smart_support': false, 'device_protocol': 'NVMe', 'device_type': '', 'label': '', 'host_id': '', 'device_status': 0, 'archived': false }, 'smart_results': [{ 'date': '2021-10-24T23:20:44Z', 'device_wwn': '0x5002538e40a22954', 'device_protocol': 'NVMe', 'temp': 36, 'power_on_hours': 2401, 'power_cycle_count': 266, 'attrs': { 'available_spare': { 'attribute_id': 'available_spare', 'value': 100, 'thresh': 10, 'transformed_value': 0, 'status': 0 }, 'controller_busy_time': { 'attribute_id': 'controller_busy_time', 'value': 3060, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'critical_comp_time': { 'attribute_id': 'critical_comp_time', 'value': 0, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'critical_warning': { 'attribute_id': 'critical_warning', 'value': 0, 'thresh': 0, 'transformed_value': 0, 'status': 0 }, 'data_units_read': { 'attribute_id': 'data_units_read', 'value': 9511859, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'data_units_written': { 'attribute_id': 'data_units_written', 'value': 7773431, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'host_reads': { 'attribute_id': 'host_reads', 'value': 111303174, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'host_writes': { 'attribute_id': 'host_writes', 'value': 83170961, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'media_errors': { 'attribute_id': 'media_errors', 'value': 0, 'thresh': 0, 'transformed_value': 0, 'status': 0 }, 'num_err_log_entries': { 'attribute_id': 'num_err_log_entries', 'value': 0, 'thresh': 0, 'transformed_value': 0, 'status': 0 }, 'percentage_used': { 'attribute_id': 'percentage_used', 'value': 0, 'thresh': 100, 'transformed_value': 0, 'status': 0 }, 'power_cycles': { 'attribute_id': 'power_cycles', 'value': 266, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'power_on_hours': { 'attribute_id': 'power_on_hours', 'value': 2401, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'temperature': { 'attribute_id': 'temperature', 'value': 36, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'unsafe_shutdowns': { 'attribute_id': 'unsafe_shutdowns', 'value': 43, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'warning_temp_time': { 'attribute_id': 'warning_temp_time', 'value': 0, 'thresh': -1, 'transformed_value': 0, 'status': 0 } }, 'Status': 0 }] }, 'metadata': { 'available_spare': { 'display_name': 'Available Spare', 'ideal': 'high', 'critical': true, 'description': 'Contains a normalized percentage (0 to 100%) of the remaining spare capacity available.', 'display_type': '' }, 'controller_busy_time': { 'display_name': 'Controller Busy Time', 'ideal': '', 'critical': false, 'description': 'Contains the amount of time the controller is busy with I/O commands. The controller is busy when there is a command outstanding to an I/O Queue (specifically, a command was issued via an I/O Submission Queue Tail doorbell write and the corresponding completion queue entry has not been posted yet to the associated I/O Completion Queue). This value is reported in minutes.', 'display_type': '' }, 'critical_comp_time': { 'display_name': 'Critical CompTime', 'ideal': '', 'critical': false, 'description': 'Contains the amount of time in minutes that the controller is operational and the Composite Temperature is greater the Critical Composite Temperature Threshold (CCTEMP) field in the Identify Controller data structure.', 'display_type': '' }, 'critical_warning': { 'display_name': 'Critical Warning', 'ideal': 'low', 'critical': true, 'description': 'This field indicates critical warnings for the state of the controller. Each bit corresponds to a critical warning type; multiple bits may be set. If a bit is cleared to ‘0’, then that critical warning does not apply. Critical warnings may result in an asynchronous event notification to the host. Bits in this field represent the current associated state and are not persistent.', 'display_type': '' }, 'data_units_read': { 'display_name': 'Data Units Read', 'ideal': '', 'critical': false, 'description': 'Contains the number of 512 byte data units the host has read from the controller; this value does not include metadata. This value is reported in thousands (i.e., a value of 1 corresponds to 1000 units of 512 bytes read) and is rounded up. When the LBA size is a value other than 512 bytes, the controller shall convert the amount of data read to 512 byte units.', 'display_type': '' }, 'data_units_written': { 'display_name': 'Data Units Written', 'ideal': '', 'critical': false, 'description': 'Contains the number of 512 byte data units the host has written to the controller; this value does not include metadata. This value is reported in thousands (i.e., a value of 1 corresponds to 1000 units of 512 bytes written) and is rounded up. When the LBA size is a value other than 512 bytes, the controller shall convert the amount of data written to 512 byte units.', 'display_type': '' }, 'host_reads': { 'display_name': 'Host Reads', 'ideal': '', 'critical': false, 'description': 'Contains the number of read commands completed by the controller', 'display_type': '' }, 'host_writes': { 'display_name': 'Host Writes', 'ideal': '', 'critical': false, 'description': 'Contains the number of write commands completed by the controller', 'display_type': '' }, 'media_errors': { 'display_name': 'Media Errors', 'ideal': 'low', 'critical': true, 'description': 'Contains the number of occurrences where the controller detected an unrecovered data integrity error. Errors such as uncorrectable ECC, CRC checksum failure, or LBA tag mismatch are included in this field.', 'display_type': '' }, 'num_err_log_entries': { 'display_name': 'Numb Err Log Entries', 'ideal': 'low', 'critical': true, 'description': 'Contains the number of Error Information log entries over the life of the controller.', 'display_type': '' }, 'percentage_used': { 'display_name': 'Percentage Used', 'ideal': 'low', 'critical': true, 'description': 'Contains a vendor specific estimate of the percentage of NVM subsystem life used based on the actual usage and the manufacturer’s prediction of NVM life. A value of 100 indicates that the estimated endurance of the NVM in the NVM subsystem has been consumed, but may not indicate an NVM subsystem failure. The value is allowed to exceed 100. Percentages greater than 254 shall be represented as 255. This value shall be updated once per power-on hour (when the controller is not in a sleep state).', 'display_type': '' }, 'power_cycles': { 'display_name': 'Power Cycles', 'ideal': '', 'critical': false, 'description': 'Contains the number of power cycles.', 'display_type': '' }, 'power_on_hours': { 'display_name': 'Power on Hours', 'ideal': '', 'critical': false, 'description': 'Contains the number of power-on hours. Power on hours is always logging, even when in low power mode.', 'display_type': '' }, 'temperature': { 'display_name': 'Temperature', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'unsafe_shutdowns': { 'display_name': 'Unsafe Shutdowns', 'ideal': '', 'critical': false, 'description': 'Contains the number of unsafe shutdowns. This count is incremented when a shutdown notification (CC.SHN) is not received prior to loss of power.', 'display_type': '' }, 'warning_temp_time': { 'display_name': 'Warning Temp Time', 'ideal': '', 'critical': false, 'description': 'Contains the amount of time in minutes that the controller is operational and the Composite Temperature is greater than or equal to the Warning Composite Temperature Threshold (WCTEMP) field and less than the Critical Composite Temperature Threshold (CCTEMP) field in the Identify Controller data structure.', 'display_type': '' } }, 'success': true } ================================================ FILE: webapp/frontend/src/app/data/mock/device/details/sdb.ts ================================================ export const sdb = { 'data': { 'device': { 'CreatedAt': '2021-06-24T21:17:31.302191-07:00', 'UpdatedAt': '2021-10-24T17:06:39.436996-07:00', 'DeletedAt': null, 'wwn': '0x5000cca264eb01d7', 'device_name': 'sdb', 'manufacturer': 'ATA', 'model_name': 'WDC_WD140EDFZ-11A0VA0', 'interface_type': 'SCSI', 'interface_speed': '', 'serial_number': '9RK1XXXXX', 'firmware': '81.00A81', 'rotational_speed': 0, 'capacity': 14000519643136, 'form_factor': '', 'smart_support': false, 'device_protocol': 'ATA', 'device_type': '', 'label': '', 'host_id': '', 'device_status': 2 }, 'smart_results': [{ 'date': '2021-10-24T20:34:04Z', 'device_wwn': '0x5000cca264eb01d7', 'device_protocol': 'ATA', 'temp': 32, 'power_on_hours': 1730, 'power_cycle_count': 9, 'attrs': { '1': { 'attribute_id': 1, 'value': 100, 'thresh': 1, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.034155719633986996 }, '10': { 'attribute_id': 10, 'value': 100, 'thresh': 1, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.05459827163896099 }, '12': { 'attribute_id': 12, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 9, 'raw_string': '9', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.019835987118930823 }, '192': { 'attribute_id': 192, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 329, 'raw_string': '329', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.01634692899031039 }, '193': { 'attribute_id': 193, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 329, 'raw_string': '329', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '194': { 'attribute_id': 194, 'value': 51, 'thresh': 0, 'worst': 51, 'raw_value': 163210330144, 'raw_string': '32 (Min/Max 24/38)', 'when_failed': '', 'transformed_value': 32, 'status': 0 }, '196': { 'attribute_id': 196, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.007389855800729792 }, '197': { 'attribute_id': 197, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.025540791394761345 }, '198': { 'attribute_id': 198, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.028675322159886437 }, '199': { 'attribute_id': 199, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '2': { 'attribute_id': 2, 'value': 135, 'thresh': 54, 'worst': 135, 'raw_value': 108, 'raw_string': '108', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '22': { 'attribute_id': 22, 'value': 100, 'thresh': 25, 'worst': 100, 'raw_value': 100, 'raw_string': '100', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '3': { 'attribute_id': 3, 'value': 81, 'thresh': 1, 'worst': 81, 'raw_value': 30089675132, 'raw_string': '380 (Average 380)', 'when_failed': '', 'transformed_value': 0, 'status': 2, 'status_reason': 'Observed Failure Rate for Attribute is greater than 10%', 'failure_rate': 0.11452195377351217 }, '4': { 'attribute_id': 4, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 9, 'raw_string': '9', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.01989335424860646 }, '5': { 'attribute_id': 5, 'value': 100, 'thresh': 1, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.025169175350572493 }, '7': { 'attribute_id': 7, 'value': 100, 'thresh': 1, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.01087335627722523 }, '8': { 'attribute_id': 8, 'value': 133, 'thresh': 20, 'worst': 133, 'raw_value': 18, 'raw_string': '18', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '9': { 'attribute_id': 9, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 1730, 'raw_string': '1730', 'when_failed': '', 'transformed_value': 0, 'status': 0 } }, 'Status': 0 }, { 'date': '2021-10-24T23:20:44Z', 'device_wwn': '0x5000cca264eb01d7', 'device_protocol': 'ATA', 'temp': 32, 'power_on_hours': 1730, 'power_cycle_count': 9, 'attrs': { '1': { 'attribute_id': 1, 'value': 100, 'thresh': 1, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.034155719633986996 }, '10': { 'attribute_id': 10, 'value': 100, 'thresh': 1, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.05459827163896099 }, '12': { 'attribute_id': 12, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 9, 'raw_string': '9', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.019835987118930823 }, '192': { 'attribute_id': 192, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 329, 'raw_string': '329', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.01634692899031039 }, '193': { 'attribute_id': 193, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 329, 'raw_string': '329', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '194': { 'attribute_id': 194, 'value': 51, 'thresh': 0, 'worst': 51, 'raw_value': 163210330144, 'raw_string': '32 (Min/Max 24/38)', 'when_failed': '', 'transformed_value': 32, 'status': 0 }, '196': { 'attribute_id': 196, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.007389855800729792 }, '197': { 'attribute_id': 197, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.025540791394761345 }, '198': { 'attribute_id': 198, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.028675322159886437 }, '199': { 'attribute_id': 199, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '2': { 'attribute_id': 2, 'value': 135, 'thresh': 54, 'worst': 135, 'raw_value': 108, 'raw_string': '108', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '22': { 'attribute_id': 22, 'value': 100, 'thresh': 25, 'worst': 100, 'raw_value': 100, 'raw_string': '100', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '3': { 'attribute_id': 3, 'value': 81, 'thresh': 1, 'worst': 81, 'raw_value': 30089675132, 'raw_string': '380 (Average 380)', 'when_failed': '', 'transformed_value': 0, 'status': 2, 'status_reason': 'Observed Failure Rate for Attribute is greater than 10%', 'failure_rate': 0.11452195377351217 }, '4': { 'attribute_id': 4, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 9, 'raw_string': '9', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.01989335424860646 }, '5': { 'attribute_id': 5, 'value': 100, 'thresh': 1, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.025169175350572493 }, '7': { 'attribute_id': 7, 'value': 100, 'thresh': 1, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.01087335627722523 }, '8': { 'attribute_id': 8, 'value': 133, 'thresh': 20, 'worst': 133, 'raw_value': 18, 'raw_string': '18', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '9': { 'attribute_id': 9, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 1730, 'raw_string': '1730', 'when_failed': '', 'transformed_value': 0, 'status': 0 } }, 'Status': 0 }] }, 'metadata': { '1': { 'display_name': 'Read Error Rate', 'ideal': 'low', 'critical': false, 'description': '(Vendor specific raw value.) Stores data related to the rate of hardware read errors that occurred when reading data from a disk surface. The raw value has different structure for different vendors and is often not meaningful as a decimal number.', 'observed_thresholds': [{ 'low': 80, 'high': 95, 'annual_failure_rate': 0.8879749768303985, 'error_interval': [0.682344353388663, 1.136105732920724] }, { 'low': 95, 'high': 110, 'annual_failure_rate': 0.034155719633986996, 'error_interval': [0.030188482024981093, 0.038499386872354435] }, { 'low': 110, 'high': 125, 'annual_failure_rate': 0.06390002135229157, 'error_interval': [0.05852004676110847, 0.06964160930553712] }, { 'low': 125, 'high': 140, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 140, 'high': 155, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 155, 'high': 170, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 170, 'high': 185, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 185, 'high': 200, 'annual_failure_rate': 0.044823775021490854, 'error_interval': [0.032022762038723306, 0.06103725943096589] }], 'display_type': 'normalized' }, '10': { 'display_name': 'Spin Retry Count', 'ideal': 'low', 'critical': true, 'description': 'Count of retry of spin start attempts. This attribute stores a total count of the spin start attempts to reach the fully operational speed (under the condition that the first attempt was unsuccessful). An increase of this attribute value is a sign of problems in the hard disk mechanical subsystem.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.05459827163896099, 'error_interval': [0.05113785787727033, 0.05823122757702782] }, { 'low': 0, 'high': 80, 'annual_failure_rate': 0.5555555555555556, 'error_interval': [0.014065448880161053, 3.095357439410498] }], 'display_type': 'raw' }, '11': { 'display_name': 'Recalibration Retries or Calibration Retry Count', 'ideal': 'low', 'critical': false, 'description': 'This attribute indicates the count that recalibration was requested (under the condition that the first attempt was unsuccessful). An increase of this attribute value is a sign of problems in the hard disk mechanical subsystem.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.04658866433672694, 'error_interval': [0.03357701137320878, 0.06297433993055492] }, { 'low': 0, 'high': 80, 'annual_failure_rate': 0.5555555555555556, 'error_interval': [0.014065448880161053, 3.095357439410498] }, { 'low': 80, 'high': 160, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 160, 'high': 240, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 240, 'high': 320, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 320, 'high': 400, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 400, 'high': 480, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 480, 'high': 560, 'annual_failure_rate': 0, 'error_interval': [0, 0] }], 'display_type': 'raw' }, '12': { 'display_name': 'Power Cycle Count', 'ideal': 'low', 'critical': false, 'description': 'This attribute indicates the count of full hard disk power on/off cycles.', 'observed_thresholds': [{ 'low': 0, 'high': 13, 'annual_failure_rate': 0.019835987118930823, 'error_interval': [0.016560870164523494, 0.023569242386797896] }, { 'low': 13, 'high': 26, 'annual_failure_rate': 0.038210930067894826, 'error_interval': [0.03353859179329295, 0.0433520775718649] }, { 'low': 26, 'high': 39, 'annual_failure_rate': 0.11053528307302571, 'error_interval': [0.09671061589521368, 0.1257816678419765] }, { 'low': 39, 'high': 52, 'annual_failure_rate': 0.16831189443375036, 'error_interval': [0.1440976510675928, 0.19543066007594895] }, { 'low': 52, 'high': 65, 'annual_failure_rate': 0.20630344262550107, 'error_interval': [0.1693965932069108, 0.2488633537247856] }, { 'low': 65, 'high': 78, 'annual_failure_rate': 0.1030972634140512, 'error_interval': [0.06734655535304743, 0.15106137807407605] }, { 'low': 78, 'high': 91, 'annual_failure_rate': 0.12354840389522469, 'error_interval': [0.06578432170016109, 0.21127153335749593] }], 'display_type': 'raw' }, '13': { 'display_name': 'Soft Read Error Rate', 'ideal': 'low', 'critical': false, 'description': 'Uncorrected read errors reported to the operating system.', 'display_type': 'normalized' }, '170': { 'display_name': 'Available Reserved Space', 'ideal': '', 'critical': false, 'description': 'See attribute E8.', 'display_type': 'normalized' }, '171': { 'display_name': 'SSD Program Fail Count', 'ideal': '', 'critical': false, 'description': '(Kingston) The total number of flash program operation failures since the drive was deployed.[33] Identical to attribute 181.', 'display_type': 'normalized' }, '172': { 'display_name': 'SSD Erase Fail Count', 'ideal': '', 'critical': false, 'description': '(Kingston) Counts the number of flash erase failures. This attribute returns the total number of Flash erase operation failures since the drive was deployed. This attribute is identical to attribute 182.', 'display_type': 'normalized' }, '173': { 'display_name': 'SSD Wear Leveling Count', 'ideal': '', 'critical': false, 'description': 'Counts the maximum worst erase count on any block.', 'display_type': 'normalized' }, '174': { 'display_name': 'Unexpected Power Loss Count', 'ideal': '', 'critical': false, 'description': 'Also known as "Power-off Retract Count" per conventional HDD terminology. Raw value reports the number of unclean shutdowns, cumulative over the life of an SSD, where an "unclean shutdown" is the removal of power without STANDBY IMMEDIATE as the last command (regardless of PLI activity using capacitor power). Normalized value is always 100.', 'display_type': '' }, '175': { 'display_name': 'Power Loss Protection Failure', 'ideal': '', 'critical': false, 'description': 'Last test result as microseconds to discharge cap, saturated at its maximum value. Also logs minutes since last test and lifetime number of tests. Raw value contains the following data: Bytes 0-1: Last test result as microseconds to discharge cap, saturates at max value. Test result expected in range 25 \u003c= result \u003c= 5000000, lower indicates specific error code. Bytes 2-3: Minutes since last test, saturates at max value.Bytes 4-5: Lifetime number of tests, not incremented on power cycle, saturates at max value. Normalized value is set to one on test failure or 11 if the capacitor has been tested in an excessive temperature condition, otherwise 100.', 'display_type': 'normalized' }, '176': { 'display_name': 'Erase Fail Count', 'ideal': '', 'critical': false, 'description': 'S.M.A.R.T. parameter indicates a number of flash erase command failures.', 'display_type': 'normalized' }, '177': { 'display_name': 'Wear Range Delta', 'ideal': '', 'critical': false, 'description': 'Delta between most-worn and least-worn Flash blocks. It describes how good/bad the wearleveling of the SSD works on a more technical way. ', 'display_type': 'normalized' }, '179': { 'display_name': 'Used Reserved Block Count Total', 'ideal': '', 'critical': false, 'description': 'Pre-Fail attribute used at least in Samsung devices.', 'display_type': 'normalized' }, '180': { 'display_name': 'Unused Reserved Block Count Total', 'ideal': '', 'critical': false, 'description': '"Pre-Fail" attribute used at least in HP devices. ', 'display_type': 'normalized' }, '181': { 'display_name': 'Program Fail Count Total', 'ideal': '', 'critical': false, 'description': 'Total number of Flash program operation failures since the drive was deployed.', 'display_type': 'normalized' }, '182': { 'display_name': 'Erase Fail Count', 'ideal': '', 'critical': false, 'description': '"Pre-Fail" Attribute used at least in Samsung devices.', 'display_type': 'normalized' }, '183': { 'display_name': 'SATA Downshift Error Count or Runtime Bad Block', 'ideal': 'low', 'critical': false, 'description': 'Western Digital, Samsung or Seagate attribute: Either the number of downshifts of link speed (e.g. from 6Gbit/s to 3Gbit/s) or the total number of data blocks with detected, uncorrectable errors encountered during normal operation. Although degradation of this parameter can be an indicator of drive aging and/or potential electromechanical problems, it does not directly indicate imminent drive failure.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.09084549203210031, 'error_interval': [0.08344373475686712, 0.09872777224842152] }, { 'low': 1, 'high': 2, 'annual_failure_rate': 0.05756065656498585, 'error_interval': [0.04657000847949464, 0.07036491775108872] }, { 'low': 2, 'high': 4, 'annual_failure_rate': 0.6193088626208925, 'error_interval': [0.41784508895529787, 0.8841019099092139] }, { 'low': 4, 'high': 8, 'annual_failure_rate': 0.5533447034299792, 'error_interval': [0.31628430884775033, 0.8985971312402635] }, { 'low': 8, 'high': 16, 'annual_failure_rate': 0.3882388694727245, 'error_interval': [0.21225380267814295, 0.6513988534774338] }, { 'low': 16, 'high': 35, 'annual_failure_rate': 0.37116708385481856, 'error_interval': [0.19763084005134446, 0.6347070173754686] }, { 'low': 35, 'high': 70, 'annual_failure_rate': 0.2561146752205292, 'error_interval': [0.10297138269895259, 0.5276941165819332] }, { 'low': 70, 'high': 130, 'annual_failure_rate': 0.40299684542586756, 'error_interval': [0.16202563309223209, 0.8303275247667772] }, { 'low': 130, 'high': 260, 'annual_failure_rate': 0, 'error_interval': [0, 0] }], 'display_type': 'raw' }, '184': { 'display_name': 'End-to-End error', 'ideal': 'low', 'critical': true, 'description': 'This attribute is a part of Hewlett-Packard"s SMART IV technology, as well as part of other vendors" IO Error Detection and Correction schemas, and it contains a count of parity errors which occur in the data path to the media via the drive"s cache RAM', 'observed_thresholds': [{ 'low': 93, 'high': 94, 'annual_failure_rate': 1.631212012870933, 'error_interval': [1.055634407303844, 2.407990716767714] }, { 'low': 94, 'high': 95, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 95, 'high': 96, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 96, 'high': 97, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 97, 'high': 97, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 97, 'high': 98, 'annual_failure_rate': 1.8069306930693072, 'error_interval': [0.04574752432804858, 10.067573453924245] }, { 'low': 98, 'high': 99, 'annual_failure_rate': 0.8371559633027523, 'error_interval': [0.10138347095016888, 3.0240951820174824] }, { 'low': 99, 'high': 100, 'annual_failure_rate': 0.09334816849865138, 'error_interval': [0.08689499010435861, 0.10015372448181788] }], 'display_type': 'normalized' }, '185': { 'display_name': 'Head Stability', 'ideal': '', 'critical': false, 'description': 'Western Digital attribute.', 'display_type': 'normalized' }, '186': { 'display_name': 'Induced Op-Vibration Detection', 'ideal': '', 'critical': false, 'description': 'Western Digital attribute.', 'display_type': 'normalized' }, '187': { 'display_name': 'Reported Uncorrectable Errors', 'ideal': 'low', 'critical': true, 'description': 'The count of errors that could not be recovered using hardware ECC (see attribute 195).', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.028130798308190524, 'error_interval': [0.024487830609364304, 0.032162944988161336] }, { 'low': 1, 'high': 1, 'annual_failure_rate': 0.33877621175661743, 'error_interval': [0.22325565823630591, 0.4929016016666955] }, { 'low': 1, 'high': 3, 'annual_failure_rate': 0.24064820598237213, 'error_interval': [0.14488594021076606, 0.3758019832614595] }, { 'low': 3, 'high': 6, 'annual_failure_rate': 0.5014425058387142, 'error_interval': [0.3062941096766342, 0.7744372808405151] }, { 'low': 6, 'high': 11, 'annual_failure_rate': 0.38007108544136836, 'error_interval': [0.2989500188963677, 0.4764223967570595] }, { 'low': 11, 'high': 20, 'annual_failure_rate': 0.5346094598348444, 'error_interval': [0.40595137663302483, 0.6911066985735377] }, { 'low': 20, 'high': 35, 'annual_failure_rate': 0.8428063943161636, 'error_interval': [0.6504601819243522, 1.0742259350903411] }, { 'low': 35, 'high': 65, 'annual_failure_rate': 1.4429071005017484, 'error_interval': [1.1405581860945952, 1.8008133631629157] }, { 'low': 65, 'high': 120, 'annual_failure_rate': 1.6190935390549661, 'error_interval': [1.0263664163011208, 2.4294352761068576] }], 'display_type': 'raw' }, '188': { 'display_name': 'Command Timeout', 'ideal': 'low', 'critical': true, 'description': 'The count of aborted operations due to HDD timeout. Normally this attribute value should be equal to zero.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.024893587674442153, 'error_interval': [0.020857343769186413, 0.0294830350167543] }, { 'low': 0, 'high': 13, 'annual_failure_rate': 0.10044174089362015, 'error_interval': [0.0812633664077498, 0.1227848196758574] }, { 'low': 13, 'high': 26, 'annual_failure_rate': 0.334030592234279, 'error_interval': [0.2523231196342665, 0.4337665082489293] }, { 'low': 26, 'high': 39, 'annual_failure_rate': 0.36724705400842445, 'error_interval': [0.30398009356575617, 0.4397986538328568] }, { 'low': 39, 'high': 52, 'annual_failure_rate': 0.29848155926978354, 'error_interval': [0.2509254838615984, 0.35242890006477073] }, { 'low': 52, 'high': 65, 'annual_failure_rate': 0.2203079701535098, 'error_interval': [0.18366082845676174, 0.26212468677179274] }, { 'low': 65, 'high': 78, 'annual_failure_rate': 0.3018169948863018, 'error_interval': [0.23779746376787655, 0.37776897542831006] }, { 'low': 78, 'high': 91, 'annual_failure_rate': 0.32854928239235887, 'error_interval': [0.2301118782147336, 0.4548506948185028] }, { 'low': 91, 'high': 104, 'annual_failure_rate': 0.28488916640649387, 'error_interval': [0.1366154288236293, 0.5239213202729072] }], 'display_type': 'raw' }, '189': { 'display_name': 'High Fly Writes', 'ideal': 'low', 'critical': false, 'description': 'HDD manufacturers implement a flying height sensor that attempts to provide additional protections for write operations by detecting when a recording head is flying outside its normal operating range. If an unsafe fly height condition is encountered, the write process is stopped, and the information is rewritten or reallocated to a safe region of the hard drive. This attribute indicates the count of these errors detected over the lifetime of the drive.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.09070551401946862, 'error_interval': [0.08018892683853401, 0.10221801211956287] }, { 'low': 1, 'high': 2, 'annual_failure_rate': 0.0844336097370013, 'error_interval': [0.07299813695315267, 0.09715235540340669] }, { 'low': 2, 'high': 5, 'annual_failure_rate': 0.07943219628781906, 'error_interval': [0.06552176680630226, 0.09542233189887633] }, { 'low': 5, 'high': 13, 'annual_failure_rate': 0.09208847603893404, 'error_interval': [0.07385765060838133, 0.11345557807163456] }, { 'low': 13, 'high': 30, 'annual_failure_rate': 0.18161161650924224, 'error_interval': [0.13858879602902988, 0.23377015012749933] }, { 'low': 30, 'high': 70, 'annual_failure_rate': 0.2678117886102384, 'error_interval': [0.19044036194841887, 0.36610753129699186] }, { 'low': 70, 'high': 150, 'annual_failure_rate': 0.26126480798826107, 'error_interval': [0.15958733218826962, 0.4035023060905559] }, { 'low': 150, 'high': 350, 'annual_failure_rate': 0.11337164155924832, 'error_interval': [0.030889956621649995, 0.2902764300762812] }], 'display_type': 'raw' }, '190': { 'display_name': 'Temperature Difference', 'ideal': '', 'critical': false, 'description': 'Value is equal to (100-temp. °C), allowing manufacturer to set a minimum threshold which corresponds to a maximum temperature. This also follows the convention of 100 being a best-case value and lower values being undesirable. However, some older drives may instead report raw Temperature (identical to 0xC2) or Temperature minus 50 here.', 'display_type': 'normalized' }, '191': { 'display_name': 'G-sense Error Rate', 'ideal': 'low', 'critical': false, 'description': 'The count of errors resulting from externally induced shock and vibration. ', 'display_type': 'normalized' }, '192': { 'display_name': 'Power-off Retract Count', 'ideal': 'low', 'critical': false, 'description': 'Number of power-off or emergency retract cycles.', 'observed_thresholds': [{ 'low': 1, 'high': 2, 'annual_failure_rate': 0.02861098445412803, 'error_interval': [0.022345416230915037, 0.036088863823297186] }, { 'low': 2, 'high': 6, 'annual_failure_rate': 0.0738571777154862, 'error_interval': [0.06406927746420421, 0.0847175264009771] }, { 'low': 6, 'high': 16, 'annual_failure_rate': 0.11970378206823593, 'error_interval': [0.10830059875098269, 0.13198105985656441] }, { 'low': 16, 'high': 40, 'annual_failure_rate': 0.027266868552620425, 'error_interval': [0.021131448605713823, 0.03462795920968522] }, { 'low': 40, 'high': 100, 'annual_failure_rate': 0.011741682974559688, 'error_interval': [0.00430899071133239, 0.025556700631152028] }, { 'low': 100, 'high': 250, 'annual_failure_rate': 0.012659940134091309, 'error_interval': [0.00607093338127348, 0.023282080653656938] }, { 'low': 250, 'high': 650, 'annual_failure_rate': 0.01634692899031039, 'error_interval': [0.009522688540043157, 0.026173016865409605] }, { 'low': 650, 'high': 1600, 'annual_failure_rate': 0.005190074354440066, 'error_interval': [0.0025908664180103293, 0.009286476666453648] }], 'display_type': 'raw' }, '193': { 'display_name': 'Load Cycle Count', 'ideal': 'low', 'critical': false, 'description': 'Count of load/unload cycles into head landing zone position.[45] Some drives use 225 (0xE1) for Load Cycle Count instead.', 'display_type': 'normalized' }, '194': { 'display_name': 'Temperature', 'ideal': 'low', 'critical': false, 'description': 'Indicates the device temperature, if the appropriate sensor is fitted. Lowest byte of the raw value contains the exact temperature value (Celsius degrees).', 'transform_value_unit': '°C', 'display_type': 'transformed' }, '195': { 'display_name': 'Hardware ECC Recovered', 'ideal': '', 'critical': false, 'description': '(Vendor-specific raw value.) The raw value has different structure for different vendors and is often not meaningful as a decimal number.', 'observed_thresholds': [{ 'low': 12, 'high': 24, 'annual_failure_rate': 0.31472916829975706, 'error_interval': [0.15711166685282174, 0.5631374192486645] }, { 'low': 24, 'high': 36, 'annual_failure_rate': 0.15250310197260136, 'error_interval': [0.10497611828070175, 0.21417105521823687] }, { 'low': 36, 'high': 48, 'annual_failure_rate': 0.2193119102723874, 'error_interval': [0.16475385681835103, 0.28615447006525274] }, { 'low': 48, 'high': 60, 'annual_failure_rate': 0.05672658497265746, 'error_interval': [0.043182904776447234, 0.07317316161437043] }, { 'low': 60, 'high': 72, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 72, 'high': 84, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 84, 'high': 96, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 96, 'high': 108, 'annual_failure_rate': 0.04074570216566197, 'error_interval': [0.001031591863615295, 0.22702052218047528] }], 'display_type': 'normalized' }, '196': { 'display_name': 'Reallocation Event Count', 'ideal': 'low', 'critical': true, 'description': 'Count of remap operations. The raw value of this attribute shows the total count of attempts to transfer data from reallocated sectors to a spare area. Both successful and unsuccessful attempts are counted.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.007389855800729792, 'error_interval': [0.005652654139732716, 0.009492578928212054] }, { 'low': 1, 'high': 1, 'annual_failure_rate': 0.026558331312151347, 'error_interval': [0.005476966404484466, 0.07761471429677293] }, { 'low': 1, 'high': 2, 'annual_failure_rate': 0.02471894893674658, 'error_interval': [0.0006258296027540169, 0.13772516847438018] }, { 'low': 2, 'high': 4, 'annual_failure_rate': 0.03200912040691046, 'error_interval': [0.0008104007642081744, 0.17834340416493005] }, { 'low': 4, 'high': 7, 'annual_failure_rate': 0.043078012510326925, 'error_interval': [0.001090640849081295, 0.24001532369794615] }, { 'low': 7, 'high': 11, 'annual_failure_rate': 0.033843300880853036, 'error_interval': [0.0008568381932559863, 0.18856280368036135] }, { 'low': 11, 'high': 17, 'annual_failure_rate': 0.16979376647542252, 'error_interval': [0.035015556653263225, 0.49620943874336304] }, { 'low': 17, 'high': 27, 'annual_failure_rate': 0.059042381106438044, 'error_interval': [0.0014948236677880642, 0.32896309247698113] }, { 'low': 27, 'high': 45, 'annual_failure_rate': 0.24701105346266636, 'error_interval': [0.050939617608142244, 0.721871118983972] }], 'display_type': 'raw' }, '197': { 'display_name': 'Current Pending Sector Count', 'ideal': 'low', 'critical': true, 'description': 'Count of "unstable" sectors (waiting to be remapped, because of unrecoverable read errors). If an unstable sector is subsequently read successfully, the sector is remapped and this value is decreased. Read errors on a sector will not remap the sector immediately (since the correct value cannot be read and so the value to remap is not known, and also it might become readable later); instead, the drive firmware remembers that the sector needs to be remapped, and will remap it the next time it"s written.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.025540791394761345, 'error_interval': [0.023161777231213983, 0.02809784482748174] }, { 'low': 1, 'high': 2, 'annual_failure_rate': 0.34196613799103254, 'error_interval': [0.22723401523750225, 0.4942362818474496] }, { 'low': 2, 'high': 6, 'annual_failure_rate': 0.6823772508117681, 'error_interval': [0.41083568090070416, 1.0656166047061635] }, { 'low': 6, 'high': 16, 'annual_failure_rate': 0.6108100007493069, 'error_interval': [0.47336936083368364, 0.7757071095273286] }, { 'low': 16, 'high': 40, 'annual_failure_rate': 0.9564879341127684, 'error_interval': [0.7701044196378299, 1.174355230793638] }, { 'low': 40, 'high': 100, 'annual_failure_rate': 1.6519989942167461, 'error_interval': [1.328402276482456, 2.0305872327541317] }, { 'low': 100, 'high': 250, 'annual_failure_rate': 2.5137741046831956, 'error_interval': [1.9772427971560862, 3.1510376077891613] }, { 'low': 250, 'high': 650, 'annual_failure_rate': 3.3203378817413904, 'error_interval': [2.5883662702274406, 4.195047163573006] }, { 'low': 650, 'high': 1600, 'annual_failure_rate': 3.133047210300429, 'error_interval': [1.1497731080460096, 6.819324775707182] }], 'display_type': 'raw' }, '198': { 'display_name': '(Offline) Uncorrectable Sector Count', 'ideal': 'low', 'critical': true, 'description': 'The total count of uncorrectable errors when reading/writing a sector. A rise in the value of this attribute indicates defects of the disk surface and/or problems in the mechanical subsystem.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.028675322159886437, 'error_interval': [0.026159385510707116, 0.03136793218577656] }, { 'low': 0, 'high': 2, 'annual_failure_rate': 0.8135764944275583, 'error_interval': [0.40613445471964466, 1.4557130815309443] }, { 'low': 2, 'high': 4, 'annual_failure_rate': 1.1173469387755102, 'error_interval': [0.5773494680315332, 1.9517802404552516] }, { 'low': 4, 'high': 6, 'annual_failure_rate': 1.3558692421991083, 'error_interval': [0.4402470522980859, 3.1641465148237544] }, { 'low': 6, 'high': 8, 'annual_failure_rate': 0.7324414715719062, 'error_interval': [0.15104704003805655, 2.140504796291604] }, { 'low': 8, 'high': 10, 'annual_failure_rate': 0.5777213677766163, 'error_interval': [0.43275294849366835, 0.7556737733062419] }, { 'low': 10, 'high': 12, 'annual_failure_rate': 1.7464114832535886, 'error_interval': [0.47583835092536914, 4.471507017371231] }, { 'low': 12, 'high': 14, 'annual_failure_rate': 2.6449275362318843, 'error_interval': [0.3203129951758959, 9.554387676519005] }, { 'low': 14, 'high': 16, 'annual_failure_rate': 0.796943231441048, 'error_interval': [0.5519063550198366, 1.113648286331181] }], 'display_type': 'raw' }, '199': { 'display_name': 'UltraDMA CRC Error Count', 'ideal': 'low', 'critical': false, 'description': 'The count of errors in data transfer via the interface cable as determined by ICRC (Interface Cyclic Redundancy Check).', 'observed_thresholds': [{ 'low': 0, 'high': 1, 'annual_failure_rate': 0.04068379316116366, 'error_interval': [0.037534031558106425, 0.04402730201866553] }, { 'low': 1, 'high': 2, 'annual_failure_rate': 0.1513481259734218, 'error_interval': [0.12037165605991791, 0.18786293065527596] }, { 'low': 2, 'high': 4, 'annual_failure_rate': 0.16849758722418978, 'error_interval': [0.12976367397863445, 0.2151676572000481] }, { 'low': 4, 'high': 8, 'annual_failure_rate': 0.15385127340491614, 'error_interval': [0.10887431782430312, 0.21117289306426648] }, { 'low': 8, 'high': 16, 'annual_failure_rate': 0.14882894050104387, 'error_interval': [0.09631424312463635, 0.2197008753522735] }, { 'low': 16, 'high': 35, 'annual_failure_rate': 0.20878219917249793, 'error_interval': [0.14086447304552446, 0.29804957135975] }, { 'low': 35, 'high': 70, 'annual_failure_rate': 0.13742940270409038, 'error_interval': [0.06860426267470295, 0.24589916335290812] }, { 'low': 70, 'high': 130, 'annual_failure_rate': 0.22336578581363, 'error_interval': [0.11150339549604707, 0.39966309081252904] }, { 'low': 130, 'high': 260, 'annual_failure_rate': 0.18277416124186283, 'error_interval': [0.07890890989692058, 0.3601379610272007] }], 'display_type': 'raw' }, '2': { 'display_name': 'Throughput Performance', 'ideal': 'high', 'critical': false, 'description': 'Overall (general) throughput performance of a hard disk drive. If the value of this attribute is decreasing there is a high probability that there is a problem with the disk.', 'display_type': 'normalized' }, '200': { 'display_name': 'Multi-Zone Error Rate', 'ideal': 'low', 'critical': false, 'description': 'The count of errors found when writing a sector. The higher the value, the worse the disk"s mechanical condition is.', 'display_type': 'normalized' }, '201': { 'display_name': 'Soft Read Error Rate', 'ideal': 'low', 'critical': true, 'description': 'Count indicates the number of uncorrectable software read errors.', 'display_type': 'normalized' }, '202': { 'display_name': 'Data Address Mark errors', 'ideal': 'low', 'critical': false, 'description': 'Count of Data Address Mark errors (or vendor-specific).', 'display_type': 'normalized' }, '203': { 'display_name': 'Run Out Cancel', 'ideal': 'low', 'critical': false, 'description': 'The number of errors caused by incorrect checksum during the error correction.', 'display_type': 'normalized' }, '204': { 'display_name': 'Soft ECC Correction', 'ideal': 'low', 'critical': false, 'description': 'Count of errors corrected by the internal error correction software.', 'display_type': '' }, '205': { 'display_name': 'Thermal Asperity Rate', 'ideal': 'low', 'critical': false, 'description': 'Count of errors due to high temperature.', 'display_type': 'normalized' }, '206': { 'display_name': 'Flying Height', 'ideal': '', 'critical': false, 'description': 'Height of heads above the disk surface. If too low, head crash is more likely; if too high, read/write errors are more likely.', 'display_type': 'normalized' }, '207': { 'display_name': 'Spin High Current', 'ideal': 'low', 'critical': false, 'description': 'Amount of surge current used to spin up the drive.', 'display_type': 'normalized' }, '208': { 'display_name': 'Spin Buzz', 'ideal': '', 'critical': false, 'description': 'Count of buzz routines needed to spin up the drive due to insufficient power.', 'display_type': 'normalized' }, '209': { 'display_name': 'Offline Seek Performance', 'ideal': '', 'critical': false, 'description': 'Drive"s seek performance during its internal tests.', 'display_type': 'normalized' }, '210': { 'display_name': 'Vibration During Write', 'ideal': '', 'critical': false, 'description': 'Found in Maxtor 6B200M0 200GB and Maxtor 2R015H1 15GB disks.', 'display_type': 'normalized' }, '211': { 'display_name': 'Vibration During Write', 'ideal': '', 'critical': false, 'description': 'A recording of a vibration encountered during write operations.', 'display_type': 'normalized' }, '212': { 'display_name': 'Shock During Write', 'ideal': '', 'critical': false, 'description': 'A recording of shock encountered during write operations.', 'display_type': 'normalized' }, '22': { 'display_name': 'Current Helium Level', 'ideal': 'high', 'critical': false, 'description': 'Specific to He8 drives from HGST. This value measures the helium inside of the drive specific to this manufacturer. It is a pre-fail attribute that trips once the drive detects that the internal environment is out of specification.', 'display_type': 'normalized' }, '220': { 'display_name': 'Disk Shift', 'ideal': 'low', 'critical': false, 'description': 'Distance the disk has shifted relative to the spindle (usually due to shock or temperature). Unit of measure is unknown.', 'display_type': 'normalized' }, '221': { 'display_name': 'G-Sense Error Rate', 'ideal': 'low', 'critical': false, 'description': 'The count of errors resulting from externally induced shock and vibration.', 'display_type': 'normalized' }, '222': { 'display_name': 'Loaded Hours', 'ideal': '', 'critical': false, 'description': 'Time spent operating under data load (movement of magnetic head armature).', 'display_type': 'normalized' }, '223': { 'display_name': 'Load/Unload Retry Count', 'ideal': '', 'critical': false, 'description': 'Count of times head changes position.', 'display_type': 'normalized' }, '224': { 'display_name': 'Load Friction', 'ideal': 'low', 'critical': false, 'description': 'Resistance caused by friction in mechanical parts while operating.', 'display_type': 'normalized' }, '225': { 'display_name': 'Load/Unload Cycle Count', 'ideal': 'low', 'critical': false, 'description': 'Total count of load cycles Some drives use 193 (0xC1) for Load Cycle Count instead. See Description for 193 for significance of this number. ', 'display_type': 'normalized' }, '226': { 'display_name': 'Load "In"-time', 'ideal': '', 'critical': false, 'description': 'Total time of loading on the magnetic heads actuator (time not spent in parking area).', 'display_type': 'normalized' }, '227': { 'display_name': 'Torque Amplification Count', 'ideal': 'low', 'critical': false, 'description': 'Count of attempts to compensate for platter speed variations.[66]', 'display_type': '' }, '228': { 'display_name': 'Power-Off Retract Cycle', 'ideal': 'low', 'critical': false, 'description': 'The number of power-off cycles which are counted whenever there is a "retract event" and the heads are loaded off of the media such as when the machine is powered down, put to sleep, or is idle.', 'display_type': '' }, '230': { 'display_name': 'GMR Head Amplitude ', 'ideal': '', 'critical': false, 'description': 'Amplitude of "thrashing" (repetitive head moving motions between operations).', 'display_type': 'normalized' }, '231': { 'display_name': 'Life Left', 'ideal': '', 'critical': false, 'description': 'Indicates the approximate SSD life left, in terms of program/erase cycles or available reserved blocks. A normalized value of 100 represents a new drive, with a threshold value at 10 indicating a need for replacement. A value of 0 may mean that the drive is operating in read-only mode to allow data recovery.', 'display_type': 'normalized' }, '232': { 'display_name': 'Endurance Remaining', 'ideal': '', 'critical': false, 'description': 'Number of physical erase cycles completed on the SSD as a percentage of the maximum physical erase cycles the drive is designed to endure.', 'display_type': 'normalized' }, '233': { 'display_name': 'Media Wearout Indicator', 'ideal': '', 'critical': false, 'description': 'Intel SSDs report a normalized value from 100, a new drive, to a minimum of 1. It decreases while the NAND erase cycles increase from 0 to the maximum-rated cycles.', 'display_type': 'normalized' }, '234': { 'display_name': 'Average erase count', 'ideal': '', 'critical': false, 'description': 'Decoded as: byte 0-1-2 = average erase count (big endian) and byte 3-4-5 = max erase count (big endian).', 'display_type': 'normalized' }, '235': { 'display_name': 'Good Block Count', 'ideal': '', 'critical': false, 'description': 'Decoded as: byte 0-1-2 = good block count (big endian) and byte 3-4 = system (free) block count.', 'display_type': 'normalized' }, '240': { 'display_name': 'Head Flying Hours', 'ideal': '', 'critical': false, 'description': 'Time spent during the positioning of the drive heads.[15][71] Some Fujitsu drives report the count of link resets during a data transfer.', 'display_type': 'normalized' }, '241': { 'display_name': 'Total LBAs Written', 'ideal': '', 'critical': false, 'description': 'Total count of LBAs written.', 'display_type': 'normalized' }, '242': { 'display_name': 'Total LBAs Read', 'ideal': '', 'critical': false, 'description': 'Total count of LBAs read.Some S.M.A.R.T. utilities will report a negative number for the raw value since in reality it has 48 bits rather than 32.', 'display_type': 'normalized' }, '243': { 'display_name': 'Total LBAs Written Expanded', 'ideal': '', 'critical': false, 'description': 'The upper 5 bytes of the 12-byte total number of LBAs written to the device. The lower 7 byte value is located at attribute 0xF1.', 'display_type': 'normalized' }, '244': { 'display_name': 'Total LBAs Read Expanded', 'ideal': '', 'critical': false, 'description': 'The upper 5 bytes of the 12-byte total number of LBAs read from the device. The lower 7 byte value is located at attribute 0xF2.', 'display_type': 'normalized' }, '249': { 'display_name': 'NAND Writes (1GiB)', 'ideal': '', 'critical': false, 'description': 'Total NAND Writes. Raw value reports the number of writes to NAND in 1 GB increments.', 'display_type': 'normalized' }, '250': { 'display_name': 'Read Error Retry Rate', 'ideal': 'low', 'critical': false, 'description': 'Count of errors while reading from a disk.', 'display_type': 'normalized' }, '251': { 'display_name': 'Minimum Spares Remaining', 'ideal': '', 'critical': false, 'description': 'The Minimum Spares Remaining attribute indicates the number of remaining spare blocks as a percentage of the total number of spare blocks available.', 'display_type': 'normalized' }, '252': { 'display_name': 'Newly Added Bad Flash Block', 'ideal': '', 'critical': false, 'description': 'The Newly Added Bad Flash Block attribute indicates the total number of bad flash blocks the drive detected since it was first initialized in manufacturing.', 'display_type': 'normalized' }, '254': { 'display_name': 'Free Fall Protection', 'ideal': 'low', 'critical': false, 'description': 'Count of "Free Fall Events" detected.', 'display_type': 'normalized' }, '3': { 'display_name': 'Spin-Up Time', 'ideal': 'low', 'critical': false, 'description': 'Average time of spindle spin up (from zero RPM to fully operational [milliseconds]).', 'observed_thresholds': [{ 'low': 78, 'high': 96, 'annual_failure_rate': 0.11452195377351217, 'error_interval': [0.10591837762295722, 0.12363823501915781] }, { 'low': 96, 'high': 114, 'annual_failure_rate': 0.040274562840558074, 'error_interval': [0.03465055611002801, 0.046551312468303144] }, { 'low': 114, 'high': 132, 'annual_failure_rate': 0.009100406705780476, 'error_interval': [0.006530608971356785, 0.012345729280075591] }, { 'low': 132, 'high': 150, 'annual_failure_rate': 0.008561351734020232, 'error_interval': [0.004273795939256936, 0.015318623141355509] }, { 'low': 150, 'high': 168, 'annual_failure_rate': 0.015780508262068848, 'error_interval': [0.005123888078524015, 0.03682644215646287] }, { 'low': 168, 'high': 186, 'annual_failure_rate': 0.05262688124794024, 'error_interval': [0.0325768689524594, 0.08044577830285578] }, { 'low': 186, 'high': 204, 'annual_failure_rate': 0.01957419424036038, 'error_interval': [0.0023705257325185624, 0.0707087198669825] }, { 'low': 204, 'high': 222, 'annual_failure_rate': 0.026050959960031404, 'error_interval': [0.0006595532020744994, 0.1451466588889228] }], 'display_type': 'normalized' }, '4': { 'display_name': 'Start/Stop Count', 'ideal': '', 'critical': false, 'description': 'A tally of spindle start/stop cycles. The spindle turns on, and hence the count is increased, both when the hard disk is turned on after having before been turned entirely off (disconnected from power source) and when the hard disk returns from having previously been put to sleep mode.', 'observed_thresholds': [{ 'low': 0, 'high': 13, 'annual_failure_rate': 0.01989335424860646, 'error_interval': [0.016596548909440657, 0.023653263230617408] }, { 'low': 13, 'high': 26, 'annual_failure_rate': 0.03776935438256488, 'error_interval': [0.03310396052098642, 0.04290806173460437] }, { 'low': 26, 'high': 39, 'annual_failure_rate': 0.11022223828187004, 'error_interval': [0.09655110535164119, 0.12528657238811672] }, { 'low': 39, 'high': 52, 'annual_failure_rate': 0.16289995457762474, 'error_interval': [0.13926541653588131, 0.18939614504497515] }, { 'low': 52, 'high': 65, 'annual_failure_rate': 0.19358212432279714, 'error_interval': [0.15864522253849073, 0.23392418181765526] }, { 'low': 65, 'high': 78, 'annual_failure_rate': 0.1157094940074447, 'error_interval': [0.07861898732346269, 0.16424039052527728] }, { 'low': 78, 'high': 91, 'annual_failure_rate': 0.12262136155304391, 'error_interval': [0.0670382394080032, 0.20573780888032978] }, { 'low': 91, 'high': 104, 'annual_failure_rate': 0, 'error_interval': [0, 0] }], 'display_type': 'raw' }, '5': { 'display_name': 'Reallocated Sectors Count', 'ideal': 'low', 'critical': true, 'description': 'Count of reallocated sectors. The raw value represents a count of the bad sectors that have been found and remapped.Thus, the higher the attribute value, the more sectors the drive has had to reallocate. This value is primarily used as a metric of the life expectancy of the drive; a drive which has had any reallocations at all is significantly more likely to fail in the immediate months.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.025169175350572493, 'error_interval': [0.022768612038746357, 0.027753988579272894] }, { 'low': 1, 'high': 4, 'annual_failure_rate': 0.027432608477803388, 'error_interval': [0.010067283827589948, 0.05970923963096652] }, { 'low': 4, 'high': 16, 'annual_failure_rate': 0.07501976284584981, 'error_interval': [0.039944864177334186, 0.12828607921150972] }, { 'low': 16, 'high': 70, 'annual_failure_rate': 0.23589260654405794, 'error_interval': [0.1643078435800227, 0.32806951196017664] }, { 'low': 70, 'high': 260, 'annual_failure_rate': 0.36193219378600433, 'error_interval': [0.2608488901774093, 0.4892271827875412] }, { 'low': 260, 'high': 1100, 'annual_failure_rate': 0.5676621428968173, 'error_interval': [0.4527895568499355, 0.702804359408436] }, { 'low': 1100, 'high': 4500, 'annual_failure_rate': 1.5028253400346423, 'error_interval': [1.2681757596263297, 1.768305221795894] }, { 'low': 4500, 'high': 17000, 'annual_failure_rate': 2.0659987547404763, 'error_interval': [1.6809790460512237, 2.512808045182302] }, { 'low': 17000, 'high': 70000, 'annual_failure_rate': 1.7755385684503124, 'error_interval': [1.2796520259849835, 2.400012341226441] }], 'display_type': 'raw' }, '6': { 'display_name': 'Read Channel Margin', 'ideal': '', 'critical': false, 'description': 'Margin of a channel while reading data. The function of this attribute is not specified.', 'display_type': 'normalized' }, '7': { 'display_name': 'Seek Error Rate', 'ideal': '', 'critical': false, 'description': '(Vendor specific raw value.) Rate of seek errors of the magnetic heads. If there is a partial failure in the mechanical positioning system, then seek errors will arise. Such a failure may be due to numerous factors, such as damage to a servo, or thermal widening of the hard disk. The raw value has different structure for different vendors and is often not meaningful as a decimal number.', 'observed_thresholds': [{ 'low': 58, 'high': 76, 'annual_failure_rate': 0.2040131025936549, 'error_interval': [0.17032852883286412, 0.2424096283327138] }, { 'low': 76, 'high': 94, 'annual_failure_rate': 0.08725919610118257, 'error_interval': [0.08077138510999876, 0.09412943212007528] }, { 'low': 94, 'high': 112, 'annual_failure_rate': 0.01087335627722523, 'error_interval': [0.008732197944943352, 0.013380600544561905] }, { 'low': 112, 'high': 130, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 130, 'high': 148, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 148, 'high': 166, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 166, 'high': 184, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 184, 'high': 202, 'annual_failure_rate': 0.05316285755900475, 'error_interval': [0.03370069132942804, 0.07977038905848267] }], 'display_type': 'normalized' }, '8': { 'display_name': 'Seek Time Performance', 'ideal': 'high', 'critical': false, 'description': 'Average performance of seek operations of the magnetic heads. If this attribute is decreasing, it is a sign of problems in the mechanical subsystem.', 'display_type': 'normalized' }, '9': { 'display_name': 'Power-On Hours', 'ideal': '', 'critical': false, 'description': 'Count of hours in power-on state. The raw value of this attribute shows total count of hours (or minutes, or seconds, depending on manufacturer) in power-on state. By default, the total expected lifetime of a hard disk in perfect condition is defined as 5 years (running every day and night on all days). This is equal to 1825 days in 24/7 mode or 43800 hours. On some pre-2005 drives, this raw value may advance erratically and/or "wrap around" (reset to zero periodically).', 'display_type': 'normalized' } }, 'success': true } ================================================ FILE: webapp/frontend/src/app/data/mock/device/details/sdc.ts ================================================ export const sdc = { 'data': { 'device': { 'CreatedAt': '2021-06-24T21:17:31.303033-07:00', 'UpdatedAt': '2021-10-24T16:37:56.74865-07:00', 'DeletedAt': null, 'wwn': '0x5000cca264ec3183', 'device_name': 'sdc', 'manufacturer': 'ATA', 'model_name': 'WDC_WD140EDFZ-11A0VA0', 'interface_type': 'SCSI', 'interface_speed': '', 'serial_number': '9RK4XXXXX', 'firmware': 'MS1OA650', 'rotational_speed': 0, 'capacity': 14000519643136, 'form_factor': '', 'smart_support': false, 'device_protocol': 'ATA', 'device_type': '', 'label': '', 'host_id': '', 'device_status': 3 }, 'smart_results': [{ 'date': '2021-10-24T23:20:44Z', 'device_wwn': '0x5000cca264ec3183', 'device_protocol': 'ATA', 'temp': 25, 'power_on_hours': 65592, 'power_cycle_count': 86, 'attrs': { '1': { 'attribute_id': 1, 'value': 100, 'thresh': 16, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.034155719633986996 }, '10': { 'attribute_id': 10, 'value': 100, 'thresh': 60, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.05459827163896099 }, '12': { 'attribute_id': 12, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 86, 'raw_string': '86', 'when_failed': '', 'transformed_value': 0, 'status': 2, 'status_reason': 'Observed Failure Rate for Attribute is greater than 10%', 'failure_rate': 0.12354840389522469 }, '192': { 'attribute_id': 192, 'value': 95, 'thresh': 0, 'worst': 95, 'raw_value': 6244, 'raw_string': '6244', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '193': { 'attribute_id': 193, 'value': 95, 'thresh': 0, 'worst': 95, 'raw_value': 6244, 'raw_string': '6244', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '194': { 'attribute_id': 194, 'value': 240, 'thresh': 0, 'worst': 240, 'raw_value': 167504969753, 'raw_string': '25 (Min/Max 19/39)', 'when_failed': '', 'transformed_value': 25, 'status': 0 }, '196': { 'attribute_id': 196, 'value': 1, 'thresh': 0, 'worst': 1, 'raw_value': 3831, 'raw_string': '3831', 'when_failed': '', 'transformed_value': 0, 'status': 2, 'status_reason': 'Could not determine Observed Failure Rate for Critical Attribute' }, '197': { 'attribute_id': 197, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 8, 'raw_string': '8', 'when_failed': '', 'transformed_value': 0, 'status': 1, 'status_reason': 'Observed Failure Rate for Critical Attribute is greater than 10%', 'failure_rate': 0.6108100007493069 }, '198': { 'attribute_id': 198, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.028675322159886437 }, '199': { 'attribute_id': 199, 'value': 200, 'thresh': 0, 'worst': 200, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '2': { 'attribute_id': 2, 'value': 136, 'thresh': 54, 'worst': 136, 'raw_value': 91, 'raw_string': '91', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '3': { 'attribute_id': 3, 'value': 125, 'thresh': 24, 'worst': 125, 'raw_value': 17192124596, 'raw_string': '180 (Average 187)', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.009100406705780476 }, '4': { 'attribute_id': 4, 'value': 100, 'thresh': 0, 'worst': 100, 'raw_value': 86, 'raw_string': '86', 'when_failed': '', 'transformed_value': 0, 'status': 2, 'status_reason': 'Observed Failure Rate for Attribute is greater than 10%', 'failure_rate': 0.12262136155304391 }, '5': { 'attribute_id': 5, 'value': 1, 'thresh': 5, 'worst': 1, 'raw_value': 1975, 'raw_string': '1975', 'when_failed': 'now', 'transformed_value': 0, 'status': 1, 'status_reason': 'Observed Failure Rate for Critical Attribute is greater than 10%', 'failure_rate': 1.5028253400346423 }, '7': { 'attribute_id': 7, 'value': 100, 'thresh': 67, 'worst': 100, 'raw_value': 0, 'raw_string': '0', 'when_failed': '', 'transformed_value': 0, 'status': 0, 'failure_rate': 0.01087335627722523 }, '8': { 'attribute_id': 8, 'value': 118, 'thresh': 20, 'worst': 118, 'raw_value': 33, 'raw_string': '33', 'when_failed': '', 'transformed_value': 0, 'status': 0 }, '9': { 'attribute_id': 9, 'value': 91, 'thresh': 0, 'worst': 91, 'raw_value': 65592, 'raw_string': '65592', 'when_failed': '', 'transformed_value': 0, 'status': 0 } }, 'Status': 0 }] }, 'metadata': { '1': { 'display_name': 'Read Error Rate', 'ideal': 'low', 'critical': false, 'description': '(Vendor specific raw value.) Stores data related to the rate of hardware read errors that occurred when reading data from a disk surface. The raw value has different structure for different vendors and is often not meaningful as a decimal number.', 'observed_thresholds': [{ 'low': 80, 'high': 95, 'annual_failure_rate': 0.8879749768303985, 'error_interval': [0.682344353388663, 1.136105732920724] }, { 'low': 95, 'high': 110, 'annual_failure_rate': 0.034155719633986996, 'error_interval': [0.030188482024981093, 0.038499386872354435] }, { 'low': 110, 'high': 125, 'annual_failure_rate': 0.06390002135229157, 'error_interval': [0.05852004676110847, 0.06964160930553712] }, { 'low': 125, 'high': 140, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 140, 'high': 155, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 155, 'high': 170, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 170, 'high': 185, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 185, 'high': 200, 'annual_failure_rate': 0.044823775021490854, 'error_interval': [0.032022762038723306, 0.06103725943096589] }], 'display_type': 'normalized' }, '10': { 'display_name': 'Spin Retry Count', 'ideal': 'low', 'critical': true, 'description': 'Count of retry of spin start attempts. This attribute stores a total count of the spin start attempts to reach the fully operational speed (under the condition that the first attempt was unsuccessful). An increase of this attribute value is a sign of problems in the hard disk mechanical subsystem.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.05459827163896099, 'error_interval': [0.05113785787727033, 0.05823122757702782] }, { 'low': 0, 'high': 80, 'annual_failure_rate': 0.5555555555555556, 'error_interval': [0.014065448880161053, 3.095357439410498] }], 'display_type': 'raw' }, '11': { 'display_name': 'Recalibration Retries or Calibration Retry Count', 'ideal': 'low', 'critical': false, 'description': 'This attribute indicates the count that recalibration was requested (under the condition that the first attempt was unsuccessful). An increase of this attribute value is a sign of problems in the hard disk mechanical subsystem.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.04658866433672694, 'error_interval': [0.03357701137320878, 0.06297433993055492] }, { 'low': 0, 'high': 80, 'annual_failure_rate': 0.5555555555555556, 'error_interval': [0.014065448880161053, 3.095357439410498] }, { 'low': 80, 'high': 160, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 160, 'high': 240, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 240, 'high': 320, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 320, 'high': 400, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 400, 'high': 480, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 480, 'high': 560, 'annual_failure_rate': 0, 'error_interval': [0, 0] }], 'display_type': 'raw' }, '12': { 'display_name': 'Power Cycle Count', 'ideal': 'low', 'critical': false, 'description': 'This attribute indicates the count of full hard disk power on/off cycles.', 'observed_thresholds': [{ 'low': 0, 'high': 13, 'annual_failure_rate': 0.019835987118930823, 'error_interval': [0.016560870164523494, 0.023569242386797896] }, { 'low': 13, 'high': 26, 'annual_failure_rate': 0.038210930067894826, 'error_interval': [0.03353859179329295, 0.0433520775718649] }, { 'low': 26, 'high': 39, 'annual_failure_rate': 0.11053528307302571, 'error_interval': [0.09671061589521368, 0.1257816678419765] }, { 'low': 39, 'high': 52, 'annual_failure_rate': 0.16831189443375036, 'error_interval': [0.1440976510675928, 0.19543066007594895] }, { 'low': 52, 'high': 65, 'annual_failure_rate': 0.20630344262550107, 'error_interval': [0.1693965932069108, 0.2488633537247856] }, { 'low': 65, 'high': 78, 'annual_failure_rate': 0.1030972634140512, 'error_interval': [0.06734655535304743, 0.15106137807407605] }, { 'low': 78, 'high': 91, 'annual_failure_rate': 0.12354840389522469, 'error_interval': [0.06578432170016109, 0.21127153335749593] }], 'display_type': 'raw' }, '13': { 'display_name': 'Soft Read Error Rate', 'ideal': 'low', 'critical': false, 'description': 'Uncorrected read errors reported to the operating system.', 'display_type': 'normalized' }, '170': { 'display_name': 'Available Reserved Space', 'ideal': '', 'critical': false, 'description': 'See attribute E8.', 'display_type': 'normalized' }, '171': { 'display_name': 'SSD Program Fail Count', 'ideal': '', 'critical': false, 'description': '(Kingston) The total number of flash program operation failures since the drive was deployed.[33] Identical to attribute 181.', 'display_type': 'normalized' }, '172': { 'display_name': 'SSD Erase Fail Count', 'ideal': '', 'critical': false, 'description': '(Kingston) Counts the number of flash erase failures. This attribute returns the total number of Flash erase operation failures since the drive was deployed. This attribute is identical to attribute 182.', 'display_type': 'normalized' }, '173': { 'display_name': 'SSD Wear Leveling Count', 'ideal': '', 'critical': false, 'description': 'Counts the maximum worst erase count on any block.', 'display_type': 'normalized' }, '174': { 'display_name': 'Unexpected Power Loss Count', 'ideal': '', 'critical': false, 'description': 'Also known as "Power-off Retract Count" per conventional HDD terminology. Raw value reports the number of unclean shutdowns, cumulative over the life of an SSD, where an "unclean shutdown" is the removal of power without STANDBY IMMEDIATE as the last command (regardless of PLI activity using capacitor power). Normalized value is always 100.', 'display_type': '' }, '175': { 'display_name': 'Power Loss Protection Failure', 'ideal': '', 'critical': false, 'description': 'Last test result as microseconds to discharge cap, saturated at its maximum value. Also logs minutes since last test and lifetime number of tests. Raw value contains the following data: Bytes 0-1: Last test result as microseconds to discharge cap, saturates at max value. Test result expected in range 25 \u003c= result \u003c= 5000000, lower indicates specific error code. Bytes 2-3: Minutes since last test, saturates at max value.Bytes 4-5: Lifetime number of tests, not incremented on power cycle, saturates at max value. Normalized value is set to one on test failure or 11 if the capacitor has been tested in an excessive temperature condition, otherwise 100.', 'display_type': 'normalized' }, '176': { 'display_name': 'Erase Fail Count', 'ideal': '', 'critical': false, 'description': 'S.M.A.R.T. parameter indicates a number of flash erase command failures.', 'display_type': 'normalized' }, '177': { 'display_name': 'Wear Range Delta', 'ideal': '', 'critical': false, 'description': 'Delta between most-worn and least-worn Flash blocks. It describes how good/bad the wearleveling of the SSD works on a more technical way. ', 'display_type': 'normalized' }, '179': { 'display_name': 'Used Reserved Block Count Total', 'ideal': '', 'critical': false, 'description': 'Pre-Fail attribute used at least in Samsung devices.', 'display_type': 'normalized' }, '180': { 'display_name': 'Unused Reserved Block Count Total', 'ideal': '', 'critical': false, 'description': '"Pre-Fail" attribute used at least in HP devices. ', 'display_type': 'normalized' }, '181': { 'display_name': 'Program Fail Count Total', 'ideal': '', 'critical': false, 'description': 'Total number of Flash program operation failures since the drive was deployed.', 'display_type': 'normalized' }, '182': { 'display_name': 'Erase Fail Count', 'ideal': '', 'critical': false, 'description': '"Pre-Fail" Attribute used at least in Samsung devices.', 'display_type': 'normalized' }, '183': { 'display_name': 'SATA Downshift Error Count or Runtime Bad Block', 'ideal': 'low', 'critical': false, 'description': 'Western Digital, Samsung or Seagate attribute: Either the number of downshifts of link speed (e.g. from 6Gbit/s to 3Gbit/s) or the total number of data blocks with detected, uncorrectable errors encountered during normal operation. Although degradation of this parameter can be an indicator of drive aging and/or potential electromechanical problems, it does not directly indicate imminent drive failure.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.09084549203210031, 'error_interval': [0.08344373475686712, 0.09872777224842152] }, { 'low': 1, 'high': 2, 'annual_failure_rate': 0.05756065656498585, 'error_interval': [0.04657000847949464, 0.07036491775108872] }, { 'low': 2, 'high': 4, 'annual_failure_rate': 0.6193088626208925, 'error_interval': [0.41784508895529787, 0.8841019099092139] }, { 'low': 4, 'high': 8, 'annual_failure_rate': 0.5533447034299792, 'error_interval': [0.31628430884775033, 0.8985971312402635] }, { 'low': 8, 'high': 16, 'annual_failure_rate': 0.3882388694727245, 'error_interval': [0.21225380267814295, 0.6513988534774338] }, { 'low': 16, 'high': 35, 'annual_failure_rate': 0.37116708385481856, 'error_interval': [0.19763084005134446, 0.6347070173754686] }, { 'low': 35, 'high': 70, 'annual_failure_rate': 0.2561146752205292, 'error_interval': [0.10297138269895259, 0.5276941165819332] }, { 'low': 70, 'high': 130, 'annual_failure_rate': 0.40299684542586756, 'error_interval': [0.16202563309223209, 0.8303275247667772] }, { 'low': 130, 'high': 260, 'annual_failure_rate': 0, 'error_interval': [0, 0] }], 'display_type': 'raw' }, '184': { 'display_name': 'End-to-End error', 'ideal': 'low', 'critical': true, 'description': 'This attribute is a part of Hewlett-Packard"s SMART IV technology, as well as part of other vendors" IO Error Detection and Correction schemas, and it contains a count of parity errors which occur in the data path to the media via the drive"s cache RAM', 'observed_thresholds': [{ 'low': 93, 'high': 94, 'annual_failure_rate': 1.631212012870933, 'error_interval': [1.055634407303844, 2.407990716767714] }, { 'low': 94, 'high': 95, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 95, 'high': 96, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 96, 'high': 97, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 97, 'high': 97, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 97, 'high': 98, 'annual_failure_rate': 1.8069306930693072, 'error_interval': [0.04574752432804858, 10.067573453924245] }, { 'low': 98, 'high': 99, 'annual_failure_rate': 0.8371559633027523, 'error_interval': [0.10138347095016888, 3.0240951820174824] }, { 'low': 99, 'high': 100, 'annual_failure_rate': 0.09334816849865138, 'error_interval': [0.08689499010435861, 0.10015372448181788] }], 'display_type': 'normalized' }, '185': { 'display_name': 'Head Stability', 'ideal': '', 'critical': false, 'description': 'Western Digital attribute.', 'display_type': 'normalized' }, '186': { 'display_name': 'Induced Op-Vibration Detection', 'ideal': '', 'critical': false, 'description': 'Western Digital attribute.', 'display_type': 'normalized' }, '187': { 'display_name': 'Reported Uncorrectable Errors', 'ideal': 'low', 'critical': true, 'description': 'The count of errors that could not be recovered using hardware ECC (see attribute 195).', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.028130798308190524, 'error_interval': [0.024487830609364304, 0.032162944988161336] }, { 'low': 1, 'high': 1, 'annual_failure_rate': 0.33877621175661743, 'error_interval': [0.22325565823630591, 0.4929016016666955] }, { 'low': 1, 'high': 3, 'annual_failure_rate': 0.24064820598237213, 'error_interval': [0.14488594021076606, 0.3758019832614595] }, { 'low': 3, 'high': 6, 'annual_failure_rate': 0.5014425058387142, 'error_interval': [0.3062941096766342, 0.7744372808405151] }, { 'low': 6, 'high': 11, 'annual_failure_rate': 0.38007108544136836, 'error_interval': [0.2989500188963677, 0.4764223967570595] }, { 'low': 11, 'high': 20, 'annual_failure_rate': 0.5346094598348444, 'error_interval': [0.40595137663302483, 0.6911066985735377] }, { 'low': 20, 'high': 35, 'annual_failure_rate': 0.8428063943161636, 'error_interval': [0.6504601819243522, 1.0742259350903411] }, { 'low': 35, 'high': 65, 'annual_failure_rate': 1.4429071005017484, 'error_interval': [1.1405581860945952, 1.8008133631629157] }, { 'low': 65, 'high': 120, 'annual_failure_rate': 1.6190935390549661, 'error_interval': [1.0263664163011208, 2.4294352761068576] }], 'display_type': 'raw' }, '188': { 'display_name': 'Command Timeout', 'ideal': 'low', 'critical': true, 'description': 'The count of aborted operations due to HDD timeout. Normally this attribute value should be equal to zero.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.024893587674442153, 'error_interval': [0.020857343769186413, 0.0294830350167543] }, { 'low': 0, 'high': 13, 'annual_failure_rate': 0.10044174089362015, 'error_interval': [0.0812633664077498, 0.1227848196758574] }, { 'low': 13, 'high': 26, 'annual_failure_rate': 0.334030592234279, 'error_interval': [0.2523231196342665, 0.4337665082489293] }, { 'low': 26, 'high': 39, 'annual_failure_rate': 0.36724705400842445, 'error_interval': [0.30398009356575617, 0.4397986538328568] }, { 'low': 39, 'high': 52, 'annual_failure_rate': 0.29848155926978354, 'error_interval': [0.2509254838615984, 0.35242890006477073] }, { 'low': 52, 'high': 65, 'annual_failure_rate': 0.2203079701535098, 'error_interval': [0.18366082845676174, 0.26212468677179274] }, { 'low': 65, 'high': 78, 'annual_failure_rate': 0.3018169948863018, 'error_interval': [0.23779746376787655, 0.37776897542831006] }, { 'low': 78, 'high': 91, 'annual_failure_rate': 0.32854928239235887, 'error_interval': [0.2301118782147336, 0.4548506948185028] }, { 'low': 91, 'high': 104, 'annual_failure_rate': 0.28488916640649387, 'error_interval': [0.1366154288236293, 0.5239213202729072] }], 'display_type': 'raw' }, '189': { 'display_name': 'High Fly Writes', 'ideal': 'low', 'critical': false, 'description': 'HDD manufacturers implement a flying height sensor that attempts to provide additional protections for write operations by detecting when a recording head is flying outside its normal operating range. If an unsafe fly height condition is encountered, the write process is stopped, and the information is rewritten or reallocated to a safe region of the hard drive. This attribute indicates the count of these errors detected over the lifetime of the drive.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.09070551401946862, 'error_interval': [0.08018892683853401, 0.10221801211956287] }, { 'low': 1, 'high': 2, 'annual_failure_rate': 0.0844336097370013, 'error_interval': [0.07299813695315267, 0.09715235540340669] }, { 'low': 2, 'high': 5, 'annual_failure_rate': 0.07943219628781906, 'error_interval': [0.06552176680630226, 0.09542233189887633] }, { 'low': 5, 'high': 13, 'annual_failure_rate': 0.09208847603893404, 'error_interval': [0.07385765060838133, 0.11345557807163456] }, { 'low': 13, 'high': 30, 'annual_failure_rate': 0.18161161650924224, 'error_interval': [0.13858879602902988, 0.23377015012749933] }, { 'low': 30, 'high': 70, 'annual_failure_rate': 0.2678117886102384, 'error_interval': [0.19044036194841887, 0.36610753129699186] }, { 'low': 70, 'high': 150, 'annual_failure_rate': 0.26126480798826107, 'error_interval': [0.15958733218826962, 0.4035023060905559] }, { 'low': 150, 'high': 350, 'annual_failure_rate': 0.11337164155924832, 'error_interval': [0.030889956621649995, 0.2902764300762812] }], 'display_type': 'raw' }, '190': { 'display_name': 'Temperature Difference', 'ideal': '', 'critical': false, 'description': 'Value is equal to (100-temp. °C), allowing manufacturer to set a minimum threshold which corresponds to a maximum temperature. This also follows the convention of 100 being a best-case value and lower values being undesirable. However, some older drives may instead report raw Temperature (identical to 0xC2) or Temperature minus 50 here.', 'display_type': 'normalized' }, '191': { 'display_name': 'G-sense Error Rate', 'ideal': 'low', 'critical': false, 'description': 'The count of errors resulting from externally induced shock and vibration. ', 'display_type': 'normalized' }, '192': { 'display_name': 'Power-off Retract Count', 'ideal': 'low', 'critical': false, 'description': 'Number of power-off or emergency retract cycles.', 'observed_thresholds': [{ 'low': 1, 'high': 2, 'annual_failure_rate': 0.02861098445412803, 'error_interval': [0.022345416230915037, 0.036088863823297186] }, { 'low': 2, 'high': 6, 'annual_failure_rate': 0.0738571777154862, 'error_interval': [0.06406927746420421, 0.0847175264009771] }, { 'low': 6, 'high': 16, 'annual_failure_rate': 0.11970378206823593, 'error_interval': [0.10830059875098269, 0.13198105985656441] }, { 'low': 16, 'high': 40, 'annual_failure_rate': 0.027266868552620425, 'error_interval': [0.021131448605713823, 0.03462795920968522] }, { 'low': 40, 'high': 100, 'annual_failure_rate': 0.011741682974559688, 'error_interval': [0.00430899071133239, 0.025556700631152028] }, { 'low': 100, 'high': 250, 'annual_failure_rate': 0.012659940134091309, 'error_interval': [0.00607093338127348, 0.023282080653656938] }, { 'low': 250, 'high': 650, 'annual_failure_rate': 0.01634692899031039, 'error_interval': [0.009522688540043157, 0.026173016865409605] }, { 'low': 650, 'high': 1600, 'annual_failure_rate': 0.005190074354440066, 'error_interval': [0.0025908664180103293, 0.009286476666453648] }], 'display_type': 'raw' }, '193': { 'display_name': 'Load Cycle Count', 'ideal': 'low', 'critical': false, 'description': 'Count of load/unload cycles into head landing zone position.[45] Some drives use 225 (0xE1) for Load Cycle Count instead.', 'display_type': 'normalized' }, '194': { 'display_name': 'Temperature', 'ideal': 'low', 'critical': false, 'description': 'Indicates the device temperature, if the appropriate sensor is fitted. Lowest byte of the raw value contains the exact temperature value (Celsius degrees).', 'transform_value_unit': '°C', 'display_type': 'transformed' }, '195': { 'display_name': 'Hardware ECC Recovered', 'ideal': '', 'critical': false, 'description': '(Vendor-specific raw value.) The raw value has different structure for different vendors and is often not meaningful as a decimal number.', 'observed_thresholds': [{ 'low': 12, 'high': 24, 'annual_failure_rate': 0.31472916829975706, 'error_interval': [0.15711166685282174, 0.5631374192486645] }, { 'low': 24, 'high': 36, 'annual_failure_rate': 0.15250310197260136, 'error_interval': [0.10497611828070175, 0.21417105521823687] }, { 'low': 36, 'high': 48, 'annual_failure_rate': 0.2193119102723874, 'error_interval': [0.16475385681835103, 0.28615447006525274] }, { 'low': 48, 'high': 60, 'annual_failure_rate': 0.05672658497265746, 'error_interval': [0.043182904776447234, 0.07317316161437043] }, { 'low': 60, 'high': 72, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 72, 'high': 84, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 84, 'high': 96, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 96, 'high': 108, 'annual_failure_rate': 0.04074570216566197, 'error_interval': [0.001031591863615295, 0.22702052218047528] }], 'display_type': 'normalized' }, '196': { 'display_name': 'Reallocation Event Count', 'ideal': 'low', 'critical': true, 'description': 'Count of remap operations. The raw value of this attribute shows the total count of attempts to transfer data from reallocated sectors to a spare area. Both successful and unsuccessful attempts are counted.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.007389855800729792, 'error_interval': [0.005652654139732716, 0.009492578928212054] }, { 'low': 1, 'high': 1, 'annual_failure_rate': 0.026558331312151347, 'error_interval': [0.005476966404484466, 0.07761471429677293] }, { 'low': 1, 'high': 2, 'annual_failure_rate': 0.02471894893674658, 'error_interval': [0.0006258296027540169, 0.13772516847438018] }, { 'low': 2, 'high': 4, 'annual_failure_rate': 0.03200912040691046, 'error_interval': [0.0008104007642081744, 0.17834340416493005] }, { 'low': 4, 'high': 7, 'annual_failure_rate': 0.043078012510326925, 'error_interval': [0.001090640849081295, 0.24001532369794615] }, { 'low': 7, 'high': 11, 'annual_failure_rate': 0.033843300880853036, 'error_interval': [0.0008568381932559863, 0.18856280368036135] }, { 'low': 11, 'high': 17, 'annual_failure_rate': 0.16979376647542252, 'error_interval': [0.035015556653263225, 0.49620943874336304] }, { 'low': 17, 'high': 27, 'annual_failure_rate': 0.059042381106438044, 'error_interval': [0.0014948236677880642, 0.32896309247698113] }, { 'low': 27, 'high': 45, 'annual_failure_rate': 0.24701105346266636, 'error_interval': [0.050939617608142244, 0.721871118983972] }], 'display_type': 'raw' }, '197': { 'display_name': 'Current Pending Sector Count', 'ideal': 'low', 'critical': true, 'description': 'Count of "unstable" sectors (waiting to be remapped, because of unrecoverable read errors). If an unstable sector is subsequently read successfully, the sector is remapped and this value is decreased. Read errors on a sector will not remap the sector immediately (since the correct value cannot be read and so the value to remap is not known, and also it might become readable later); instead, the drive firmware remembers that the sector needs to be remapped, and will remap it the next time it"s written.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.025540791394761345, 'error_interval': [0.023161777231213983, 0.02809784482748174] }, { 'low': 1, 'high': 2, 'annual_failure_rate': 0.34196613799103254, 'error_interval': [0.22723401523750225, 0.4942362818474496] }, { 'low': 2, 'high': 6, 'annual_failure_rate': 0.6823772508117681, 'error_interval': [0.41083568090070416, 1.0656166047061635] }, { 'low': 6, 'high': 16, 'annual_failure_rate': 0.6108100007493069, 'error_interval': [0.47336936083368364, 0.7757071095273286] }, { 'low': 16, 'high': 40, 'annual_failure_rate': 0.9564879341127684, 'error_interval': [0.7701044196378299, 1.174355230793638] }, { 'low': 40, 'high': 100, 'annual_failure_rate': 1.6519989942167461, 'error_interval': [1.328402276482456, 2.0305872327541317] }, { 'low': 100, 'high': 250, 'annual_failure_rate': 2.5137741046831956, 'error_interval': [1.9772427971560862, 3.1510376077891613] }, { 'low': 250, 'high': 650, 'annual_failure_rate': 3.3203378817413904, 'error_interval': [2.5883662702274406, 4.195047163573006] }, { 'low': 650, 'high': 1600, 'annual_failure_rate': 3.133047210300429, 'error_interval': [1.1497731080460096, 6.819324775707182] }], 'display_type': 'raw' }, '198': { 'display_name': '(Offline) Uncorrectable Sector Count', 'ideal': 'low', 'critical': true, 'description': 'The total count of uncorrectable errors when reading/writing a sector. A rise in the value of this attribute indicates defects of the disk surface and/or problems in the mechanical subsystem.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.028675322159886437, 'error_interval': [0.026159385510707116, 0.03136793218577656] }, { 'low': 0, 'high': 2, 'annual_failure_rate': 0.8135764944275583, 'error_interval': [0.40613445471964466, 1.4557130815309443] }, { 'low': 2, 'high': 4, 'annual_failure_rate': 1.1173469387755102, 'error_interval': [0.5773494680315332, 1.9517802404552516] }, { 'low': 4, 'high': 6, 'annual_failure_rate': 1.3558692421991083, 'error_interval': [0.4402470522980859, 3.1641465148237544] }, { 'low': 6, 'high': 8, 'annual_failure_rate': 0.7324414715719062, 'error_interval': [0.15104704003805655, 2.140504796291604] }, { 'low': 8, 'high': 10, 'annual_failure_rate': 0.5777213677766163, 'error_interval': [0.43275294849366835, 0.7556737733062419] }, { 'low': 10, 'high': 12, 'annual_failure_rate': 1.7464114832535886, 'error_interval': [0.47583835092536914, 4.471507017371231] }, { 'low': 12, 'high': 14, 'annual_failure_rate': 2.6449275362318843, 'error_interval': [0.3203129951758959, 9.554387676519005] }, { 'low': 14, 'high': 16, 'annual_failure_rate': 0.796943231441048, 'error_interval': [0.5519063550198366, 1.113648286331181] }], 'display_type': 'raw' }, '199': { 'display_name': 'UltraDMA CRC Error Count', 'ideal': 'low', 'critical': false, 'description': 'The count of errors in data transfer via the interface cable as determined by ICRC (Interface Cyclic Redundancy Check).', 'observed_thresholds': [{ 'low': 0, 'high': 1, 'annual_failure_rate': 0.04068379316116366, 'error_interval': [0.037534031558106425, 0.04402730201866553] }, { 'low': 1, 'high': 2, 'annual_failure_rate': 0.1513481259734218, 'error_interval': [0.12037165605991791, 0.18786293065527596] }, { 'low': 2, 'high': 4, 'annual_failure_rate': 0.16849758722418978, 'error_interval': [0.12976367397863445, 0.2151676572000481] }, { 'low': 4, 'high': 8, 'annual_failure_rate': 0.15385127340491614, 'error_interval': [0.10887431782430312, 0.21117289306426648] }, { 'low': 8, 'high': 16, 'annual_failure_rate': 0.14882894050104387, 'error_interval': [0.09631424312463635, 0.2197008753522735] }, { 'low': 16, 'high': 35, 'annual_failure_rate': 0.20878219917249793, 'error_interval': [0.14086447304552446, 0.29804957135975] }, { 'low': 35, 'high': 70, 'annual_failure_rate': 0.13742940270409038, 'error_interval': [0.06860426267470295, 0.24589916335290812] }, { 'low': 70, 'high': 130, 'annual_failure_rate': 0.22336578581363, 'error_interval': [0.11150339549604707, 0.39966309081252904] }, { 'low': 130, 'high': 260, 'annual_failure_rate': 0.18277416124186283, 'error_interval': [0.07890890989692058, 0.3601379610272007] }], 'display_type': 'raw' }, '2': { 'display_name': 'Throughput Performance', 'ideal': 'high', 'critical': false, 'description': 'Overall (general) throughput performance of a hard disk drive. If the value of this attribute is decreasing there is a high probability that there is a problem with the disk.', 'display_type': 'normalized' }, '200': { 'display_name': 'Multi-Zone Error Rate', 'ideal': 'low', 'critical': false, 'description': 'The count of errors found when writing a sector. The higher the value, the worse the disk"s mechanical condition is.', 'display_type': 'normalized' }, '201': { 'display_name': 'Soft Read Error Rate', 'ideal': 'low', 'critical': true, 'description': 'Count indicates the number of uncorrectable software read errors.', 'display_type': 'normalized' }, '202': { 'display_name': 'Data Address Mark errors', 'ideal': 'low', 'critical': false, 'description': 'Count of Data Address Mark errors (or vendor-specific).', 'display_type': 'normalized' }, '203': { 'display_name': 'Run Out Cancel', 'ideal': 'low', 'critical': false, 'description': 'The number of errors caused by incorrect checksum during the error correction.', 'display_type': 'normalized' }, '204': { 'display_name': 'Soft ECC Correction', 'ideal': 'low', 'critical': false, 'description': 'Count of errors corrected by the internal error correction software.', 'display_type': '' }, '205': { 'display_name': 'Thermal Asperity Rate', 'ideal': 'low', 'critical': false, 'description': 'Count of errors due to high temperature.', 'display_type': 'normalized' }, '206': { 'display_name': 'Flying Height', 'ideal': '', 'critical': false, 'description': 'Height of heads above the disk surface. If too low, head crash is more likely; if too high, read/write errors are more likely.', 'display_type': 'normalized' }, '207': { 'display_name': 'Spin High Current', 'ideal': 'low', 'critical': false, 'description': 'Amount of surge current used to spin up the drive.', 'display_type': 'normalized' }, '208': { 'display_name': 'Spin Buzz', 'ideal': '', 'critical': false, 'description': 'Count of buzz routines needed to spin up the drive due to insufficient power.', 'display_type': 'normalized' }, '209': { 'display_name': 'Offline Seek Performance', 'ideal': '', 'critical': false, 'description': 'Drive"s seek performance during its internal tests.', 'display_type': 'normalized' }, '210': { 'display_name': 'Vibration During Write', 'ideal': '', 'critical': false, 'description': 'Found in Maxtor 6B200M0 200GB and Maxtor 2R015H1 15GB disks.', 'display_type': 'normalized' }, '211': { 'display_name': 'Vibration During Write', 'ideal': '', 'critical': false, 'description': 'A recording of a vibration encountered during write operations.', 'display_type': 'normalized' }, '212': { 'display_name': 'Shock During Write', 'ideal': '', 'critical': false, 'description': 'A recording of shock encountered during write operations.', 'display_type': 'normalized' }, '22': { 'display_name': 'Current Helium Level', 'ideal': 'high', 'critical': false, 'description': 'Specific to He8 drives from HGST. This value measures the helium inside of the drive specific to this manufacturer. It is a pre-fail attribute that trips once the drive detects that the internal environment is out of specification.', 'display_type': 'normalized' }, '220': { 'display_name': 'Disk Shift', 'ideal': 'low', 'critical': false, 'description': 'Distance the disk has shifted relative to the spindle (usually due to shock or temperature). Unit of measure is unknown.', 'display_type': 'normalized' }, '221': { 'display_name': 'G-Sense Error Rate', 'ideal': 'low', 'critical': false, 'description': 'The count of errors resulting from externally induced shock and vibration.', 'display_type': 'normalized' }, '222': { 'display_name': 'Loaded Hours', 'ideal': '', 'critical': false, 'description': 'Time spent operating under data load (movement of magnetic head armature).', 'display_type': 'normalized' }, '223': { 'display_name': 'Load/Unload Retry Count', 'ideal': '', 'critical': false, 'description': 'Count of times head changes position.', 'display_type': 'normalized' }, '224': { 'display_name': 'Load Friction', 'ideal': 'low', 'critical': false, 'description': 'Resistance caused by friction in mechanical parts while operating.', 'display_type': 'normalized' }, '225': { 'display_name': 'Load/Unload Cycle Count', 'ideal': 'low', 'critical': false, 'description': 'Total count of load cycles Some drives use 193 (0xC1) for Load Cycle Count instead. See Description for 193 for significance of this number. ', 'display_type': 'normalized' }, '226': { 'display_name': 'Load "In"-time', 'ideal': '', 'critical': false, 'description': 'Total time of loading on the magnetic heads actuator (time not spent in parking area).', 'display_type': 'normalized' }, '227': { 'display_name': 'Torque Amplification Count', 'ideal': 'low', 'critical': false, 'description': 'Count of attempts to compensate for platter speed variations.[66]', 'display_type': '' }, '228': { 'display_name': 'Power-Off Retract Cycle', 'ideal': 'low', 'critical': false, 'description': 'The number of power-off cycles which are counted whenever there is a "retract event" and the heads are loaded off of the media such as when the machine is powered down, put to sleep, or is idle.', 'display_type': '' }, '230': { 'display_name': 'GMR Head Amplitude ', 'ideal': '', 'critical': false, 'description': 'Amplitude of "thrashing" (repetitive head moving motions between operations).', 'display_type': 'normalized' }, '231': { 'display_name': 'Life Left', 'ideal': '', 'critical': false, 'description': 'Indicates the approximate SSD life left, in terms of program/erase cycles or available reserved blocks. A normalized value of 100 represents a new drive, with a threshold value at 10 indicating a need for replacement. A value of 0 may mean that the drive is operating in read-only mode to allow data recovery.', 'display_type': 'normalized' }, '232': { 'display_name': 'Endurance Remaining', 'ideal': '', 'critical': false, 'description': 'Number of physical erase cycles completed on the SSD as a percentage of the maximum physical erase cycles the drive is designed to endure.', 'display_type': 'normalized' }, '233': { 'display_name': 'Media Wearout Indicator', 'ideal': '', 'critical': false, 'description': 'Intel SSDs report a normalized value from 100, a new drive, to a minimum of 1. It decreases while the NAND erase cycles increase from 0 to the maximum-rated cycles.', 'display_type': 'normalized' }, '234': { 'display_name': 'Average erase count', 'ideal': '', 'critical': false, 'description': 'Decoded as: byte 0-1-2 = average erase count (big endian) and byte 3-4-5 = max erase count (big endian).', 'display_type': 'normalized' }, '235': { 'display_name': 'Good Block Count', 'ideal': '', 'critical': false, 'description': 'Decoded as: byte 0-1-2 = good block count (big endian) and byte 3-4 = system (free) block count.', 'display_type': 'normalized' }, '240': { 'display_name': 'Head Flying Hours', 'ideal': '', 'critical': false, 'description': 'Time spent during the positioning of the drive heads.[15][71] Some Fujitsu drives report the count of link resets during a data transfer.', 'display_type': 'normalized' }, '241': { 'display_name': 'Total LBAs Written', 'ideal': '', 'critical': false, 'description': 'Total count of LBAs written.', 'display_type': 'normalized' }, '242': { 'display_name': 'Total LBAs Read', 'ideal': '', 'critical': false, 'description': 'Total count of LBAs read.Some S.M.A.R.T. utilities will report a negative number for the raw value since in reality it has 48 bits rather than 32.', 'display_type': 'normalized' }, '243': { 'display_name': 'Total LBAs Written Expanded', 'ideal': '', 'critical': false, 'description': 'The upper 5 bytes of the 12-byte total number of LBAs written to the device. The lower 7 byte value is located at attribute 0xF1.', 'display_type': 'normalized' }, '244': { 'display_name': 'Total LBAs Read Expanded', 'ideal': '', 'critical': false, 'description': 'The upper 5 bytes of the 12-byte total number of LBAs read from the device. The lower 7 byte value is located at attribute 0xF2.', 'display_type': 'normalized' }, '249': { 'display_name': 'NAND Writes (1GiB)', 'ideal': '', 'critical': false, 'description': 'Total NAND Writes. Raw value reports the number of writes to NAND in 1 GB increments.', 'display_type': 'normalized' }, '250': { 'display_name': 'Read Error Retry Rate', 'ideal': 'low', 'critical': false, 'description': 'Count of errors while reading from a disk.', 'display_type': 'normalized' }, '251': { 'display_name': 'Minimum Spares Remaining', 'ideal': '', 'critical': false, 'description': 'The Minimum Spares Remaining attribute indicates the number of remaining spare blocks as a percentage of the total number of spare blocks available.', 'display_type': 'normalized' }, '252': { 'display_name': 'Newly Added Bad Flash Block', 'ideal': '', 'critical': false, 'description': 'The Newly Added Bad Flash Block attribute indicates the total number of bad flash blocks the drive detected since it was first initialized in manufacturing.', 'display_type': 'normalized' }, '254': { 'display_name': 'Free Fall Protection', 'ideal': 'low', 'critical': false, 'description': 'Count of "Free Fall Events" detected.', 'display_type': 'normalized' }, '3': { 'display_name': 'Spin-Up Time', 'ideal': 'low', 'critical': false, 'description': 'Average time of spindle spin up (from zero RPM to fully operational [milliseconds]).', 'observed_thresholds': [{ 'low': 78, 'high': 96, 'annual_failure_rate': 0.11452195377351217, 'error_interval': [0.10591837762295722, 0.12363823501915781] }, { 'low': 96, 'high': 114, 'annual_failure_rate': 0.040274562840558074, 'error_interval': [0.03465055611002801, 0.046551312468303144] }, { 'low': 114, 'high': 132, 'annual_failure_rate': 0.009100406705780476, 'error_interval': [0.006530608971356785, 0.012345729280075591] }, { 'low': 132, 'high': 150, 'annual_failure_rate': 0.008561351734020232, 'error_interval': [0.004273795939256936, 0.015318623141355509] }, { 'low': 150, 'high': 168, 'annual_failure_rate': 0.015780508262068848, 'error_interval': [0.005123888078524015, 0.03682644215646287] }, { 'low': 168, 'high': 186, 'annual_failure_rate': 0.05262688124794024, 'error_interval': [0.0325768689524594, 0.08044577830285578] }, { 'low': 186, 'high': 204, 'annual_failure_rate': 0.01957419424036038, 'error_interval': [0.0023705257325185624, 0.0707087198669825] }, { 'low': 204, 'high': 222, 'annual_failure_rate': 0.026050959960031404, 'error_interval': [0.0006595532020744994, 0.1451466588889228] }], 'display_type': 'normalized' }, '4': { 'display_name': 'Start/Stop Count', 'ideal': '', 'critical': false, 'description': 'A tally of spindle start/stop cycles. The spindle turns on, and hence the count is increased, both when the hard disk is turned on after having before been turned entirely off (disconnected from power source) and when the hard disk returns from having previously been put to sleep mode.', 'observed_thresholds': [{ 'low': 0, 'high': 13, 'annual_failure_rate': 0.01989335424860646, 'error_interval': [0.016596548909440657, 0.023653263230617408] }, { 'low': 13, 'high': 26, 'annual_failure_rate': 0.03776935438256488, 'error_interval': [0.03310396052098642, 0.04290806173460437] }, { 'low': 26, 'high': 39, 'annual_failure_rate': 0.11022223828187004, 'error_interval': [0.09655110535164119, 0.12528657238811672] }, { 'low': 39, 'high': 52, 'annual_failure_rate': 0.16289995457762474, 'error_interval': [0.13926541653588131, 0.18939614504497515] }, { 'low': 52, 'high': 65, 'annual_failure_rate': 0.19358212432279714, 'error_interval': [0.15864522253849073, 0.23392418181765526] }, { 'low': 65, 'high': 78, 'annual_failure_rate': 0.1157094940074447, 'error_interval': [0.07861898732346269, 0.16424039052527728] }, { 'low': 78, 'high': 91, 'annual_failure_rate': 0.12262136155304391, 'error_interval': [0.0670382394080032, 0.20573780888032978] }, { 'low': 91, 'high': 104, 'annual_failure_rate': 0, 'error_interval': [0, 0] }], 'display_type': 'raw' }, '5': { 'display_name': 'Reallocated Sectors Count', 'ideal': 'low', 'critical': true, 'description': 'Count of reallocated sectors. The raw value represents a count of the bad sectors that have been found and remapped.Thus, the higher the attribute value, the more sectors the drive has had to reallocate. This value is primarily used as a metric of the life expectancy of the drive; a drive which has had any reallocations at all is significantly more likely to fail in the immediate months.', 'observed_thresholds': [{ 'low': 0, 'high': 0, 'annual_failure_rate': 0.025169175350572493, 'error_interval': [0.022768612038746357, 0.027753988579272894] }, { 'low': 1, 'high': 4, 'annual_failure_rate': 0.027432608477803388, 'error_interval': [0.010067283827589948, 0.05970923963096652] }, { 'low': 4, 'high': 16, 'annual_failure_rate': 0.07501976284584981, 'error_interval': [0.039944864177334186, 0.12828607921150972] }, { 'low': 16, 'high': 70, 'annual_failure_rate': 0.23589260654405794, 'error_interval': [0.1643078435800227, 0.32806951196017664] }, { 'low': 70, 'high': 260, 'annual_failure_rate': 0.36193219378600433, 'error_interval': [0.2608488901774093, 0.4892271827875412] }, { 'low': 260, 'high': 1100, 'annual_failure_rate': 0.5676621428968173, 'error_interval': [0.4527895568499355, 0.702804359408436] }, { 'low': 1100, 'high': 4500, 'annual_failure_rate': 1.5028253400346423, 'error_interval': [1.2681757596263297, 1.768305221795894] }, { 'low': 4500, 'high': 17000, 'annual_failure_rate': 2.0659987547404763, 'error_interval': [1.6809790460512237, 2.512808045182302] }, { 'low': 17000, 'high': 70000, 'annual_failure_rate': 1.7755385684503124, 'error_interval': [1.2796520259849835, 2.400012341226441] }], 'display_type': 'raw' }, '6': { 'display_name': 'Read Channel Margin', 'ideal': '', 'critical': false, 'description': 'Margin of a channel while reading data. The function of this attribute is not specified.', 'display_type': 'normalized' }, '7': { 'display_name': 'Seek Error Rate', 'ideal': '', 'critical': false, 'description': '(Vendor specific raw value.) Rate of seek errors of the magnetic heads. If there is a partial failure in the mechanical positioning system, then seek errors will arise. Such a failure may be due to numerous factors, such as damage to a servo, or thermal widening of the hard disk. The raw value has different structure for different vendors and is often not meaningful as a decimal number.', 'observed_thresholds': [{ 'low': 58, 'high': 76, 'annual_failure_rate': 0.2040131025936549, 'error_interval': [0.17032852883286412, 0.2424096283327138] }, { 'low': 76, 'high': 94, 'annual_failure_rate': 0.08725919610118257, 'error_interval': [0.08077138510999876, 0.09412943212007528] }, { 'low': 94, 'high': 112, 'annual_failure_rate': 0.01087335627722523, 'error_interval': [0.008732197944943352, 0.013380600544561905] }, { 'low': 112, 'high': 130, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 130, 'high': 148, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 148, 'high': 166, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 166, 'high': 184, 'annual_failure_rate': 0, 'error_interval': [0, 0] }, { 'low': 184, 'high': 202, 'annual_failure_rate': 0.05316285755900475, 'error_interval': [0.03370069132942804, 0.07977038905848267] }], 'display_type': 'normalized' }, '8': { 'display_name': 'Seek Time Performance', 'ideal': 'high', 'critical': false, 'description': 'Average performance of seek operations of the magnetic heads. If this attribute is decreasing, it is a sign of problems in the mechanical subsystem.', 'display_type': 'normalized' }, '9': { 'display_name': 'Power-On Hours', 'ideal': '', 'critical': false, 'description': 'Count of hours in power-on state. The raw value of this attribute shows total count of hours (or minutes, or seconds, depending on manufacturer) in power-on state. By default, the total expected lifetime of a hard disk in perfect condition is defined as 5 years (running every day and night on all days). This is equal to 1825 days in 24/7 mode or 43800 hours. On some pre-2005 drives, this raw value may advance erratically and/or "wrap around" (reset to zero periodically).', 'display_type': 'normalized' } }, 'success': true } ================================================ FILE: webapp/frontend/src/app/data/mock/device/details/sdd.ts ================================================ export const sdd = { 'data': { 'device': { 'CreatedAt': '2021-06-24T21:17:31.30374-07:00', 'UpdatedAt': '2021-10-24T16:37:57.013758-07:00', 'DeletedAt': null, 'wwn': '0x5000cca252c859cc', 'device_name': 'sdd', 'manufacturer': 'ATA', 'model_name': 'WDC_WD80EFAX-68LHPN0', 'interface_type': 'SCSI', 'interface_speed': '', 'serial_number': '7SGLXXXXX', 'firmware': '', 'rotational_speed': 0, 'capacity': 8001563222016, 'form_factor': '', 'smart_support': false, 'device_protocol': 'SCSI', 'device_type': '', 'label': '', 'host_id': '', 'device_status': 0 }, 'smart_results': [{ 'date': '2021-10-24T23:20:44Z', 'device_wwn': '0x5000cca252c859cc', 'device_protocol': 'SCSI', 'temp': 34, 'power_on_hours': 43549, 'power_cycle_count': 0, 'attrs': { 'read_correction_algorithm_invocations': { 'attribute_id': 'read_correction_algorithm_invocations', 'value': 0, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'read_errors_corrected_by_eccdelayed': { 'attribute_id': 'read_errors_corrected_by_eccdelayed', 'value': 0, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'read_errors_corrected_by_eccfast': { 'attribute_id': 'read_errors_corrected_by_eccfast', 'value': 300357663, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'read_errors_corrected_by_rereads_rewrites': { 'attribute_id': 'read_errors_corrected_by_rereads_rewrites', 'value': 0, 'thresh': 0, 'transformed_value': 0, 'status': 0 }, 'read_total_errors_corrected': { 'attribute_id': 'read_total_errors_corrected', 'value': 300357663, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'read_total_uncorrected_errors': { 'attribute_id': 'read_total_uncorrected_errors', 'value': 0, 'thresh': 0, 'transformed_value': 0, 'status': 0 }, 'scsi_grown_defect_list': { 'attribute_id': 'scsi_grown_defect_list', 'value': 56, 'thresh': 0, 'transformed_value': 0, 'status': 0 }, 'write_correction_algorithm_invocations': { 'attribute_id': 'write_correction_algorithm_invocations', 'value': 0, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'write_errors_corrected_by_eccdelayed': { 'attribute_id': 'write_errors_corrected_by_eccdelayed', 'value': 0, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'write_errors_corrected_by_eccfast': { 'attribute_id': 'write_errors_corrected_by_eccfast', 'value': 0, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'write_errors_corrected_by_rereads_rewrites': { 'attribute_id': 'write_errors_corrected_by_rereads_rewrites', 'value': 0, 'thresh': 0, 'transformed_value': 0, 'status': 0 }, 'write_total_errors_corrected': { 'attribute_id': 'write_total_errors_corrected', 'value': 0, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'write_total_uncorrected_errors': { 'attribute_id': 'write_total_uncorrected_errors', 'value': 0, 'thresh': 0, 'transformed_value': 0, 'status': 0 } }, 'Status': 0 }] }, 'metadata': { 'read_correction_algorithm_invocations': { 'display_name': 'Read Correction Algorithm Invocations', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'read_errors_corrected_by_eccdelayed': { 'display_name': 'Read Errors Corrected by ECC Delayed', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'read_errors_corrected_by_eccfast': { 'display_name': 'Read Errors Corrected by ECC Fast', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'read_errors_corrected_by_rereads_rewrites': { 'display_name': 'Read Errors Corrected by ReReads/ReWrites', 'ideal': 'low', 'critical': true, 'description': '', 'display_type': '' }, 'read_total_errors_corrected': { 'display_name': 'Read Total Errors Corrected', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'read_total_uncorrected_errors': { 'display_name': 'Read Total Uncorrected Errors', 'ideal': 'low', 'critical': true, 'description': '', 'display_type': '' }, 'scsi_grown_defect_list': { 'display_name': 'Grown Defect List', 'ideal': 'low', 'critical': true, 'description': '', 'display_type': '' }, 'write_correction_algorithm_invocations': { 'display_name': 'Write Correction Algorithm Invocations', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'write_errors_corrected_by_eccdelayed': { 'display_name': 'Write Errors Corrected by ECC Delayed', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'write_errors_corrected_by_eccfast': { 'display_name': 'Write Errors Corrected by ECC Fast', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'write_errors_corrected_by_rereads_rewrites': { 'display_name': 'Write Errors Corrected by ReReads/ReWrites', 'ideal': 'low', 'critical': true, 'description': '', 'display_type': '' }, 'write_total_errors_corrected': { 'display_name': 'Write Total Errors Corrected', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'write_total_uncorrected_errors': { 'display_name': 'Write Total Uncorrected Errors', 'ideal': 'low', 'critical': true, 'description': '', 'display_type': '' } }, 'success': true } ================================================ FILE: webapp/frontend/src/app/data/mock/device/details/sde.ts ================================================ export const sde = { 'data': { 'device': { 'CreatedAt': '2021-06-24T21:17:31.304461-07:00', 'UpdatedAt': '2021-10-24T16:40:16.495248-07:00', 'DeletedAt': null, 'wwn': '0x5000cca264ebc248', 'device_name': 'sde', 'manufacturer': 'ATA', 'model_name': 'WDC_WD140EDFZ-11A0VA0', 'interface_type': 'SCSI', 'interface_speed': '', 'serial_number': '9RK3XXXXX', 'firmware': '', 'rotational_speed': 0, 'capacity': 14000519643136, 'form_factor': '', 'smart_support': false, 'device_protocol': 'SCSI', 'device_type': '', 'label': '', 'host_id': '', 'device_status': 0 }, 'smart_results': [{ 'date': '2021-10-24T23:20:44Z', 'device_wwn': '0x5000cca264ebc248', 'device_protocol': 'SCSI', 'temp': 31, 'power_on_hours': 5675, 'power_cycle_count': 0, 'attrs': { 'read_correction_algorithm_invocations': { 'attribute_id': 'read_correction_algorithm_invocations', 'value': 0, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'read_errors_corrected_by_eccdelayed': { 'attribute_id': 'read_errors_corrected_by_eccdelayed', 'value': 0, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'read_errors_corrected_by_eccfast': { 'attribute_id': 'read_errors_corrected_by_eccfast', 'value': 1410362924, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'read_errors_corrected_by_rereads_rewrites': { 'attribute_id': 'read_errors_corrected_by_rereads_rewrites', 'value': 0, 'thresh': 0, 'transformed_value': 0, 'status': 0 }, 'read_total_errors_corrected': { 'attribute_id': 'read_total_errors_corrected', 'value': 1410362924, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'read_total_uncorrected_errors': { 'attribute_id': 'read_total_uncorrected_errors', 'value': 0, 'thresh': 0, 'transformed_value': 0, 'status': 0 }, 'scsi_grown_defect_list': { 'attribute_id': 'scsi_grown_defect_list', 'value': 0, 'thresh': 0, 'transformed_value': 0, 'status': 0 }, 'write_correction_algorithm_invocations': { 'attribute_id': 'write_correction_algorithm_invocations', 'value': 0, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'write_errors_corrected_by_eccdelayed': { 'attribute_id': 'write_errors_corrected_by_eccdelayed', 'value': 0, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'write_errors_corrected_by_eccfast': { 'attribute_id': 'write_errors_corrected_by_eccfast', 'value': 0, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'write_errors_corrected_by_rereads_rewrites': { 'attribute_id': 'write_errors_corrected_by_rereads_rewrites', 'value': 0, 'thresh': 0, 'transformed_value': 0, 'status': 0 }, 'write_total_errors_corrected': { 'attribute_id': 'write_total_errors_corrected', 'value': 0, 'thresh': -1, 'transformed_value': 0, 'status': 0 }, 'write_total_uncorrected_errors': { 'attribute_id': 'write_total_uncorrected_errors', 'value': 0, 'thresh': 0, 'transformed_value': 0, 'status': 0 } }, 'Status': 0 }] }, 'metadata': { 'read_correction_algorithm_invocations': { 'display_name': 'Read Correction Algorithm Invocations', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'read_errors_corrected_by_eccdelayed': { 'display_name': 'Read Errors Corrected by ECC Delayed', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'read_errors_corrected_by_eccfast': { 'display_name': 'Read Errors Corrected by ECC Fast', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'read_errors_corrected_by_rereads_rewrites': { 'display_name': 'Read Errors Corrected by ReReads/ReWrites', 'ideal': 'low', 'critical': true, 'description': '', 'display_type': '' }, 'read_total_errors_corrected': { 'display_name': 'Read Total Errors Corrected', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'read_total_uncorrected_errors': { 'display_name': 'Read Total Uncorrected Errors', 'ideal': 'low', 'critical': true, 'description': '', 'display_type': '' }, 'scsi_grown_defect_list': { 'display_name': 'Grown Defect List', 'ideal': 'low', 'critical': true, 'description': '', 'display_type': '' }, 'write_correction_algorithm_invocations': { 'display_name': 'Write Correction Algorithm Invocations', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'write_errors_corrected_by_eccdelayed': { 'display_name': 'Write Errors Corrected by ECC Delayed', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'write_errors_corrected_by_eccfast': { 'display_name': 'Write Errors Corrected by ECC Fast', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'write_errors_corrected_by_rereads_rewrites': { 'display_name': 'Write Errors Corrected by ReReads/ReWrites', 'ideal': 'low', 'critical': true, 'description': '', 'display_type': '' }, 'write_total_errors_corrected': { 'display_name': 'Write Total Errors Corrected', 'ideal': '', 'critical': false, 'description': '', 'display_type': '' }, 'write_total_uncorrected_errors': { 'display_name': 'Write Total Uncorrected Errors', 'ideal': 'low', 'critical': true, 'description': '', 'display_type': '' } }, 'success': true } ================================================ FILE: webapp/frontend/src/app/data/mock/device/details/sdf.ts ================================================ export const sdf = { 'data': { 'device': { 'CreatedAt': '2021-06-24T21:17:31.305246-07:00', 'UpdatedAt': '2021-06-24T21:17:31.305246-07:00', 'DeletedAt': null, 'wwn': '0x50014ee20b2a72a9', 'device_name': 'sdf', 'manufacturer': 'ATA', 'model_name': 'WDC_WD60EFRX-68MYMN1', 'interface_type': 'SCSI', 'interface_speed': '', 'serial_number': 'WD-WXL1HXXXXX', 'firmware': '', 'rotational_speed': 0, 'capacity': 6001175126016, 'form_factor': '', 'smart_support': false, 'device_protocol': '', 'device_type': '', 'label': '', 'host_id': '', 'device_status': 0 }, 'smart_results': [] }, 'metadata': null, 'success': true } ================================================ FILE: webapp/frontend/src/app/data/mock/index.ts ================================================ import { SummaryMockApi } from 'app/data/mock/summary'; import { DetailsMockApi } from 'app/data/mock/device/details'; export const mockDataServices = [ SummaryMockApi, DetailsMockApi, ]; ================================================ FILE: webapp/frontend/src/app/data/mock/summary/data.ts ================================================ import * as moment from 'moment'; /* tslint:disable:max-line-length */ export const summary = { 'data': { 'summary': { '0x5000c500673e6b5f': { 'device': { 'CreatedAt': '2021-04-30T08:17:13.155217-07:00', 'UpdatedAt': '2021-04-30T08:17:13.155217-07:00', 'DeletedAt': null, 'wwn': '0x5000c500673e6b5f', 'device_name': 'sdg', 'device_label': '14TB-WD-DRIVE2', 'device_uuid': '', 'device_serial_id': 'ata-ST6000DX000-1H217Z-Z4DXXXXX', 'manufacturer': 'ATA', 'model_name': 'ST6000DX000-1H217Z', 'interface_type': 'SCSI', 'interface_speed': '', 'serial_number': 'Z4DXXXXX', 'firmware': '', 'rotational_speed': 0, 'capacity': 6001175126016, 'form_factor': '', 'smart_support': false, 'device_protocol': '', 'device_type': '', 'label': '', 'host_id': '', 'device_status': 0, 'archived': false } }, '0x5000cca252c859cc': { 'device': { 'CreatedAt': '2021-04-30T08:17:13.152705-07:00', 'UpdatedAt': '2021-05-02T14:22:50.357164-07:00', 'DeletedAt': null, 'wwn': '0x5000cca252c859cc', 'device_name': 'sdd', 'device_label': '14TB-WD-DRIVE1', 'device_uuid': '806cf4bc-d160-4d96-8ee9-3ab7cf2a2e1f', 'device_serial_id': 'ata-WDC_WD80EFAX-68LHPN0-7SGLXXXXX', 'manufacturer': 'ATA', 'model_name': 'WDC_WD80EFAX-68LHPN0', 'interface_type': 'SCSI', 'interface_speed': '', 'serial_number': '7SGLXXXXX', 'firmware': '', 'rotational_speed': 0, 'capacity': 8001563222016, 'form_factor': '', 'smart_support': false, 'device_protocol': '', 'device_type': '', 'label': '', 'host_id': '', 'device_status': 0, 'archived': false }, 'smart': { 'collector_date': '2020-08-21T22:27:02Z', 'temp': 34, 'power_on_hours': 43549 }, 'temp_history': [{ 'date': '2020-08-21T22:27:02Z', 'temp': 34 }] }, '0x5000cca264eb01d7': { 'device': { 'CreatedAt': '2021-04-28T20:52:49.047154-07:00', 'UpdatedAt': '2021-05-02T14:22:49.86136-07:00', 'DeletedAt': null, 'wwn': '0x5000cca264eb01d7', 'device_name': 'sdb', 'device_label': '14TB-WD-DRIVE5', 'device_uuid': '8125ec6d-a7e4-4950-ac84-72d6a4d67128', 'device_serial_id': 'ata-WDC_WD140EDFZ-11A0VA0-9RK1XXXXX', 'manufacturer': 'ATA', 'model_name': 'WDC_WD140EDFZ-11A0VA0', 'interface_type': 'SCSI', 'interface_speed': '', 'serial_number': '9RK1XXXXX', 'firmware': '81.00A81', 'rotational_speed': 0, 'capacity': 14000519643136, 'form_factor': '', 'smart_support': false, 'device_protocol': '', 'device_type': '', 'label': '', 'host_id': '', 'device_status': 0, 'archived': false }, 'smart': { 'collector_date': '2020-06-21T00:03:30Z', 'temp': 32, 'power_on_hours': 1730 }, 'temp_history': [{ 'date': '2020-06-21T00:03:30Z', 'temp': 32 }] }, '0x5000cca264ebc248': { 'device': { 'CreatedAt': '2021-04-30T08:17:13.153782-07:00', 'UpdatedAt': '2021-05-02T14:22:50.385282-07:00', 'DeletedAt': null, 'wwn': '0x5000cca264ebc248', 'device_name': 'sde', 'device_label': '14TB-WD-DRIVE3', 'device_uuid': '9eb60cde-d6d0-4172-b520-b241a6a5477f', 'device_serial_id': 'ata-WDC_WD140EDFZ-11A0VA0-9RK3XXXXX', 'manufacturer': 'ATA', 'model_name': 'WDC_WD140EDFZ-11A0VA0', 'interface_type': 'SCSI', 'interface_speed': '', 'serial_number': '9RK3XXXXX', 'firmware': '', 'rotational_speed': 0, 'capacity': 14000519643136, 'form_factor': '', 'smart_support': false, 'device_protocol': '', 'device_type': '', 'label': '', 'host_id': '', 'device_status': 0, 'archived': false } }, '0x5000cca264ec3183': { 'device': { 'CreatedAt': '2021-04-30T08:17:13.151906-07:00', 'UpdatedAt': '2021-05-02T14:49:51.645012-07:00', 'DeletedAt': null, 'wwn': '0x5000cca264ec3183', 'device_name': 'sdc', 'device_label': '14TB-WD-DRIVE6', 'device_uuid': 'e1378723-7861-49b9-8e01-0bd063f0ecdd', 'device_serial_id': 'ata-WDC_WD140EDFZ-11A0VA0-9RK4XXXXX', 'manufacturer': 'ATA', 'model_name': 'WDC_WD140EDFZ-11A0VA0', 'interface_type': 'SCSI', 'interface_speed': '', 'serial_number': '9RK4XXXXX', 'firmware': 'RVT02B6Q', 'rotational_speed': 0, 'capacity': 14000519643136, 'form_factor': '', 'smart_support': false, 'device_protocol': '', 'device_type': '', 'label': '', 'host_id': 'custom host id', 'device_status': 1, 'archived': false }, 'smart': { 'collector_date': '2020-09-13T16:29:23Z', 'temp': 36, 'power_on_hours': 14551 }, 'temp_history': [{ 'date': '2020-07-08T13:48:23Z', 'temp': 25 }, { 'date': '2020-09-12T19:19:23Z', 'temp': 37 }, { 'date': '2020-09-12T19:29:23Z', 'temp': 37 }, { 'date': '2020-09-12T19:39:23Z', 'temp': 36 }, { 'date': '2020-09-12T19:49:23Z', 'temp': 36 }, { 'date': '2020-09-12T19:59:23Z', 'temp': 37 }, { 'date': '2020-09-12T20:09:23Z', 'temp': 37 }, { 'date': '2020-09-12T20:19:23Z', 'temp': 37 }, { 'date': '2020-09-12T20:29:23Z', 'temp': 37 }, { 'date': '2020-09-12T20:39:23Z', 'temp': 36 }, { 'date': '2020-09-12T20:49:23Z', 'temp': 36 }, { 'date': '2020-09-12T20:59:23Z', 'temp': 37 }, { 'date': '2020-09-12T21:09:23Z', 'temp': 36 }, { 'date': '2020-09-12T21:19:23Z', 'temp': 37 }, { 'date': '2020-09-12T21:29:23Z', 'temp': 38 }, { 'date': '2020-09-12T21:39:23Z', 'temp': 36 }, { 'date': '2020-09-12T21:49:23Z', 'temp': 36 }, { 'date': '2020-09-12T21:59:23Z', 'temp': 36 }, { 'date': '2020-09-12T22:09:23Z', 'temp': 36 }, { 'date': '2020-09-12T22:19:23Z', 'temp': 36 }, { 'date': '2020-09-12T22:29:23Z', 'temp': 36 }, { 'date': '2020-09-12T22:39:23Z', 'temp': 36 }, { 'date': '2020-09-12T22:49:23Z', 'temp': 36 }, { 'date': '2020-09-12T22:59:23Z', 'temp': 36 }, { 'date': '2020-09-12T23:09:23Z', 'temp': 36 }, { 'date': '2020-09-12T23:19:23Z', 'temp': 36 }, { 'date': '2020-09-12T23:29:23Z', 'temp': 36 }, { 'date': '2020-09-12T23:39:23Z', 'temp': 36 }, { 'date': '2020-09-12T23:49:23Z', 'temp': 36 }, { 'date': '2020-09-12T23:59:23Z', 'temp': 36 }, { 'date': '2020-09-13T00:09:23Z', 'temp': 36 }, { 'date': '2020-09-13T00:19:23Z', 'temp': 36 }, { 'date': '2020-09-13T00:29:23Z', 'temp': 37 }, { 'date': '2020-09-13T00:39:23Z', 'temp': 36 }, { 'date': '2020-09-13T00:49:23Z', 'temp': 36 }, { 'date': '2020-09-13T00:59:23Z', 'temp': 36 }, { 'date': '2020-09-13T01:09:23Z', 'temp': 36 }, { 'date': '2020-09-13T01:19:23Z', 'temp': 36 }, { 'date': '2020-09-13T01:29:23Z', 'temp': 37 }, { 'date': '2020-09-13T01:39:23Z', 'temp': 36 }, { 'date': '2020-09-13T01:49:23Z', 'temp': 37 }, { 'date': '2020-09-13T01:59:23Z', 'temp': 37 }, { 'date': '2020-09-13T02:09:23Z', 'temp': 37 }, { 'date': '2020-09-13T02:19:23Z', 'temp': 37 }, { 'date': '2020-09-13T02:29:23Z', 'temp': 38 }, { 'date': '2020-09-13T02:39:23Z', 'temp': 37 }, { 'date': '2020-09-13T02:49:23Z', 'temp': 37 }, { 'date': '2020-09-13T02:59:23Z', 'temp': 38 }, { 'date': '2020-09-13T03:09:23Z', 'temp': 38 }, { 'date': '2020-09-13T03:19:23Z', 'temp': 38 }, { 'date': '2020-09-13T03:29:23Z', 'temp': 38 }, { 'date': '2020-09-13T03:39:23Z', 'temp': 38 }, { 'date': '2020-09-13T03:49:23Z', 'temp': 38 }, { 'date': '2020-09-13T03:59:23Z', 'temp': 38 }, { 'date': '2020-09-13T04:09:23Z', 'temp': 38 }, { 'date': '2020-09-13T04:19:23Z', 'temp': 38 }, { 'date': '2020-09-13T04:29:23Z', 'temp': 38 }, { 'date': '2020-09-13T04:39:23Z', 'temp': 38 }, { 'date': '2020-09-13T04:49:23Z', 'temp': 38 }, { 'date': '2020-09-13T04:59:23Z', 'temp': 38 }, { 'date': '2020-09-13T05:09:23Z', 'temp': 37 }, { 'date': '2020-09-13T05:19:23Z', 'temp': 38 }, { 'date': '2020-09-13T05:29:23Z', 'temp': 39 }, { 'date': '2020-09-13T05:39:23Z', 'temp': 41 }, { 'date': '2020-09-13T05:49:23Z', 'temp': 42 }, { 'date': '2020-09-13T05:59:23Z', 'temp': 41 }, { 'date': '2020-09-13T06:09:23Z', 'temp': 41 }, { 'date': '2020-09-13T06:19:23Z', 'temp': 42 }, { 'date': '2020-09-13T06:29:23Z', 'temp': 41 }, { 'date': '2020-09-13T06:39:23Z', 'temp': 41 }, { 'date': '2020-09-13T06:49:23Z', 'temp': 41 }, { 'date': '2020-09-13T06:59:23Z', 'temp': 41 }, { 'date': '2020-09-13T07:09:23Z', 'temp': 40 }, { 'date': '2020-09-13T07:19:23Z', 'temp': 40 }, { 'date': '2020-09-13T07:29:23Z', 'temp': 41 }, { 'date': '2020-09-13T07:39:23Z', 'temp': 43 }, { 'date': '2020-09-13T07:49:23Z', 'temp': 42 }, { 'date': '2020-09-13T07:59:23Z', 'temp': 41 }, { 'date': '2020-09-13T08:09:23Z', 'temp': 42 }, { 'date': '2020-09-13T08:19:23Z', 'temp': 42 }, { 'date': '2020-09-13T08:29:23Z', 'temp': 41 }, { 'date': '2020-09-13T08:39:23Z', 'temp': 39 }, { 'date': '2020-09-13T08:49:23Z', 'temp': 38 }, { 'date': '2020-09-13T08:59:23Z', 'temp': 38 }, { 'date': '2020-09-13T09:09:23Z', 'temp': 38 }, { 'date': '2020-09-13T09:19:23Z', 'temp': 39 }, { 'date': '2020-09-13T09:29:23Z', 'temp': 39 }, { 'date': '2020-09-13T09:39:23Z', 'temp': 39 }, { 'date': '2020-09-13T09:49:23Z', 'temp': 39 }, { 'date': '2020-09-13T09:59:23Z', 'temp': 39 }, { 'date': '2020-09-13T10:09:23Z', 'temp': 39 }, { 'date': '2020-09-13T10:19:23Z', 'temp': 39 }, { 'date': '2020-09-13T10:29:23Z', 'temp': 39 }, { 'date': '2020-09-13T10:39:23Z', 'temp': 39 }, { 'date': '2020-09-13T10:49:23Z', 'temp': 39 }, { 'date': '2020-09-13T10:59:23Z', 'temp': 39 }, { 'date': '2020-09-13T11:09:23Z', 'temp': 38 }, { 'date': '2020-09-13T11:19:23Z', 'temp': 38 }, { 'date': '2020-09-13T11:29:23Z', 'temp': 38 }, { 'date': '2020-09-13T11:39:23Z', 'temp': 38 }, { 'date': '2020-09-13T11:49:23Z', 'temp': 38 }, { 'date': '2020-09-13T11:59:23Z', 'temp': 38 }, { 'date': '2020-09-13T12:09:23Z', 'temp': 38 }, { 'date': '2020-09-13T12:19:23Z', 'temp': 38 }, { 'date': '2020-09-13T12:29:23Z', 'temp': 39 }, { 'date': '2020-09-13T12:39:23Z', 'temp': 39 }, { 'date': '2020-09-13T12:49:23Z', 'temp': 39 }, { 'date': '2020-09-13T12:59:23Z', 'temp': 39 }, { 'date': '2020-09-13T13:09:23Z', 'temp': 39 }, { 'date': '2020-09-13T13:19:23Z', 'temp': 39 }, { 'date': '2020-09-13T13:29:23Z', 'temp': 39 }, { 'date': '2020-09-13T13:39:23Z', 'temp': 39 }, { 'date': '2020-09-13T13:49:23Z', 'temp': 39 }, { 'date': '2020-09-13T13:59:23Z', 'temp': 39 }, { 'date': '2020-09-13T14:09:23Z', 'temp': 39 }, { 'date': '2020-09-13T14:19:23Z', 'temp': 39 }, { 'date': '2020-09-13T14:29:23Z', 'temp': 39 }, { 'date': '2020-09-13T14:39:23Z', 'temp': 39 }, { 'date': '2020-09-13T14:49:23Z', 'temp': 39 }, { 'date': '2020-09-13T14:59:23Z', 'temp': 39 }, { 'date': '2020-09-13T15:09:23Z', 'temp': 39 }, { 'date': '2020-09-13T15:19:23Z', 'temp': 40 }, { 'date': '2020-09-13T15:29:23Z', 'temp': 40 }, { 'date': '2020-09-13T15:39:23Z', 'temp': 40 }, { 'date': '2020-09-13T15:49:23Z', 'temp': 39 }, { 'date': '2020-09-13T15:59:23Z', 'temp': 39 }, { 'date': '2020-09-13T16:09:23Z', 'temp': 39 }, { 'date': '2020-09-13T16:19:23Z', 'temp': 39 }, { 'date': '2020-09-13T16:29:23Z', 'temp': 39 }] }, '0x50014ee20b2a72a9': { 'device': { 'CreatedAt': '2021-04-30T08:17:13.15451-07:00', 'UpdatedAt': '2021-04-30T08:17:13.15451-07:00', 'DeletedAt': null, 'wwn': '0x50014ee20b2a72a9', 'device_name': 'sdf', 'device_label': '8.0TB-WD-4', 'device_uuid': 'fc684dcc-aa2f-44f3-a958-d302dc7dd46d', 'device_serial_id': 'ata-WDC_WD60EFRX-68MYMN1-WXL1HXXXXX', 'manufacturer': 'ATA', 'model_name': 'WDC_WD60EFRX-68MYMN1', 'interface_type': 'SCSI', 'interface_speed': '', 'serial_number': 'WD-WXL1HXXXXX', 'firmware': '', 'rotational_speed': 0, 'capacity': 6001175126016, 'form_factor': '', 'smart_support': false, 'device_protocol': '', 'device_type': '', 'label': '', 'host_id': '', 'device_status': 0, 'archived': false } }, '0x5002538e40a22954': { 'device': { 'CreatedAt': '2021-04-30T08:17:13.150792-07:00', 'UpdatedAt': '2021-05-02T14:22:50.330706-07:00', 'DeletedAt': null, 'wwn': '0x5002538e40a22954', 'device_name': 'sda', 'device_label': '', 'device_uuid': '', 'device_serial_id': 'ata-Samsung_SSD_860_EVO_500GB-S3YZNB0KBXXXXXX', 'manufacturer': 'ATA', 'model_name': 'Samsung_SSD_860_EVO_500GB', 'interface_type': 'SCSI', 'interface_speed': '', 'serial_number': 'S3YZNB0KBXXXXXX', 'firmware': '002C', 'rotational_speed': 0, 'capacity': 500107862016, 'form_factor': '', 'smart_support': false, 'device_protocol': '', 'device_type': '', 'label': '', 'host_id': '', 'device_status': 0, 'archived': false }, 'smart': { 'collector_date': '2020-06-10T12:01:02Z', 'temp': 36, 'power_on_hours': 2401 }, 'temp_history': [{ 'date': '2020-06-10T12:01:02Z', 'temp': 36 }] } } }, 'success': true } ================================================ FILE: webapp/frontend/src/app/data/mock/summary/index.ts ================================================ import { Injectable } from '@angular/core'; import * as _ from 'lodash'; import { TreoMockApi } from '@treo/lib/mock-api/mock-api.interfaces'; import { TreoMockApiService } from '@treo/lib/mock-api/mock-api.service'; import { summary as summaryData } from 'app/data/mock/summary/data'; @Injectable({ providedIn: 'root' }) export class SummaryMockApi implements TreoMockApi { // Private private _summary: any; /** * Constructor * * @param _treoMockApiService */ constructor( private _treoMockApiService: TreoMockApiService ) { // Set the data this._summary = summaryData; // Register the API endpoints this.register(); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Register */ register(): void { // ----------------------------------------------------------------------------------------------------- // @ Sales - GET // ----------------------------------------------------------------------------------------------------- this._treoMockApiService .onGet('/api/summary') .reply(() => { return [ 200, _.cloneDeep(this._summary) ]; }); } } ================================================ FILE: webapp/frontend/src/app/data/mock/summary/temp_history.ts ================================================ /* tslint:disable */ export const temp_history = { "data": { "temp_history": { "0x5000cca252c859cc": [{ "date": "2022-07-01T22:00:00Z", "temp": 36 }, { "date": "2022-07-01T23:00:00Z", "temp": 36 }, { "date": "2022-07-02T00:00:00Z", "temp": 36 }, { "date": "2022-07-02T01:00:00Z", "temp": 36 }, { "date": "2022-07-02T22:00:00Z", "temp": 36 }, { "date": "2022-07-02T23:00:00Z", "temp": 36 }, { "date": "2022-07-03T00:00:00Z", "temp": 36 }, { "date": "2022-07-03T01:00:00Z", "temp": 36 }, { "date": "2022-07-03T22:00:00Z", "temp": 42 }, { "date": "2022-07-03T23:00:00Z", "temp": 42 }, { "date": "2022-07-04T00:00:00Z", "temp": 42 }, { "date": "2022-07-04T01:00:00Z", "temp": 42 }, { "date": "2022-07-04T22:00:00Z", "temp": 37 }, { "date": "2022-07-04T23:00:00Z", "temp": 36 }, { "date": "2022-07-05T00:00:00Z", "temp": 36 }, { "date": "2022-07-05T01:00:00Z", "temp": 37 }, { "date": "2022-07-05T22:00:00Z", "temp": 37 }, { "date": "2022-07-05T23:00:00Z", "temp": 37 }, { "date": "2022-07-06T00:00:00Z", "temp": 37 }, { "date": "2022-07-06T01:00:00Z", "temp": 37 }, { "date": "2022-07-06T04:00:00Z", "temp": 37 }, { "date": "2022-07-06T05:00:00Z", "temp": 37 }, { "date": "2022-07-06T06:00:00Z", "temp": 37 }, { "date": "2022-07-06T22:00:00Z", "temp": 38 }, { "date": "2022-07-06T23:00:00Z", "temp": 38 }, { "date": "2022-07-07T00:00:00Z", "temp": 38 }, { "date": "2022-07-07T01:00:00Z", "temp": 38 }, { "date": "2022-07-07T03:00:00Z", "temp": 37 }, { "date": "2022-07-07T04:00:00Z", "temp": 37 }, { "date": "2022-07-07T05:00:00Z", "temp": 37 }, { "date": "2022-07-07T06:00:00Z", "temp": 37 }, { "date": "2022-07-07T07:00:00Z", "temp": 38 }, { "date": "2022-07-07T22:00:00Z", "temp": 37 }, { "date": "2022-07-07T23:00:00Z", "temp": 37 }, { "date": "2022-07-08T00:00:00Z", "temp": 37 }, { "date": "2022-07-08T01:00:00Z", "temp": 37 }, { "date": "2022-07-08T13:00:00Z", "temp": 35 }, { "date": "2022-07-08T14:00:00Z", "temp": 35 }, { "date": "2022-07-08T15:00:00Z", "temp": 35 }], "0x5000cca264eb01d7": [{ "date": "2022-07-01T22:00:00Z", "temp": 42 }, { "date": "2022-07-01T23:00:00Z", "temp": 39 }, { "date": "2022-07-02T00:00:00Z", "temp": 39 }, { "date": "2022-07-02T01:00:00Z", "temp": 39 }, { "date": "2022-07-02T22:00:00Z", "temp": 41 }, { "date": "2022-07-02T23:00:00Z", "temp": 39 }, { "date": "2022-07-03T00:00:00Z", "temp": 39 }, { "date": "2022-07-03T01:00:00Z", "temp": 40 }, { "date": "2022-07-03T22:00:00Z", "temp": 44 }, { "date": "2022-07-03T23:00:00Z", "temp": 42 }, { "date": "2022-07-04T00:00:00Z", "temp": 41 }, { "date": "2022-07-04T01:00:00Z", "temp": 41 }, { "date": "2022-07-04T22:00:00Z", "temp": 41 }, { "date": "2022-07-04T23:00:00Z", "temp": 42 }, { "date": "2022-07-05T00:00:00Z", "temp": 40 }, { "date": "2022-07-05T01:00:00Z", "temp": 41 }, { "date": "2022-07-05T22:00:00Z", "temp": 40 }, { "date": "2022-07-05T23:00:00Z", "temp": 40 }, { "date": "2022-07-06T00:00:00Z", "temp": 40 }, { "date": "2022-07-06T01:00:00Z", "temp": 40 }, { "date": "2022-07-06T04:00:00Z", "temp": 42 }, { "date": "2022-07-06T05:00:00Z", "temp": 45 }, { "date": "2022-07-06T06:00:00Z", "temp": 44 }, { "date": "2022-07-06T22:00:00Z", "temp": 41 }, { "date": "2022-07-06T23:00:00Z", "temp": 41 }, { "date": "2022-07-07T00:00:00Z", "temp": 41 }, { "date": "2022-07-07T01:00:00Z", "temp": 41 }, { "date": "2022-07-07T03:00:00Z", "temp": 41 }, { "date": "2022-07-07T04:00:00Z", "temp": 41 }, { "date": "2022-07-07T05:00:00Z", "temp": 41 }, { "date": "2022-07-07T06:00:00Z", "temp": 42 }, { "date": "2022-07-07T07:00:00Z", "temp": 42 }, { "date": "2022-07-07T22:00:00Z", "temp": 40 }, { "date": "2022-07-07T23:00:00Z", "temp": 40 }, { "date": "2022-07-08T00:00:00Z", "temp": 40 }, { "date": "2022-07-08T01:00:00Z", "temp": 40 }, { "date": "2022-07-08T13:00:00Z", "temp": 39 }, { "date": "2022-07-08T14:00:00Z", "temp": 39 }, { "date": "2022-07-08T15:00:00Z", "temp": 39 }], "0x5000cca264ebc248": [{ "date": "2022-07-01T22:00:00Z", "temp": 36 }, { "date": "2022-07-01T23:00:00Z", "temp": 34 }, { "date": "2022-07-02T00:00:00Z", "temp": 33 }, { "date": "2022-07-02T01:00:00Z", "temp": 33 }, { "date": "2022-07-02T22:00:00Z", "temp": 35 }, { "date": "2022-07-02T23:00:00Z", "temp": 34 }, { "date": "2022-07-03T00:00:00Z", "temp": 33 }, { "date": "2022-07-03T01:00:00Z", "temp": 33 }, { "date": "2022-07-03T22:00:00Z", "temp": 37 }, { "date": "2022-07-03T23:00:00Z", "temp": 37 }, { "date": "2022-07-04T00:00:00Z", "temp": 33 }, { "date": "2022-07-04T01:00:00Z", "temp": 33 }, { "date": "2022-07-04T22:00:00Z", "temp": 35 }, { "date": "2022-07-04T23:00:00Z", "temp": 35 }, { "date": "2022-07-05T00:00:00Z", "temp": 35 }, { "date": "2022-07-05T01:00:00Z", "temp": 35 }, { "date": "2022-07-05T22:00:00Z", "temp": 36 }, { "date": "2022-07-05T23:00:00Z", "temp": 35 }, { "date": "2022-07-06T00:00:00Z", "temp": 35 }, { "date": "2022-07-06T01:00:00Z", "temp": 36 }, { "date": "2022-07-06T04:00:00Z", "temp": 38 }, { "date": "2022-07-06T05:00:00Z", "temp": 39 }, { "date": "2022-07-06T06:00:00Z", "temp": 38 }, { "date": "2022-07-06T22:00:00Z", "temp": 35 }, { "date": "2022-07-06T23:00:00Z", "temp": 35 }, { "date": "2022-07-07T00:00:00Z", "temp": 35 }, { "date": "2022-07-07T01:00:00Z", "temp": 35 }, { "date": "2022-07-07T03:00:00Z", "temp": 38 }, { "date": "2022-07-07T04:00:00Z", "temp": 36 }, { "date": "2022-07-07T05:00:00Z", "temp": 35 }, { "date": "2022-07-07T06:00:00Z", "temp": 37 }, { "date": "2022-07-07T07:00:00Z", "temp": 36 }, { "date": "2022-07-07T22:00:00Z", "temp": 34 }, { "date": "2022-07-07T23:00:00Z", "temp": 34 }, { "date": "2022-07-08T00:00:00Z", "temp": 34 }, { "date": "2022-07-08T01:00:00Z", "temp": 34 }, { "date": "2022-07-08T13:00:00Z", "temp": 33 }, { "date": "2022-07-08T14:00:00Z", "temp": 33 }, { "date": "2022-07-08T15:00:00Z", "temp": 33 }], "0x5000cca264ec3183": [{ "date": "2022-07-01T22:00:00Z", "temp": 39 }, { "date": "2022-07-01T23:00:00Z", "temp": 38 }, { "date": "2022-07-02T00:00:00Z", "temp": 37 }, { "date": "2022-07-02T01:00:00Z", "temp": 37 }, { "date": "2022-07-02T22:00:00Z", "temp": 39 }, { "date": "2022-07-02T23:00:00Z", "temp": 37 }, { "date": "2022-07-03T00:00:00Z", "temp": 39 }, { "date": "2022-07-03T01:00:00Z", "temp": 40 }, { "date": "2022-07-03T22:00:00Z", "temp": 40 }, { "date": "2022-07-03T23:00:00Z", "temp": 39 }, { "date": "2022-07-04T00:00:00Z", "temp": 38 }, { "date": "2022-07-04T01:00:00Z", "temp": 38 }, { "date": "2022-07-04T22:00:00Z", "temp": 38 }, { "date": "2022-07-04T23:00:00Z", "temp": 39 }, { "date": "2022-07-05T00:00:00Z", "temp": 38 }, { "date": "2022-07-05T01:00:00Z", "temp": 38 }, { "date": "2022-07-05T22:00:00Z", "temp": 38 }, { "date": "2022-07-05T23:00:00Z", "temp": 38 }, { "date": "2022-07-06T00:00:00Z", "temp": 38 }, { "date": "2022-07-06T01:00:00Z", "temp": 38 }, { "date": "2022-07-06T04:00:00Z", "temp": 41 }, { "date": "2022-07-06T05:00:00Z", "temp": 42 }, { "date": "2022-07-06T06:00:00Z", "temp": 40 }, { "date": "2022-07-06T22:00:00Z", "temp": 39 }, { "date": "2022-07-06T23:00:00Z", "temp": 39 }, { "date": "2022-07-07T00:00:00Z", "temp": 39 }, { "date": "2022-07-07T01:00:00Z", "temp": 39 }, { "date": "2022-07-07T03:00:00Z", "temp": 40 }, { "date": "2022-07-07T04:00:00Z", "temp": 40 }, { "date": "2022-07-07T05:00:00Z", "temp": 39 }, { "date": "2022-07-07T06:00:00Z", "temp": 40 }, { "date": "2022-07-07T07:00:00Z", "temp": 41 }, { "date": "2022-07-07T22:00:00Z", "temp": 38 }, { "date": "2022-07-07T23:00:00Z", "temp": 38 }, { "date": "2022-07-08T00:00:00Z", "temp": 38 }, { "date": "2022-07-08T01:00:00Z", "temp": 38 }, { "date": "2022-07-08T13:00:00Z", "temp": 37 }, { "date": "2022-07-08T14:00:00Z", "temp": 37 }, { "date": "2022-07-08T15:00:00Z", "temp": 37 }], "0x5000cca28ed7fcd8": [{ "date": "2022-07-01T22:00:00Z", "temp": 36 }, { "date": "2022-07-01T23:00:00Z", "temp": 34 }, { "date": "2022-07-02T00:00:00Z", "temp": 34 }, { "date": "2022-07-02T01:00:00Z", "temp": 34 }, { "date": "2022-07-02T22:00:00Z", "temp": 35 }, { "date": "2022-07-02T23:00:00Z", "temp": 34 }, { "date": "2022-07-03T00:00:00Z", "temp": 33 }, { "date": "2022-07-03T01:00:00Z", "temp": 33 }, { "date": "2022-07-03T22:00:00Z", "temp": 36 }, { "date": "2022-07-03T23:00:00Z", "temp": 36 }, { "date": "2022-07-04T00:00:00Z", "temp": 33 }, { "date": "2022-07-04T01:00:00Z", "temp": 33 }, { "date": "2022-07-04T22:00:00Z", "temp": 39 }, { "date": "2022-07-04T23:00:00Z", "temp": 39 }, { "date": "2022-07-05T00:00:00Z", "temp": 39 }, { "date": "2022-07-05T01:00:00Z", "temp": 39 }, { "date": "2022-07-05T22:00:00Z", "temp": 40 }, { "date": "2022-07-05T23:00:00Z", "temp": 40 }, { "date": "2022-07-06T00:00:00Z", "temp": 40 }, { "date": "2022-07-06T01:00:00Z", "temp": 40 }, { "date": "2022-07-06T04:00:00Z", "temp": 38 }, { "date": "2022-07-06T05:00:00Z", "temp": 38 }, { "date": "2022-07-06T06:00:00Z", "temp": 36 }, { "date": "2022-07-06T22:00:00Z", "temp": 36 }, { "date": "2022-07-06T23:00:00Z", "temp": 35 }, { "date": "2022-07-07T00:00:00Z", "temp": 36 }, { "date": "2022-07-07T01:00:00Z", "temp": 36 }, { "date": "2022-07-07T03:00:00Z", "temp": 38 }, { "date": "2022-07-07T04:00:00Z", "temp": 37 }, { "date": "2022-07-07T05:00:00Z", "temp": 36 }, { "date": "2022-07-07T06:00:00Z", "temp": 39 }, { "date": "2022-07-07T07:00:00Z", "temp": 37 }, { "date": "2022-07-07T22:00:00Z", "temp": 34 }, { "date": "2022-07-07T23:00:00Z", "temp": 35 }, { "date": "2022-07-08T00:00:00Z", "temp": 34 }, { "date": "2022-07-08T01:00:00Z", "temp": 34 }, { "date": "2022-07-08T13:00:00Z", "temp": 33 }, { "date": "2022-07-08T14:00:00Z", "temp": 34 }, { "date": "2022-07-08T15:00:00Z", "temp": 34 }], "0x5000cca28fc25581": [{ "date": "2022-07-01T22:00:00Z", "temp": 39 }, { "date": "2022-07-01T23:00:00Z", "temp": 38 }, { "date": "2022-07-02T00:00:00Z", "temp": 38 }, { "date": "2022-07-02T01:00:00Z", "temp": 38 }, { "date": "2022-07-02T22:00:00Z", "temp": 39 }, { "date": "2022-07-02T23:00:00Z", "temp": 39 }, { "date": "2022-07-03T00:00:00Z", "temp": 39 }, { "date": "2022-07-03T01:00:00Z", "temp": 39 }, { "date": "2022-07-03T22:00:00Z", "temp": 46 }, { "date": "2022-07-03T23:00:00Z", "temp": 46 }, { "date": "2022-07-04T00:00:00Z", "temp": 46 }, { "date": "2022-07-04T01:00:00Z", "temp": 46 }, { "date": "2022-07-04T22:00:00Z", "temp": 40 }, { "date": "2022-07-04T23:00:00Z", "temp": 39 }, { "date": "2022-07-05T00:00:00Z", "temp": 39 }, { "date": "2022-07-05T01:00:00Z", "temp": 41 }, { "date": "2022-07-05T22:00:00Z", "temp": 40 }, { "date": "2022-07-05T23:00:00Z", "temp": 40 }, { "date": "2022-07-06T00:00:00Z", "temp": 40 }, { "date": "2022-07-06T01:00:00Z", "temp": 40 }, { "date": "2022-07-06T04:00:00Z", "temp": 41 }, { "date": "2022-07-06T05:00:00Z", "temp": 41 }, { "date": "2022-07-06T06:00:00Z", "temp": 41 }, { "date": "2022-07-06T22:00:00Z", "temp": 40 }, { "date": "2022-07-06T23:00:00Z", "temp": 40 }, { "date": "2022-07-07T00:00:00Z", "temp": 41 }, { "date": "2022-07-07T01:00:00Z", "temp": 41 }, { "date": "2022-07-07T03:00:00Z", "temp": 41 }, { "date": "2022-07-07T04:00:00Z", "temp": 40 }, { "date": "2022-07-07T05:00:00Z", "temp": 40 }, { "date": "2022-07-07T06:00:00Z", "temp": 41 }, { "date": "2022-07-07T07:00:00Z", "temp": 40 }, { "date": "2022-07-07T22:00:00Z", "temp": 39 }, { "date": "2022-07-07T23:00:00Z", "temp": 39 }, { "date": "2022-07-08T00:00:00Z", "temp": 39 }, { "date": "2022-07-08T01:00:00Z", "temp": 39 }, { "date": "2022-07-08T13:00:00Z", "temp": 38 }, { "date": "2022-07-08T14:00:00Z", "temp": 38 }, { "date": "2022-07-08T15:00:00Z", "temp": 38 }], "0x5002538e40a22954": [{ "date": "2022-07-01T19:00:00Z", "temp": 30 }, { "date": "2022-07-01T20:00:00Z", "temp": 31 }, { "date": "2022-07-01T21:00:00Z", "temp": 31 }, { "date": "2022-07-01T22:00:00Z", "temp": 31 }, { "date": "2022-07-01T23:00:00Z", "temp": 30 }, { "date": "2022-07-02T00:00:00Z", "temp": 30 }, { "date": "2022-07-02T01:00:00Z", "temp": 31 }, { "date": "2022-07-02T03:00:00Z", "temp": 31 }, { "date": "2022-07-02T04:00:00Z", "temp": 30 }, { "date": "2022-07-02T05:00:00Z", "temp": 30 }, { "date": "2022-07-02T06:00:00Z", "temp": 30 }, { "date": "2022-07-02T07:00:00Z", "temp": 29 }, { "date": "2022-07-02T08:00:00Z", "temp": 29 }, { "date": "2022-07-02T09:00:00Z", "temp": 29 }, { "date": "2022-07-02T10:00:00Z", "temp": 30 }, { "date": "2022-07-02T11:00:00Z", "temp": 30 }, { "date": "2022-07-02T12:00:00Z", "temp": 29 }, { "date": "2022-07-02T13:00:00Z", "temp": 28 }, { "date": "2022-07-02T14:00:00Z", "temp": 28 }, { "date": "2022-07-02T15:00:00Z", "temp": 28 }, { "date": "2022-07-02T16:00:00Z", "temp": 29 }, { "date": "2022-07-02T17:00:00Z", "temp": 29 }, { "date": "2022-07-02T18:00:00Z", "temp": 29 }, { "date": "2022-07-02T19:00:00Z", "temp": 29 }, { "date": "2022-07-02T20:00:00Z", "temp": 29 }, { "date": "2022-07-02T21:00:00Z", "temp": 29 }, { "date": "2022-07-02T22:00:00Z", "temp": 29 }, { "date": "2022-07-02T23:00:00Z", "temp": 29 }, { "date": "2022-07-03T00:00:00Z", "temp": 29 }, { "date": "2022-07-03T01:00:00Z", "temp": 29 }, { "date": "2022-07-03T03:00:00Z", "temp": 32 }, { "date": "2022-07-03T04:00:00Z", "temp": 31 }, { "date": "2022-07-03T05:00:00Z", "temp": 30 }, { "date": "2022-07-03T06:00:00Z", "temp": 29 }, { "date": "2022-07-03T07:00:00Z", "temp": 29 }, { "date": "2022-07-03T08:00:00Z", "temp": 29 }, { "date": "2022-07-03T09:00:00Z", "temp": 30 }, { "date": "2022-07-03T10:00:00Z", "temp": 29 }, { "date": "2022-07-03T11:00:00Z", "temp": 31 }, { "date": "2022-07-03T12:00:00Z", "temp": 30 }, { "date": "2022-07-03T13:00:00Z", "temp": 29 }, { "date": "2022-07-03T14:00:00Z", "temp": 29 }, { "date": "2022-07-03T15:00:00Z", "temp": 30 }, { "date": "2022-07-03T16:00:00Z", "temp": 29 }, { "date": "2022-07-03T17:00:00Z", "temp": 29 }, { "date": "2022-07-03T18:00:00Z", "temp": 30 }, { "date": "2022-07-03T19:00:00Z", "temp": 30 }, { "date": "2022-07-03T20:00:00Z", "temp": 30 }, { "date": "2022-07-03T21:00:00Z", "temp": 31 }, { "date": "2022-07-03T22:00:00Z", "temp": 32 }, { "date": "2022-07-03T23:00:00Z", "temp": 31 }, { "date": "2022-07-04T00:00:00Z", "temp": 30 }, { "date": "2022-07-04T01:00:00Z", "temp": 31 }, { "date": "2022-07-04T03:00:00Z", "temp": 31 }, { "date": "2022-07-04T04:00:00Z", "temp": 32 }, { "date": "2022-07-04T05:00:00Z", "temp": 31 }, { "date": "2022-07-04T06:00:00Z", "temp": 31 }, { "date": "2022-07-04T07:00:00Z", "temp": 31 }, { "date": "2022-07-04T08:00:00Z", "temp": 30 }, { "date": "2022-07-04T09:00:00Z", "temp": 30 }, { "date": "2022-07-04T10:00:00Z", "temp": 30 }, { "date": "2022-07-04T11:00:00Z", "temp": 30 }, { "date": "2022-07-04T12:00:00Z", "temp": 30 }, { "date": "2022-07-04T13:00:00Z", "temp": 30 }, { "date": "2022-07-04T14:00:00Z", "temp": 30 }, { "date": "2022-07-04T15:00:00Z", "temp": 30 }, { "date": "2022-07-04T16:00:00Z", "temp": 30 }, { "date": "2022-07-04T17:00:00Z", "temp": 30 }, { "date": "2022-07-04T18:00:00Z", "temp": 30 }, { "date": "2022-07-04T19:00:00Z", "temp": 30 }, { "date": "2022-07-04T20:00:00Z", "temp": 31 }, { "date": "2022-07-04T21:00:00Z", "temp": 31 }, { "date": "2022-07-04T22:00:00Z", "temp": 31 }, { "date": "2022-07-04T23:00:00Z", "temp": 32 }, { "date": "2022-07-05T00:00:00Z", "temp": 32 }, { "date": "2022-07-05T01:00:00Z", "temp": 32 }, { "date": "2022-07-05T03:00:00Z", "temp": 32 }, { "date": "2022-07-05T04:00:00Z", "temp": 31 }, { "date": "2022-07-05T05:00:00Z", "temp": 31 }, { "date": "2022-07-05T06:00:00Z", "temp": 31 }, { "date": "2022-07-05T07:00:00Z", "temp": 31 }, { "date": "2022-07-05T08:00:00Z", "temp": 32 }, { "date": "2022-07-05T09:00:00Z", "temp": 32 }, { "date": "2022-07-05T10:00:00Z", "temp": 32 }, { "date": "2022-07-05T11:00:00Z", "temp": 32 }, { "date": "2022-07-05T12:00:00Z", "temp": 32 }, { "date": "2022-07-05T13:00:00Z", "temp": 31 }, { "date": "2022-07-05T14:00:00Z", "temp": 32 }, { "date": "2022-07-05T15:00:00Z", "temp": 32 }, { "date": "2022-07-05T16:00:00Z", "temp": 31 }, { "date": "2022-07-05T17:00:00Z", "temp": 31 }, { "date": "2022-07-05T18:00:00Z", "temp": 31 }, { "date": "2022-07-05T19:00:00Z", "temp": 31 }, { "date": "2022-07-05T20:00:00Z", "temp": 32 }, { "date": "2022-07-05T21:00:00Z", "temp": 32 }, { "date": "2022-07-05T22:00:00Z", "temp": 32 }, { "date": "2022-07-05T23:00:00Z", "temp": 32 }, { "date": "2022-07-06T00:00:00Z", "temp": 32 }, { "date": "2022-07-06T01:00:00Z", "temp": 31 }, { "date": "2022-07-06T02:00:00Z", "temp": 31 }, { "date": "2022-07-06T03:00:00Z", "temp": 31 }, { "date": "2022-07-06T04:00:00Z", "temp": 31 }, { "date": "2022-07-06T05:00:00Z", "temp": 31 }, { "date": "2022-07-06T06:00:00Z", "temp": 31 }, { "date": "2022-07-06T07:00:00Z", "temp": 37 }, { "date": "2022-07-06T08:00:00Z", "temp": 36 }, { "date": "2022-07-06T09:00:00Z", "temp": 32 }, { "date": "2022-07-06T10:00:00Z", "temp": 31 }, { "date": "2022-07-06T11:00:00Z", "temp": 32 }, { "date": "2022-07-06T12:00:00Z", "temp": 32 }, { "date": "2022-07-06T13:00:00Z", "temp": 32 }, { "date": "2022-07-06T14:00:00Z", "temp": 32 }, { "date": "2022-07-06T15:00:00Z", "temp": 32 }, { "date": "2022-07-06T16:00:00Z", "temp": 31 }, { "date": "2022-07-06T17:00:00Z", "temp": 33 }, { "date": "2022-07-06T18:00:00Z", "temp": 33 }, { "date": "2022-07-06T19:00:00Z", "temp": 32 }, { "date": "2022-07-06T20:00:00Z", "temp": 34 }, { "date": "2022-07-06T21:00:00Z", "temp": 32 }, { "date": "2022-07-06T22:00:00Z", "temp": 31 }, { "date": "2022-07-06T23:00:00Z", "temp": 31 }, { "date": "2022-07-07T00:00:00Z", "temp": 31 }, { "date": "2022-07-07T01:00:00Z", "temp": 30 }, { "date": "2022-07-07T02:00:00Z", "temp": 30 }, { "date": "2022-07-07T03:00:00Z", "temp": 30 }, { "date": "2022-07-07T04:00:00Z", "temp": 31 }, { "date": "2022-07-07T05:00:00Z", "temp": 31 }, { "date": "2022-07-07T06:00:00Z", "temp": 30 }, { "date": "2022-07-07T07:00:00Z", "temp": 31 }, { "date": "2022-07-07T08:00:00Z", "temp": 31 }, { "date": "2022-07-07T09:00:00Z", "temp": 31 }, { "date": "2022-07-07T10:00:00Z", "temp": 30 }, { "date": "2022-07-07T11:00:00Z", "temp": 30 }, { "date": "2022-07-07T12:00:00Z", "temp": 30 }, { "date": "2022-07-07T13:00:00Z", "temp": 30 }, { "date": "2022-07-07T14:00:00Z", "temp": 30 }, { "date": "2022-07-07T15:00:00Z", "temp": 30 }, { "date": "2022-07-07T16:00:00Z", "temp": 30 }, { "date": "2022-07-07T17:00:00Z", "temp": 30 }, { "date": "2022-07-07T18:00:00Z", "temp": 30 }, { "date": "2022-07-07T19:00:00Z", "temp": 30 }, { "date": "2022-07-07T20:00:00Z", "temp": 30 }, { "date": "2022-07-07T21:00:00Z", "temp": 30 }, { "date": "2022-07-07T22:00:00Z", "temp": 31 }, { "date": "2022-07-07T23:00:00Z", "temp": 31 }, { "date": "2022-07-08T00:00:00Z", "temp": 31 }, { "date": "2022-07-08T01:00:00Z", "temp": 31 }, { "date": "2022-07-08T02:00:00Z", "temp": 30 }, { "date": "2022-07-08T03:00:00Z", "temp": 31 }, { "date": "2022-07-08T04:00:00Z", "temp": 31 }, { "date": "2022-07-08T05:00:00Z", "temp": 32 }, { "date": "2022-07-08T06:00:00Z", "temp": 34 }, { "date": "2022-07-08T07:00:00Z", "temp": 34 }, { "date": "2022-07-08T08:00:00Z", "temp": 34 }, { "date": "2022-07-08T09:00:00Z", "temp": 31 }, { "date": "2022-07-08T10:00:00Z", "temp": 30 }, { "date": "2022-07-08T11:00:00Z", "temp": 30 }, { "date": "2022-07-08T12:00:00Z", "temp": 30 }, { "date": "2022-07-08T13:00:00Z", "temp": 31 }, { "date": "2022-07-08T14:00:00Z", "temp": 31 }, { "date": "2022-07-08T15:00:00Z", "temp": 31 }] } }, "success": true } ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device/dashboard-device.component.html ================================================
Status
{{ deviceStatusForModelWithThreshold(deviceSummary.device, !!deviceSummary.smart, config.metrics.status_threshold) | titlecase}}
No Data
Temperature
{{ deviceSummary.smart?.temp | temperature:config.temperature_unit:true }}
--
Capacity
{{ deviceSummary.device.capacity | fileSize:config.file_size_si_units}}
Powered On
{{ deviceSummary.smart?.power_on_hours | deviceHours:config.powered_on_hours_unit:{ round: true, largest: 1, units: ['y', 'd', 'h'] } }}
--
================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device/dashboard-device.component.scss ================================================ .text-disabled{ opacity: 0.8; } ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device/dashboard-device.component.spec.ts ================================================ import {async, ComponentFixture, TestBed} from '@angular/core/testing'; import {DashboardDeviceComponent} from './dashboard-device.component'; import {MatDialog} from '@angular/material/dialog'; import {MatButtonModule} from '@angular/material/button'; import {MatIconModule} from '@angular/material/icon'; import {SharedModule} from 'app/shared/shared.module'; import {MatMenuModule} from '@angular/material/menu'; import {TREO_APP_CONFIG} from '@treo/services/config/config.constants'; import {DeviceSummaryModel} from 'app/core/models/device-summary-model'; import * as moment from 'moment'; import {HttpClientTestingModule} from '@angular/common/http/testing'; import {HttpClient} from '@angular/common/http'; import {ScrutinyConfigService} from 'app/core/config/scrutiny-config.service'; import {of} from 'rxjs'; import {MetricsStatusThreshold} from 'app/core/config/app.config'; describe('DashboardDeviceComponent', () => { let component: DashboardDeviceComponent; let fixture: ComponentFixture; const matDialogSpy = jasmine.createSpyObj('MatDialog', ['open']); // const configServiceSpy = jasmine.createSpyObj('ScrutinyConfigService', ['config$']); let configService: ScrutinyConfigService; let httpClientSpy: jasmine.SpyObj; beforeEach(async(() => { httpClientSpy = jasmine.createSpyObj('HttpClient', ['get']); configService = new ScrutinyConfigService(httpClientSpy, {}); TestBed.configureTestingModule({ imports: [ MatButtonModule, MatIconModule, MatMenuModule, SharedModule, HttpClientTestingModule, ], providers: [ {provide: MatDialog, useValue: matDialogSpy}, {provide: TREO_APP_CONFIG, useValue: {dashboard_display: 'name', metrics: {status_threshold: 3}}}, {provide: ScrutinyConfigService, useValue: configService} ], declarations: [DashboardDeviceComponent] }) .compileComponents(); })); beforeEach(() => { // configServiceSpy.config$.and.returnValue(of({'success': true})); fixture = TestBed.createComponent(DashboardDeviceComponent); component = fixture.componentInstance; }); it('should create', () => { expect(component).toBeTruthy(); }); describe('#classDeviceLastUpdatedOn()', () => { it('if non-zero device status, should be red', () => { httpClientSpy.get.and.returnValue(of({ settings: { metrics: { status_threshold: MetricsStatusThreshold.Both, } } })); component.ngOnInit() // component.deviceSummary = summary.data.summary['0x5000c500673e6b5f'] as DeviceSummaryModel expect(component.classDeviceLastUpdatedOn({ device: { device_status: 2, }, smart: { collector_date: moment().subtract(13, 'days').toISOString() }, } as DeviceSummaryModel)).toBe('text-red') }); it('if non-zero device status, should be red', () => { httpClientSpy.get.and.returnValue(of({ settings: { metrics: { status_threshold: MetricsStatusThreshold.Both, } } })); component.ngOnInit() expect(component.classDeviceLastUpdatedOn({ device: { device_status: 2 }, smart: { collector_date: moment().subtract(13, 'days').toISOString() }, } as DeviceSummaryModel)).toBe('text-red') }); it('if healthy device status and updated in the last two weeks, should be green', () => { httpClientSpy.get.and.returnValue(of({ settings: { metrics: { status_threshold: MetricsStatusThreshold.Both, } } })); component.ngOnInit() expect(component.classDeviceLastUpdatedOn({ device: { device_status: 0 }, smart: { collector_date: moment().subtract(13, 'days').toISOString() } } as DeviceSummaryModel)).toBe('text-green') }); it('if healthy device status and updated more than two weeks ago, but less than 1 month, should be yellow', () => { httpClientSpy.get.and.returnValue(of({ settings: { metrics: { status_threshold: MetricsStatusThreshold.Both, } } })); component.ngOnInit() expect(component.classDeviceLastUpdatedOn({ device: { device_status: 0 }, smart: { collector_date: moment().subtract(3, 'weeks').toISOString() } } as DeviceSummaryModel)).toBe('text-yellow') }); it('if healthy device status and updated more 1 month ago, should be red', () => { httpClientSpy.get.and.returnValue(of({ settings: { metrics: { status_threshold: MetricsStatusThreshold.Both, } } })); component.ngOnInit() expect(component.classDeviceLastUpdatedOn({ device: { device_status: 0 }, smart: { collector_date: moment().subtract(5, 'weeks').toISOString() } } as DeviceSummaryModel)).toBe('text-red') }); }) }); ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device/dashboard-device.component.ts ================================================ import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; import * as moment from 'moment'; import {takeUntil} from 'rxjs/operators'; import {AppConfig} from 'app/core/config/app.config'; import {ScrutinyConfigService} from 'app/core/config/scrutiny-config.service'; import {Subject} from 'rxjs'; import {MatDialog} from '@angular/material/dialog'; import {DashboardDeviceDeleteDialogComponent} from 'app/layout/common/dashboard-device-delete-dialog/dashboard-device-delete-dialog.component'; import {DeviceTitlePipe} from 'app/shared/device-title.pipe'; import {DeviceSummaryModel} from 'app/core/models/device-summary-model'; import {DeviceStatusPipe} from 'app/shared/device-status.pipe'; import {DashboardDeviceArchiveDialogComponent} from '../dashboard-device-archive-dialog/dashboard-device-archive-dialog.component'; import {DashboardDeviceArchiveDialogService} from '../dashboard-device-archive-dialog/dashboard-device-archive-dialog.service'; @Component({ selector: 'app-dashboard-device', templateUrl: './dashboard-device.component.html', styleUrls: ['./dashboard-device.component.scss'] }) export class DashboardDeviceComponent implements OnInit { constructor( private _configService: ScrutinyConfigService, private _archiveService: DashboardDeviceArchiveDialogService, public dialog: MatDialog, ) { // Set the private defaults this._unsubscribeAll = new Subject(); } @Input() deviceSummary: DeviceSummaryModel; @Output() deviceArchived = new EventEmitter(); @Output() deviceUnarchived = new EventEmitter(); @Output() deviceDeleted = new EventEmitter(); config: AppConfig; private _unsubscribeAll: Subject; deviceStatusForModelWithThreshold = DeviceStatusPipe.deviceStatusForModelWithThreshold ngOnInit(): void { // Subscribe to config changes this._configService.config$ .pipe(takeUntil(this._unsubscribeAll)) .subscribe((config: AppConfig) => { this.config = config; }); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- classDeviceLastUpdatedOn(deviceSummary: DeviceSummaryModel): string { const deviceStatus = DeviceStatusPipe.deviceStatusForModelWithThreshold(deviceSummary.device, !!deviceSummary.smart, this.config.metrics.status_threshold) if (deviceStatus === 'failed') { return 'text-red' // if the device has failed, always highlight in red } else if (deviceStatus === 'passed') { if (moment().subtract(14, 'days').isBefore(deviceSummary.smart.collector_date)) { // this device was updated in the last 2 weeks. return 'text-green' } else if (moment().subtract(1, 'months').isBefore(deviceSummary.smart.collector_date)) { // this device was updated in the last month return 'text-yellow' } else { // last updated more than a month ago. return 'text-red' } } else { return '' } } openArchiveDialog(): void { if(this.deviceSummary.device.archived){ this._archiveService.unarchiveDevice(this.deviceSummary.device.wwn).subscribe((result) => { if(result) { this.deviceUnarchived.emit(this.deviceSummary.device.wwn) } }) return; } const dialogRef = this.dialog.open(DashboardDeviceArchiveDialogComponent, { data: { wwn: this.deviceSummary.device.wwn, title: DeviceTitlePipe.deviceTitleWithFallback(this.deviceSummary.device, this.config.dashboard_display) } }); dialogRef.afterClosed().subscribe(result => { if(result) { this.deviceArchived.emit(this.deviceSummary.device.wwn); } }) } openDeleteDialog(): void { const dialogRef = this.dialog.open(DashboardDeviceDeleteDialogComponent, { // width: '250px', data: { wwn: this.deviceSummary.device.wwn, title: DeviceTitlePipe.deviceTitleWithFallback(this.deviceSummary.device, this.config.dashboard_display) } }); dialogRef.afterClosed().subscribe(result => { console.log('The dialog was closed', result); if (result.success) { this.deviceDeleted.emit(this.deviceSummary.device.wwn) } }); } } ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device/dashboard-device.module.ts ================================================ 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 {DashboardDeviceComponent} from 'app/layout/common/dashboard-device/dashboard-device.component' import {dashboardRoutes} from '../../../modules/dashboard/dashboard.routing'; import {MatMenuModule} from '@angular/material/menu'; import {DashboardDeviceDeleteDialogModule} from 'app/layout/common/dashboard-device-delete-dialog/dashboard-device-delete-dialog.module'; import {DashboardDeviceArchiveDialogModule} from '../dashboard-device-archive-dialog/dashboard-device-archive-dialog.module'; @NgModule({ declarations: [ DashboardDeviceComponent ], imports: [ RouterModule.forChild([]), RouterModule.forChild(dashboardRoutes), MatButtonModule, MatIconModule, MatMenuModule, SharedModule, DashboardDeviceDeleteDialogModule, DashboardDeviceArchiveDialogModule ], exports: [ DashboardDeviceComponent, ], providers: [] }) export class DashboardDeviceModule { } ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device-archive-dialog/dashboard-device-archive-dialog.component.html ================================================

Archive {{data.title}}?

This will remove the device from Scrutiny dashboard, unless you toggle show archived. Any data about the device itself will remain untouched. ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device-archive-dialog/dashboard-device-archive-dialog.component.scss ================================================ ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device-archive-dialog/dashboard-device-archive-dialog.component.spec.ts ================================================ import {async, ComponentFixture, TestBed} from '@angular/core/testing'; import {DashboardDeviceArchiveDialogComponent} from './dashboard-device-archive-dialog.component'; import {HttpClientModule} from '@angular/common/http'; import {MAT_DIALOG_DATA, MatDialogModule, MatDialogRef} from '@angular/material/dialog'; import {MatButtonModule} from '@angular/material/button'; import {MatIconModule} from '@angular/material/icon'; import {SharedModule} from '../../../shared/shared.module'; import {DashboardDeviceArchiveDialogService} from './dashboard-device-archive-dialog.service'; import {of} from 'rxjs'; describe('DashboardDeviceArchiveDialogComponent', () => { let component: DashboardDeviceArchiveDialogComponent; let fixture: ComponentFixture; const matDialogRefSpy = jasmine.createSpyObj('MatDialogRef', ['closeDialog', 'close']); const dashboardDeviceArchiveDialogServiceSpy = jasmine.createSpyObj('DashboardDeviceArchiveDialogService', ['archiveDevice']); beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ HttpClientModule, MatDialogModule, MatButtonModule, MatIconModule, SharedModule, ], providers: [ {provide: MatDialogRef, useValue: matDialogRefSpy}, {provide: MAT_DIALOG_DATA, useValue: {wwn: 'test-wwn', title: 'my-test-device-title'}}, {provide: DashboardDeviceArchiveDialogService, useValue: dashboardDeviceArchiveDialogServiceSpy} ], declarations: [DashboardDeviceArchiveDialogComponent] }) .compileComponents() })); beforeEach(() => { fixture = TestBed.createComponent(DashboardDeviceArchiveDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); it('should close the component if cancel is clicked', () => { matDialogRefSpy.closeDialog.calls.reset(); matDialogRefSpy.closeDialog() expect(matDialogRefSpy.closeDialog).toHaveBeenCalled(); }); it('should attempt to archive device if archive is clicked', () => { dashboardDeviceArchiveDialogServiceSpy.archiveDevice.and.returnValue(of({'success': true})); component.onArchiveClick() expect(dashboardDeviceArchiveDialogServiceSpy.archiveDevice).toHaveBeenCalledWith('test-wwn'); expect(dashboardDeviceArchiveDialogServiceSpy.archiveDevice.calls.count()) .withContext('one call') .toBe(1); }); }); ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device-archive-dialog/dashboard-device-archive-dialog.component.ts ================================================ import {Component, Inject, OnInit} from '@angular/core'; import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; import {DashboardDeviceArchiveDialogService} from 'app/layout/common/dashboard-device-archive-dialog/dashboard-device-archive-dialog.service'; @Component({ selector: 'app-dashboard-device-archive-dialog', templateUrl: './dashboard-device-archive-dialog.component.html', styleUrls: ['./dashboard-device-archive-dialog.component.scss'], }) export class DashboardDeviceArchiveDialogComponent implements OnInit { constructor( public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: {wwn: string, title: string}, private _archiveService: DashboardDeviceArchiveDialogService, ) { } ngOnInit(): void { } onArchiveClick(): void { this._archiveService.archiveDevice(this.data.wwn) .subscribe((data) => { this.dialogRef.close(data); }); } } ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device-archive-dialog/dashboard-device-archive-dialog.module.ts ================================================ 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 {dashboardRoutes} from 'app/modules/dashboard/dashboard.routing'; import {MatDialogModule} from '@angular/material/dialog'; import {DashboardDeviceArchiveDialogComponent} from './dashboard-device-archive-dialog.component'; @NgModule({ declarations: [ DashboardDeviceArchiveDialogComponent ], imports: [ RouterModule.forChild([]), RouterModule.forChild(dashboardRoutes), MatButtonModule, MatIconModule, SharedModule, MatDialogModule ], exports : [ DashboardDeviceArchiveDialogComponent, ], providers : [] }) export class DashboardDeviceArchiveDialogModule { } ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device-archive-dialog/dashboard-device-archive-dialog.service.ts ================================================ import {Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; import {Observable} from 'rxjs'; import {getBasePath} from 'app/app.routing'; @Injectable({ providedIn: 'root' }) export class DashboardDeviceArchiveDialogService { /** * Constructor * * @param {HttpClient} _httpClient */ constructor( private _httpClient: HttpClient ) { } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- archiveDevice(wwn: string): Observable { return this._httpClient.post( `${getBasePath()}/api/device/${wwn}/archive`, {}); } unarchiveDevice(wwn: string): Observable { return this._httpClient.post( `${getBasePath()}/api/device/${wwn}/unarchive`, {}); } } ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device-delete-dialog/dashboard-device-delete-dialog.component.html ================================================

Delete {{data.title}}?

This will remove the device and all historical data from Scrutiny. Any data on the device itself will remain untouched. ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device-delete-dialog/dashboard-device-delete-dialog.component.scss ================================================ ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device-delete-dialog/dashboard-device-delete-dialog.component.spec.ts ================================================ import {async, ComponentFixture, TestBed} from '@angular/core/testing'; import {DashboardDeviceDeleteDialogComponent} from './dashboard-device-delete-dialog.component'; import {HttpClientModule} from '@angular/common/http'; import {MAT_DIALOG_DATA, MatDialogModule, MatDialogRef} from '@angular/material/dialog'; import {MatButtonModule} from '@angular/material/button'; import {MatIconModule} from '@angular/material/icon'; import {SharedModule} from '../../../shared/shared.module'; import {DashboardDeviceDeleteDialogService} from './dashboard-device-delete-dialog.service'; import {of} from 'rxjs'; describe('DashboardDeviceDeleteDialogComponent', () => { let component: DashboardDeviceDeleteDialogComponent; let fixture: ComponentFixture; const matDialogRefSpy = jasmine.createSpyObj('MatDialogRef', ['closeDialog', 'close']); const dashboardDeviceDeleteDialogServiceSpy = jasmine.createSpyObj('DashboardDeviceDeleteDialogService', ['deleteDevice']); beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ HttpClientModule, MatDialogModule, MatButtonModule, MatIconModule, SharedModule, ], providers: [ {provide: MatDialogRef, useValue: matDialogRefSpy}, {provide: MAT_DIALOG_DATA, useValue: {wwn: 'test-wwn', title: 'my-test-device-title'}}, {provide: DashboardDeviceDeleteDialogService, useValue: dashboardDeviceDeleteDialogServiceSpy} ], declarations: [DashboardDeviceDeleteDialogComponent] }) .compileComponents() })); beforeEach(() => { fixture = TestBed.createComponent(DashboardDeviceDeleteDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); it('should close the component if cancel is clicked', () => { matDialogRefSpy.closeDialog.calls.reset(); matDialogRefSpy.closeDialog() expect(matDialogRefSpy.closeDialog).toHaveBeenCalled(); }); it('should attempt to delete device if delete is clicked', () => { dashboardDeviceDeleteDialogServiceSpy.deleteDevice.and.returnValue(of({'success': true})); component.onDeleteClick() expect(dashboardDeviceDeleteDialogServiceSpy.deleteDevice).toHaveBeenCalledWith('test-wwn'); expect(dashboardDeviceDeleteDialogServiceSpy.deleteDevice.calls.count()) .withContext('one call') .toBe(1); }); }); ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device-delete-dialog/dashboard-device-delete-dialog.component.ts ================================================ import {Component, Inject, OnInit} from '@angular/core'; import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; import {DashboardDeviceDeleteDialogService} from 'app/layout/common/dashboard-device-delete-dialog/dashboard-device-delete-dialog.service'; @Component({ selector: 'app-dashboard-device-delete-dialog', templateUrl: './dashboard-device-delete-dialog.component.html', styleUrls: ['./dashboard-device-delete-dialog.component.scss'] }) export class DashboardDeviceDeleteDialogComponent implements OnInit { constructor( public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: {wwn: string, title: string}, private _deleteService: DashboardDeviceDeleteDialogService, ) { } ngOnInit(): void { } onDeleteClick(): void { this._deleteService.deleteDevice(this.data.wwn) .subscribe((data) => { this.dialogRef.close(data); }); } } ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device-delete-dialog/dashboard-device-delete-dialog.module.ts ================================================ 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 {DashboardDeviceDeleteDialogComponent} from 'app/layout/common/dashboard-device-delete-dialog/dashboard-device-delete-dialog.component' import {dashboardRoutes} from 'app/modules/dashboard/dashboard.routing'; import {MatDialogModule} from '@angular/material/dialog'; @NgModule({ declarations: [ DashboardDeviceDeleteDialogComponent ], imports: [ RouterModule.forChild([]), RouterModule.forChild(dashboardRoutes), MatButtonModule, MatIconModule, SharedModule, MatDialogModule ], exports : [ DashboardDeviceDeleteDialogComponent, ], providers : [] }) export class DashboardDeviceDeleteDialogModule { } ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-device-delete-dialog/dashboard-device-delete-dialog.service.ts ================================================ import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { BehaviorSubject, Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; import { getBasePath } from 'app/app.routing'; @Injectable({ providedIn: 'root' }) export class DashboardDeviceDeleteDialogService { /** * Constructor * * @param {HttpClient} _httpClient */ constructor( private _httpClient: HttpClient ) { } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- deleteDevice(wwn: string): Observable { return this._httpClient.delete( `${getBasePath()}/api/device/${wwn}`, {}); } } ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-settings/dashboard-settings.component.html ================================================

Scrutiny Settings

Dark Mode System Dark Light
Display Title Name Serial ID UUID Label Sort By Status Title Age
Temperature Celsius Fahrenheit File Size SI Units (GB) Binary Units (GiB)
Powered On Format Humanize Device Hours Line stroke Smooth Straight Stepline
Device Status - Thresholds Smart Scrutiny Both
Notify - Filter Attributes All Critical
Repeat Notifications Always Only when the value has changed

Quirks

Discard SCT Temperature History Enabled Disabled
================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-settings/dashboard-settings.component.scss ================================================ ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-settings/dashboard-settings.component.ts ================================================ import {Component, OnInit} from '@angular/core'; import { AppConfig, DashboardDisplay, DashboardSort, MetricsStatusFilterAttributes, MetricsStatusThreshold, TemperatureUnit, LineStroke, Theme, DevicePoweredOnUnit } from 'app/core/config/app.config'; import {ScrutinyConfigService} from 'app/core/config/scrutiny-config.service'; import {Subject} from 'rxjs'; import {takeUntil} from 'rxjs/operators'; @Component({ selector: 'app-dashboard-settings', templateUrl: './dashboard-settings.component.html', styleUrls: ['./dashboard-settings.component.scss'] }) export class DashboardSettingsComponent implements OnInit { dashboardDisplay: string; dashboardSort: string; temperatureUnit: string; fileSizeSIUnits: boolean; poweredOnHoursUnit: string; lineStroke: string; theme: string; discardSCTTempHistory: boolean; statusThreshold: number; statusFilterAttributes: number; repeatNotifications: boolean; // Private private _unsubscribeAll: Subject; constructor( private _configService: ScrutinyConfigService, ) { // Set the private defaults this._unsubscribeAll = new Subject(); } ngOnInit(): void { // Subscribe to config changes this._configService.config$ .pipe(takeUntil(this._unsubscribeAll)) .subscribe((config: AppConfig) => { // Store the config this.dashboardDisplay = config.dashboard_display; this.dashboardSort = config.dashboard_sort; this.temperatureUnit = config.temperature_unit; this.fileSizeSIUnits = config.file_size_si_units; this.poweredOnHoursUnit = config.powered_on_hours_unit; this.lineStroke = config.line_stroke; this.theme = config.theme; this.discardSCTTempHistory = config.collector.discard_sct_temp_history; this.statusFilterAttributes = config.metrics.status_filter_attributes; this.statusThreshold = config.metrics.status_threshold; this.repeatNotifications = config.metrics.repeat_notifications; }); } saveSettings(): void { const newSettings: AppConfig = { dashboard_display: this.dashboardDisplay as DashboardDisplay, dashboard_sort: this.dashboardSort as DashboardSort, temperature_unit: this.temperatureUnit as TemperatureUnit, file_size_si_units: this.fileSizeSIUnits, powered_on_hours_unit: this.poweredOnHoursUnit as DevicePoweredOnUnit, line_stroke: this.lineStroke as LineStroke, theme: this.theme as Theme, collector: { discard_sct_temp_history: this.discardSCTTempHistory }, metrics: { status_filter_attributes: this.statusFilterAttributes as MetricsStatusFilterAttributes, status_threshold: this.statusThreshold as MetricsStatusThreshold, repeat_notifications: this.repeatNotifications } } this._configService.config = newSettings console.log(`Saved Settings: ${JSON.stringify(newSettings)}`) } formatLabel(value: number): number { return value; } } ================================================ FILE: webapp/frontend/src/app/layout/common/dashboard-settings/dashboard-settings.module.ts ================================================ 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 { MatSelectModule } from '@angular/material/select'; 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 {DashboardSettingsComponent} from 'app/layout/common/dashboard-settings/dashboard-settings.component' import { MatDialogModule } from '@angular/material/dialog'; import { MatButtonToggleModule} from '@angular/material/button-toggle'; import {MatTabsModule} from '@angular/material/tabs'; import {MatSliderModule} from '@angular/material/slider'; import {MatSlideToggleModule} from '@angular/material/slide-toggle'; import {MatTooltipModule} from '@angular/material/tooltip'; @NgModule({ declarations: [ DashboardSettingsComponent ], imports : [ RouterModule.forChild([]), MatAutocompleteModule, MatDialogModule, MatButtonModule, MatSelectModule, MatFormFieldModule, MatIconModule, MatInputModule, MatButtonToggleModule, MatTabsModule, MatTooltipModule, MatSliderModule, MatSlideToggleModule, SharedModule ], exports : [ DashboardSettingsComponent ], providers : [] }) export class DashboardSettingsModule { } ================================================ FILE: webapp/frontend/src/app/layout/common/detail-settings/detail-settings.component.html ================================================

Scrutiny Settings

Threshold Data Scrutiny Manufacturer
Notifications Enabled Disabled
================================================ FILE: webapp/frontend/src/app/layout/common/detail-settings/detail-settings.component.scss ================================================ ================================================ FILE: webapp/frontend/src/app/layout/common/detail-settings/detail-settings.component.spec.ts ================================================ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { DetailSettingsComponent } from './detail-settings.component'; describe('DetailSettingsComponent', () => { let component: DetailSettingsComponent; let fixture: ComponentFixture; beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ DetailSettingsComponent ] }) .compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(DetailSettingsComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); }); ================================================ FILE: webapp/frontend/src/app/layout/common/detail-settings/detail-settings.component.ts ================================================ import { Component, OnInit } from '@angular/core'; @Component({ selector: 'app-detail-settings', templateUrl: './detail-settings.component.html', styleUrls: ['./detail-settings.component.scss'] }) export class DetailSettingsComponent implements OnInit { constructor() { } ngOnInit(): void { } } ================================================ FILE: webapp/frontend/src/app/layout/common/detail-settings/detail-settings.module.ts ================================================ import {NgModule} from '@angular/core'; import {RouterModule} from '@angular/router'; import {MatAutocompleteModule} from '@angular/material/autocomplete'; import {MatButtonModule} from '@angular/material/button'; import {MatSelectModule} from '@angular/material/select'; 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 {DetailSettingsComponent} from 'app/layout/common/detail-settings/detail-settings.component' import {MatDialogModule} from '@angular/material/dialog'; import {MatButtonToggleModule} from '@angular/material/button-toggle'; import {MatTabsModule} from '@angular/material/tabs'; import {MatSliderModule} from '@angular/material/slider'; import {MatSlideToggleModule} from '@angular/material/slide-toggle'; import {MatTooltipModule} from '@angular/material/tooltip'; @NgModule({ declarations: [ DetailSettingsComponent ], imports: [ RouterModule.forChild([]), MatAutocompleteModule, MatDialogModule, MatButtonModule, MatSelectModule, MatFormFieldModule, MatIconModule, MatInputModule, MatButtonToggleModule, MatTabsModule, MatTooltipModule, MatSliderModule, MatSlideToggleModule, SharedModule ], exports: [ DetailSettingsComponent ], providers: [] }) export class DetailSettingsModule { } ================================================ FILE: webapp/frontend/src/app/layout/common/search/search.component.html ================================================
No results found!
Page
{{result.link}}
Contact
================================================ FILE: webapp/frontend/src/app/layout/common/search/search.component.scss ================================================ @import 'treo'; search { display: flex; // Bar appearance &.search-appearance-bar { .search-container { position: absolute; display: flex; align-items: center; flex: 1 0 auto; top: 0; right: 0; bottom: 0; left: 0; z-index: 99; .search-input { flex: 1 0 auto; height: 100%; .mat-form-field-wrapper { height: 100%; .mat-form-field-flex { height: 100%; padding: 0 72px 0 32px; border: none; border-radius: 0 !important; @include treo-breakpoint('xs') { padding: 0 56px 0 24px } } } } .search-toggle-close { position: absolute; top: 50%; right: 32px; margin-top: -20px; min-width: 40px; width: 40px; min-height: 40px; height: 40px; @include treo-breakpoint('xs') { right: 8px; } } } } // Basic appearance &.search-appearance-basic { width: 100%; max-width: 400px; .search-container { display: flex; align-items: center; flex: 1 0 auto; overflow: hidden; .search-icon { margin-left: 16px; } .search-input { width: 100%; } } } } // Search results panel .search-results { max-height: 512px !important; &:before, &:after { content: ' '; position: absolute; width: 0; height: 0; bottom: 100%; left: 30px; border: solid transparent; pointer-events: none; } &:before { border-width: 9px; margin-left: -9px; } &:after { border-width: 8px; margin-left: -8px; } // Bar appearance &.search-results-appearance-bar { border-top-width: 1px; border-radius: 0 0 4px 4px; @include treo-elevation('md', true); .mat-option { padding: 0 40px; @include treo-breakpoint('xs') { padding: 0 24px } } } // Basic appearance &.search-results-appearance-basic { margin-top: 8px; border-radius: 4px; @include treo-elevation('2xl', true); .mat-option { padding: 0 32px; @include treo-breakpoint('xs') { padding: 0 24px } } } .mat-option { height: 56px; line-height: 56px; font-size: 14px; &.no-results { pointer-events: none; } .mat-option-text { .result { display: flex; align-items: center; &.contact-result { .image { display: flex; align-items: center; justify-content: center; width: 32px; min-width: 32px; max-width: 32px; height: 32px; min-height: 32px; max-height: 32px; margin-left: auto; border-radius: 50%; overflow: hidden; .mat-icon { margin: 0; @include treo-icon-size(20); } } } &.page-result { .title { display: flex; flex-direction: column; span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: normal; } .link { margin-top: 4px; line-height: normal; font-size: 12px; text-decoration: none !important; } } } .badge { padding: 3px 6px; margin-right: 16px; border-radius: 3px; font-size: 11px; line-height: normal; } .title { overflow: hidden; text-overflow: ellipsis; mark { font-weight: 500; } } } } } } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $background: map-get($theme, background); $foreground: map-get($theme, foreground); $primary: map-get($theme, primary); $is-dark: map-get($theme, is-dark); search { // Basic appearance &.search-appearance-basic { background: transparent; } // Bar appearance &.search-appearance-bar { .search-container { background: map-get($background, card); .search-input { .mat-form-field-wrapper { .mat-form-field-flex { background: transparent; } } } } } } // Search results panel .search-results { &:before { border-color: transparent; border-bottom-color: map-get($foreground, divider); } &:after { border-color: transparent; border-bottom-color: map-get($background, card); } .mat-option { @include treo-breakpoint('xs') { background: transparent !important; } @include treo-breakpoint('gt-xs') { &:hover:not(.mat-option-disabled), &:focus:not(.mat-option-disabled) { box-shadow: inset 4px 0 0 map-get($primary, default); } } &.no-results { .mat-option-text { color: map-get($foreground, secondary-text); } } .mat-option-text { .result { &.contact-result { .badge { background: treo-color('blue', 500); color: treo-contrast('blue', 500); } } &.page-result { .badge { background: treo-color('purple', 500); color: treo-contrast('purple', 500); } .title { .link { color: map-get($foreground, secondary-text); } } } .image { @if ($is-dark) { background: rgba(0, 0, 0, 0.05); } @else { background: map-get($primary, 100); } .mat-icon { color: map-get($primary, default); } } .title { mark { background: transparent; color: map-get($primary, default); } } } } } } } ================================================ FILE: webapp/frontend/src/app/layout/common/search/search.component.ts ================================================ import { Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, Renderer2, ViewChild, ViewEncapsulation } from '@angular/core'; import { FormControl } from '@angular/forms'; import { HttpClient } from '@angular/common/http'; import { MatFormField } from '@angular/material/form-field'; import { Subject } from 'rxjs'; import { debounceTime, filter, map, takeUntil } from 'rxjs/operators'; import { TreoAnimations } from '@treo/animations/public-api'; import { getBasePath } from 'app/app.routing'; @Component({ selector : 'search', templateUrl : './search.component.html', styleUrls : ['./search.component.scss'], encapsulation: ViewEncapsulation.None, exportAs : 'treoSearch', animations : TreoAnimations }) export class SearchComponent implements OnInit, OnDestroy { results: any[] | null; searchControl: FormControl; // Debounce @Input() debounce: number; // Min. length @Input() minLength: number; // Search @Output() search: EventEmitter; // Private private _appearance: 'basic' | 'bar'; private _opened: boolean; private _unsubscribeAll: Subject; /** * Constructor * * @param {ElementRef} _elementRef * @param {HttpClient} _httpClient * @param {Renderer2} _renderer2 */ constructor( private _elementRef: ElementRef, private _httpClient: HttpClient, private _renderer2: Renderer2 ) { // Set the private defaults this._unsubscribeAll = new Subject(); // Set the defaults this.appearance = 'basic'; this.debounce = this.debounce || 300; this.minLength = this.minLength || 2; this.opened = false; this.results = null; this.searchControl = new FormControl(); } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Setter and getter for appearance * * @param value */ @Input() set appearance(value: 'basic' | 'bar') { // If the value is the same, return... if ( this._appearance === value ) { return; } // Make sure the search is closed, before // changing the appearance to prevent issues this.close(); let appearanceClassName; // Remove the previous appearance class appearanceClassName = 'search-appearance-' + this.appearance; this._renderer2.removeClass(this._elementRef.nativeElement, appearanceClassName); // Store the appearance this._appearance = value; // Add the new appearance class appearanceClassName = 'search-appearance-' + this.appearance; this._renderer2.addClass(this._elementRef.nativeElement, appearanceClassName); } get appearance(): 'basic' | 'bar' { return this._appearance; } /** * Setter and getter for opened * * @param value */ set opened(value: boolean) { // If the value is the same, return... if ( this._opened === value ) { return; } // Store the opened status this._opened = value; // If opened... if ( value ) { // Add opened class this._renderer2.addClass(this._elementRef.nativeElement, 'search-opened'); } else { // Remove opened class this._renderer2.removeClass(this._elementRef.nativeElement, 'search-opened'); } } get opened(): boolean { return this._opened; } /** * Setter and getter for search input * * @param value */ @ViewChild('searchInput') set searchInput(value: MatFormField) { // Return if the appearance is basic, since we don't want // basic search to be focused as soon as the page loads if ( this.appearance === 'basic' ) { return; } // 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._inputContainerRef.nativeElement.children[0].focus(); }); } } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * 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(getBasePath() + '/api/common/search', {query: value}) .subscribe((response: any) => { this.results = response.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): void { // Listen for escape to close the search // if the appearance is 'bar' if ( this.appearance === 'bar' ) { // Escape if ( event.keyCode === 27 ) { // 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; } } ================================================ FILE: webapp/frontend/src/app/layout/common/search/search.module.ts ================================================ 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 { } ================================================ FILE: webapp/frontend/src/app/layout/layout.component.html ================================================ ================================================ FILE: webapp/frontend/src/app/layout/layout.component.scss ================================================ layout { display: flex; flex: 1 1 auto; width: 100%; max-width: 100%; min-width: 0; } ================================================ FILE: webapp/frontend/src/app/layout/layout.component.ts ================================================ import {Component, Inject, OnDestroy, OnInit, ViewEncapsulation} from '@angular/core'; import {DOCUMENT} from '@angular/common'; import {ActivatedRoute, NavigationEnd, Router} from '@angular/router'; import {MatSlideToggleChange} from '@angular/material/slide-toggle'; import {Subject} from 'rxjs'; import {filter, takeUntil} from 'rxjs/operators'; import {ScrutinyConfigService} from 'app/core/config/scrutiny-config.service'; import {TreoDrawerService} from '@treo/components/drawer'; import {Layout} from 'app/layout/layout.types'; import {AppConfig, 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; theme: Theme; // Private private _unsubscribeAll: Subject; private systemPrefersDark: boolean; /** * Constructor * * @param {ActivatedRoute} _activatedRoute * @param {ScrutinyConfigService} _scrutinyConfigService * @param {TreoDrawerService} _treoDrawerService * @param {DOCUMENT} _document * @param {Router} _router */ constructor( private _activatedRoute: ActivatedRoute, private _scrutinyConfigService: ScrutinyConfigService, private _treoDrawerService: TreoDrawerService, @Inject(DOCUMENT) private _document: any, private _router: Router ) { // Set the private defaults this._unsubscribeAll = new Subject(); this.systemPrefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Subscribe to config changes this._scrutinyConfigService.config$ .pipe(takeUntil(this._unsubscribeAll)) .subscribe((config: AppConfig) => { // Store the config this.config = config; // Store the theme this.theme = config.theme; // Update the selected theme class name on body const themeName = 'treo-theme-' + this.determineTheme(config); this._document.body.classList.forEach((className) => { if ( className.startsWith('treo-theme-') && className !== themeName ) { this._document.body.classList.remove(className); this._document.body.classList.add(themeName); return; } }); // 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(); }); } /** * On destroy */ ngOnDestroy(): void { // Unsubscribe from all subscriptions this._unsubscribeAll.next(); this._unsubscribeAll.complete(); } // ----------------------------------------------------------------------------------------------------- // @ Private methods // ----------------------------------------------------------------------------------------------------- /** * Checks if theme should be set to dark based on config & system settings */ private determineTheme(config:AppConfig): string { if (config.theme === 'system') { return this.systemPrefersDark ? 'dark' : 'light' } else { return config.theme } } /** * 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.config.layout = this.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' data if ( path.routeConfig && path.routeConfig.data && path.routeConfig.data.layout ) { // Set the layout this.layout = path.routeConfig.data.layout; } }); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Set the layout on the config * * @param layout */ setLayout(layout: Layout): void { // Clear the 'layout' query param to allow layout changes this._router.navigate([], { queryParams: { layout: null }, queryParamsHandling: 'merge' }).then(() => { // Set the config this._scrutinyConfigService.config = {layout}; }); } /** * Set the theme on the config * * @param change */ setTheme(change: MatSlideToggleChange): void { this._scrutinyConfigService.config = {theme: change.checked ? 'dark' : 'light'}; } } ================================================ FILE: webapp/frontend/src/app/layout/layout.module.ts ================================================ import { NgModule } from '@angular/core'; import { TreoDrawerModule } from '@treo/components/drawer'; import { LayoutComponent } from 'app/layout/layout.component'; import { EmptyLayoutModule } from 'app/layout/layouts/empty/empty.module'; import { MaterialLayoutModule } from 'app/layout/layouts/horizontal/material/material.module'; import { SharedModule } from 'app/shared/shared.module'; const modules = [ // Empty EmptyLayoutModule, // Horizontal navigation MaterialLayoutModule, ]; @NgModule({ declarations: [ LayoutComponent, ], imports : [ TreoDrawerModule, SharedModule, ...modules ], exports : [ ...modules ] }) export class LayoutModule { } ================================================ FILE: webapp/frontend/src/app/layout/layout.types.ts ================================================ export type Layout = 'empty' | 'centered' | 'enterprise' | 'material' | 'modern' | 'basic' | 'classic' | 'classy' | 'compact' | 'dense' | 'futuristic' | 'thin'; ================================================ FILE: webapp/frontend/src/app/layout/layouts/empty/empty.component.html ================================================
================================================ FILE: webapp/frontend/src/app/layout/layouts/empty/empty.component.scss ================================================ @import 'treo'; empty-layout { position: relative; display: flex; flex: 1 1 auto; width: 100%; // Container > .container { display: flex; flex-direction: column; flex: 1 1 auto; width: 100%; // Content > .content { display: flex; flex-direction: column; flex: 1 0 auto; > *:not(router-outlet) { position: relative; display: flex; flex: 1 0 auto; flex-wrap: wrap; width: 100%; min-width: 100%; } } } } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { } ================================================ FILE: webapp/frontend/src/app/layout/layouts/empty/empty.component.ts ================================================ import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; import { Subject } from 'rxjs'; @Component({ selector : 'empty-layout', templateUrl : './empty.component.html', styleUrls : ['./empty.component.scss'], encapsulation: ViewEncapsulation.None }) export class EmptyLayoutComponent implements OnInit, OnDestroy { // Private private _unsubscribeAll: Subject; /** * Constructor */ constructor() { // Set the private defaults this._unsubscribeAll = new Subject(); } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { } /** * On destroy */ ngOnDestroy(): void { // Unsubscribe from all subscriptions this._unsubscribeAll.next(); this._unsubscribeAll.complete(); } } ================================================ FILE: webapp/frontend/src/app/layout/layouts/empty/empty.module.ts ================================================ 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 { } ================================================ FILE: webapp/frontend/src/app/layout/layouts/horizontal/material/material.component.html ================================================
{{appVersion}}
================================================ FILE: webapp/frontend/src/app/layout/layouts/horizontal/material/material.component.scss ================================================ @import 'treo'; material-layout { position: relative; display: flex; flex: 1 1 auto; width: 100%; > treo-vertical-navigation { .treo-vertical-navigation-content-header { .logo { display: flex; align-items: center; height: 80px; min-height: 80px; max-height: 80px; padding: 24px 32px 0 32px; img { max-width: 96px; } } } } > .wrapper { display: flex; flex-direction: column; align-items: center; flex: 1 1 auto; min-width: 0; > .header { position: relative; display: flex; justify-content: center; width: 100%; overflow: hidden; z-index: 49; .container { position: relative; max-width: 1440px; width: calc(100% - 64px); margin: 48px 32px 0 32px; padding: 16px 0 12px 0; border-bottom-width: 1px; border-radius: 12px 12px 0 0; box-shadow: 0 0 25px 0 rgba(0, 0, 0, 0.1), 0 0 10px 0 rgba(0, 0, 0, 0.04); overflow: hidden; @include treo-breakpoint('lt-md') { margin-top: 32px; padding: 12px 0; } @include treo-breakpoint('xs') { width: 100%; margin: 0; padding: 0; border-radius: 0; box-shadow: none; } .top-bar, .bottom-bar { display: flex; flex: 1 1 auto; align-items: center; height: 64px; max-height: 64px; min-height: 64px; } .top-bar { position: relative; padding: 0 24px; @include treo-breakpoint('lt-md') { padding: 0 16px; } } .bottom-bar { padding: 0 16px; } .logo { display: flex; align-items: center; margin: 0 8px; img { width: 150px; min-width: 100px; max-width: 175px; } } .navigation-toggle-button { margin-right: 8px; } .spacer { display: flex; flex: 1 1 auto; height: 1px; } search { margin-right: 8px; } shortcuts { margin-right: 8px; } messages { margin-right: 8px; } notifications { margin-right: 8px; } } } > .content { display: flex; flex-direction: column; flex: 1 1 auto; max-width: 1440px; width: calc(100% - 64px); margin: 0 32px; box-shadow: 0 0 25px 0 rgba(0, 0, 0, 0.1), 0 0 10px 0 rgba(0, 0, 0, 0.04); @include treo-breakpoint('xs') { width: 100%; margin: 0; box-shadow: none; } > *:not(router-outlet) { position: relative; display: flex; flex: 1 1 auto; } } > .footer { display: flex; flex: 1 1 auto; align-items: center; justify-content: flex-start; max-width: 1440px; width: calc(100% - 64px); height: 80px; max-height: 80px; min-height: 80px; margin: 0 32px; padding: 0 24px; z-index: 49; border-top-width: 1px; box-shadow: 0 0 25px 0 rgba(0, 0, 0, 0.1), 0 0 10px 0 rgba(0, 0, 0, 0.04); @include treo-breakpoint('xs') { width: 100%; margin: 0; box-shadow: none; } @include treo-breakpoint('xs') { height: 56px; max-height: 56px; min-height: 56px; } } } &.fixed-header { > .wrapper { > .header { position: sticky; top: 0; } } } &.fixed-footer { > .wrapper { > .footer { position: sticky; bottom: 0; } } } } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $background: map-get($theme, background); $foreground: map-get($theme, foreground); $primary: map-get($theme, primary); $is-dark: map-get($theme, is-dark); material-layout { > .wrapper { @if ($is-dark) { background: map-get($background, card); } @else { background: treo-color('cool-gray', 200); } > .header { background: map-get($primary, 700); .container { background: map-get($background, card); .logo { .logo-text { @if ($is-dark) { display: none; } } .logo-text-on-dark { @if (not $is-dark) { display: none; } } } } } > .content { background: map-get($background, background); } > .footer { @if (not $is-dark) { background: map-get($background, card); } color: map-get($foreground, secondary-text); } } } } ================================================ FILE: webapp/frontend/src/app/layout/layouts/horizontal/material/material.component.ts ================================================ import { Component, HostBinding, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; import { ActivatedRoute, Data, Router } from '@angular/router'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { TreoMediaWatcherService } from '@treo/services/media-watcher'; import { TreoNavigationService } from '@treo/components/navigation'; import {versionInfo} from 'environments/versions'; @Component({ selector : 'material-layout', templateUrl : './material.component.html', styleUrls : ['./material.component.scss'], encapsulation: ViewEncapsulation.None }) export class MaterialLayoutComponent implements OnInit, OnDestroy { appVersion: string; data: any; isScreenSmall: boolean; @HostBinding('class.fixed-header') fixedHeader: boolean; @HostBinding('class.fixed-footer') fixedFooter: boolean; // Private private _unsubscribeAll: Subject; /** * Constructor * * @param {ActivatedRoute} _activatedRoute * @param {TreoMediaWatcherService} _treoMediaWatcherService * @param {TreoNavigationService} _treoNavigationService * @param {Router} _router */ constructor( private _activatedRoute: ActivatedRoute, private _treoMediaWatcherService: TreoMediaWatcherService, private _treoNavigationService: TreoNavigationService, private _router: Router ) { // Set the private defaults this._unsubscribeAll = new Subject(); // Set the defaults this.fixedHeader = false; this.fixedFooter = false; this.appVersion = versionInfo.version } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Getter for current year */ get currentYear(): number { return new Date().getFullYear(); } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Subscribe to the resolved route data this._activatedRoute.data.subscribe((data: Data) => { this.data = data.initialData; }); // Subscribe to media changes this._treoMediaWatcherService.onMediaChange$ .pipe(takeUntil(this._unsubscribeAll)) .subscribe(({matchingAliases}) => { // Check if the breakpoint is 'lt-md' this.isScreenSmall = matchingAliases.includes('lt-md'); }); } /** * On destroy */ ngOnDestroy(): void { // Unsubscribe from all subscriptions this._unsubscribeAll.next(); this._unsubscribeAll.complete(); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Toggle navigation * * @param key */ toggleNavigation(key): void { // Get the navigation const navigation = this._treoNavigationService.getComponent(key); if ( navigation ) { // Toggle the opened status navigation.toggle(); } } } ================================================ FILE: webapp/frontend/src/app/layout/layouts/horizontal/material/material.module.ts ================================================ 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 { TreoNavigationModule } from '@treo/components/navigation'; import { SearchModule } from 'app/layout/common/search/search.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, TreoNavigationModule, SearchModule, SharedModule ], exports : [ MaterialLayoutComponent ] }) export class MaterialLayoutModule { } ================================================ FILE: webapp/frontend/src/app/modules/dashboard/dashboard.component.html ================================================

Dashboard

Drive health at a glance

{{ hostId.key }}

Temperature
Temperature history for each device

No Devices Detected!

Scrutiny includes a Collector agent that you must run on all of your systems. The Collector is responsible for detecting connected storage devices and collecting S.M.A.R.T data on a configurable schedule.


You can trigger the Collector manually by running the following command, then refreshing this page:

scrutiny-collector-metrics run
================================================ FILE: webapp/frontend/src/app/modules/dashboard/dashboard.component.scss ================================================ @import 'treo'; example { } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $background: map-get($theme, background); $foreground: map-get($theme, foreground); $primary: map-get($theme, primary); $accent: map-get($theme, accent); $warn: map-get($theme, warn); $is-dark: map-get($theme, is-dark); example { } } .dashboard-placeholder { align-items: center; justify-content: center; padding: 32px; img { max-width:500px; } } ================================================ FILE: webapp/frontend/src/app/modules/dashboard/dashboard.component.ts ================================================ import { AfterViewInit, ChangeDetectionStrategy, Component, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; import {Subject} from 'rxjs'; import {takeUntil} from 'rxjs/operators'; import {ApexOptions, ChartComponent} from 'ng-apexcharts'; import {DashboardService} from 'app/modules/dashboard/dashboard.service'; import {MatDialog} from '@angular/material/dialog'; import {DashboardSettingsComponent} from 'app/layout/common/dashboard-settings/dashboard-settings.component'; import {AppConfig} from 'app/core/config/app.config'; import {ScrutinyConfigService} from 'app/core/config/scrutiny-config.service'; import {Router} from '@angular/router'; import {TemperaturePipe} from 'app/shared/temperature.pipe'; import {DeviceTitlePipe} from 'app/shared/device-title.pipe'; import {DeviceSummaryModel} from 'app/core/models/device-summary-model'; @Component({ selector : 'example', templateUrl : './dashboard.component.html', styleUrls : ['./dashboard.component.scss'], encapsulation : ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush }) export class DashboardComponent implements OnInit, AfterViewInit, OnDestroy { summaryData: { [key: string]: DeviceSummaryModel }; hostGroups: { [hostId: string]: string[] } = {} temperatureOptions: ApexOptions; tempDurationKey = 'week' config: AppConfig; showArchived: boolean; // Private private _unsubscribeAll: Subject; @ViewChild('tempChart', { static: false }) tempChart: ChartComponent; /** * Constructor * * @param {DashboardService} _dashboardService * @param {ScrutinyConfigService} _configService * @param {MatDialog} dialog * @param {Router} router */ constructor( private _dashboardService: DashboardService, private _configService: ScrutinyConfigService, public dialog: MatDialog, private router: Router, ) { // Set the private defaults this._unsubscribeAll = new Subject(); } // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Subscribe to config changes this._configService.config$ .pipe(takeUntil(this._unsubscribeAll)) .subscribe((config: AppConfig) => { // check if the old config and the new config do not match. const oldConfig = JSON.stringify(this.config) const newConfig = JSON.stringify(config) if(oldConfig !== newConfig){ console.log(`Configuration updated: ${newConfig} vs ${oldConfig}`) // Store the config this.config = config; if(oldConfig){ console.log('reloading component...') this.refreshComponent() } } }); // Get the data this._dashboardService.data$ .pipe(takeUntil(this._unsubscribeAll)) .subscribe((data) => { // Store the data this.summaryData = data; // generate group data. for (const wwn in this.summaryData) { const hostid = this.summaryData[wwn].device.host_id const hostDeviceList = this.hostGroups[hostid] || [] hostDeviceList.push(wwn) this.hostGroups[hostid] = hostDeviceList } console.log(this.hostGroups) // Prepare the chart data this._prepareChartData(); }); } /** * After view init */ ngAfterViewInit(): void {} /** * On destroy */ ngOnDestroy(): void { // Unsubscribe from all subscriptions this._unsubscribeAll.next(); this._unsubscribeAll.complete(); } // ----------------------------------------------------------------------------------------------------- // @ Private methods // ----------------------------------------------------------------------------------------------------- private refreshComponent(): void { const currentUrl = this.router.url; this.router.routeReuseStrategy.shouldReuseRoute = () => false; this.router.onSameUrlNavigation = 'reload'; this.router.navigate([currentUrl]); } private _deviceDataTemperatureSeries(): any[] { const deviceTemperatureSeries = [] console.log('DEVICE DATA SUMMARY', this.summaryData) for (const wwn in this.summaryData) { const deviceSummary = this.summaryData[wwn] if (!deviceSummary.temp_history) { continue } const deviceName = DeviceTitlePipe.deviceTitleWithFallback(deviceSummary.device, this.config.dashboard_display) const deviceSeriesMetadata = { name: deviceName, data: [] } for(const tempHistory of deviceSummary.temp_history){ const newDate = new Date(tempHistory.date); let temperature; switch (this.config.temperature_unit) { case 'celsius': temperature = tempHistory.temp; break case 'fahrenheit': temperature = TemperaturePipe.celsiusToFahrenheit(tempHistory.temp) break } deviceSeriesMetadata.data.push({ x: newDate, y: temperature }) } deviceTemperatureSeries.push(deviceSeriesMetadata) } return deviceTemperatureSeries } /** * Prepare the chart data from the data * * @private */ private _prepareChartData(): void { // Account balance this.temperatureOptions = { chart : { animations: { speed : 400, animateGradually: { enabled: false } }, fontFamily: 'inherit', foreColor : 'inherit', width : '100%', height : '100%', type : 'area', sparkline : { enabled: true } }, colors : ['#667eea', '#9066ea', '#66c0ea', '#66ead2', '#d266ea', '#66ea90'], fill : { colors : ['#b2bef4', '#c7b2f4', '#b2dff4', '#b2f4e8', '#e8b2f4', '#b2f4c7'], opacity: 0.5, type : 'gradient' }, series : this._deviceDataTemperatureSeries(), stroke : { curve: this.config.line_stroke, width: 2 }, tooltip: { theme: 'dark', shared: true, intersect: false, x : { format: 'MMM dd, yyyy HH:mm:ss' }, y : { formatter: (value) => { return TemperaturePipe.formatTemperature(value, this.config.temperature_unit, true) as string; } } }, xaxis: { type: 'datetime', labels: { datetimeUTC: false } } }; } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- deviceSummariesForHostGroup(hostGroupWWNs: string[]): DeviceSummaryModel[] { const deviceSummaries: DeviceSummaryModel[] = [] for (const wwn of hostGroupWWNs) { if (this.summaryData[wwn]) { deviceSummaries.push(this.summaryData[wwn]) } } return deviceSummaries } openDialog(): void { const dialogRef = this.dialog.open(DashboardSettingsComponent, {width: '600px',}); dialogRef.afterClosed().subscribe(result => { console.log(`Dialog result: ${result}`); }); } onDeviceDeleted(wwn: string): void { delete this.summaryData[wwn] // remove the device from the summary list. } onDeviceArchived(wwn: string): void { this.summaryData[wwn].device.archived = true; } onDeviceUnarchived(wwn: string): void { this.summaryData[wwn].device.archived = false; } /* DURATION_KEY_DAY = "day" DURATION_KEY_WEEK = "week" DURATION_KEY_MONTH = "month" DURATION_KEY_YEAR = "year" DURATION_KEY_FOREVER = "forever" */ changeSummaryTempDuration(durationKey: string): void { this.tempDurationKey = durationKey this._dashboardService.getSummaryTempData(durationKey) .subscribe((tempHistoryData) => { // given a list of device temp history, override the data in the "summary" object. for (const wwn in this.summaryData) { // console.log(`Updating ${wwn}, length: ${this.data.data.summary[wwn].temp_history.length}`) this.summaryData[wwn].temp_history = tempHistoryData[wwn] || [] } // Prepare the chart series data this.tempChart.updateSeries(this._deviceDataTemperatureSeries()) }); } /** * Track by function for ngFor loops * * @param index * @param item */ trackByFn(index: number, item: any): any { return item.id || index; } } ================================================ FILE: webapp/frontend/src/app/modules/dashboard/dashboard.module.ts ================================================ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; import { SharedModule } from 'app/shared/shared.module'; import { DashboardComponent } from 'app/modules/dashboard/dashboard.component'; import { dashboardRoutes } from 'app/modules/dashboard/dashboard.routing'; 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 { MatProgressBarModule } from '@angular/material/progress-bar'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; import { NgApexchartsModule } from 'ng-apexcharts'; import { MatTooltipModule } from '@angular/material/tooltip' import { DashboardSettingsModule } from 'app/layout/common/dashboard-settings/dashboard-settings.module'; import { DashboardDeviceModule } from 'app/layout/common/dashboard-device/dashboard-device.module'; @NgModule({ declarations: [ DashboardComponent ], imports: [ RouterModule.forChild(dashboardRoutes), MatButtonModule, MatDividerModule, MatTooltipModule, MatIconModule, MatMenuModule, MatProgressBarModule, MatSortModule, MatTableModule, NgApexchartsModule, SharedModule, DashboardSettingsModule, DashboardDeviceModule ] }) export class DashboardModule { } ================================================ FILE: webapp/frontend/src/app/modules/dashboard/dashboard.resolvers.ts ================================================ import {Injectable} from '@angular/core'; import {ActivatedRouteSnapshot, Resolve, RouterStateSnapshot} from '@angular/router'; import {Observable} from 'rxjs'; import {DashboardService} from 'app/modules/dashboard/dashboard.service'; import {DeviceSummaryModel} from 'app/core/models/device-summary-model'; @Injectable({ providedIn: 'root' }) export class DashboardResolver implements Resolve { /** * Constructor * * @param {FinanceService} _dashboardService */ constructor( private _dashboardService: DashboardService ) { } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Resolver * * @param route * @param state */ resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<{ [p: string]: DeviceSummaryModel }> { return this._dashboardService.getSummaryData(); } } ================================================ FILE: webapp/frontend/src/app/modules/dashboard/dashboard.routing.ts ================================================ import { Route } from '@angular/router'; import { DashboardComponent } from 'app/modules/dashboard/dashboard.component'; import {DashboardResolver} from 'app/modules/dashboard/dashboard.resolvers'; export const dashboardRoutes: Route[] = [ { path : '', component: DashboardComponent, resolve : { sales: DashboardResolver } } ]; ================================================ FILE: webapp/frontend/src/app/modules/dashboard/dashboard.service.spec.ts ================================================ import {HttpClient} from '@angular/common/http'; import {DashboardService} from './dashboard.service'; import {of} from 'rxjs'; import {summary} from 'app/data/mock/summary/data' import {temp_history} from 'app/data/mock/summary/temp_history' import {DeviceSummaryModel} from 'app/core/models/device-summary-model'; import {SmartTemperatureModel} from 'app/core/models/measurements/smart-temperature-model'; describe('DashboardService', () => { let service: DashboardService; let httpClientSpy: jasmine.SpyObj; beforeEach(() => { httpClientSpy = jasmine.createSpyObj('HttpClient', ['get']); service = new DashboardService(httpClientSpy); }); it('should unwrap and return getSummaryData() (HttpClient called once)', (done: DoneFn) => { httpClientSpy.get.and.returnValue(of(summary)); service.getSummaryData().subscribe(value => { expect(value).toBe(summary.data.summary as { [key: string]: DeviceSummaryModel }); done(); }); expect(httpClientSpy.get.calls.count()) .withContext('one call') .toBe(1); }); it('should unwrap and return getSummaryTempData() (HttpClient called once)', (done: DoneFn) => { // const expectedHeroes: any[] = // [{ id: 1, name: 'A' }, { id: 2, name: 'B' }]; httpClientSpy.get.and.returnValue(of(temp_history)); service.getSummaryTempData('weekly').subscribe(value => { expect(value).toBe(temp_history.data.temp_history as { [key: string]: SmartTemperatureModel[] }); done(); }); expect(httpClientSpy.get.calls.count()) .withContext('one call') .toBe(1); }); }); ================================================ FILE: webapp/frontend/src/app/modules/dashboard/dashboard.service.ts ================================================ import {Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; import {BehaviorSubject, Observable} from 'rxjs'; import {map, tap} from 'rxjs/operators'; import {getBasePath} from 'app/app.routing'; import {DeviceSummaryResponseWrapper} from 'app/core/models/device-summary-response-wrapper'; import {DeviceSummaryModel} from 'app/core/models/device-summary-model'; import {SmartTemperatureModel} from 'app/core/models/measurements/smart-temperature-model'; import {DeviceSummaryTempResponseWrapper} from 'app/core/models/device-summary-temp-response-wrapper'; @Injectable({ providedIn: 'root' }) export class DashboardService { // Observables private _data: BehaviorSubject<{ [p: string]: DeviceSummaryModel }>; /** * Constructor * * @param {HttpClient} _httpClient */ constructor( private _httpClient: HttpClient ) { // Set the private defaults this._data = new BehaviorSubject(null); } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Getter for data */ get data$(): Observable<{ [p: string]: DeviceSummaryModel }> { return this._data.asObservable(); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Get data */ getSummaryData(): Observable<{ [key: string]: DeviceSummaryModel }> { return this._httpClient.get(getBasePath() + '/api/summary').pipe( map((response: DeviceSummaryResponseWrapper) => { // console.log("FILTERING=----", response.data.summary) return response.data.summary }), tap((response: { [key: string]: DeviceSummaryModel }) => { this._data.next(response); }) ); } getSummaryTempData(durationKey: string): Observable<{ [key: string]: SmartTemperatureModel[] }> { const params = {} if (durationKey) { params['duration_key'] = durationKey } return this._httpClient.get(getBasePath() + '/api/summary/temp', {params: params}).pipe( map((response: DeviceSummaryTempResponseWrapper) => { return response.data.temp_history }) ); } } ================================================ FILE: webapp/frontend/src/app/modules/detail/detail.component.html ================================================

Drive Details - {{device | deviceTitle:config.dashboard_display}}

Dive into S.M.A.R.T data
{{device | deviceStatus:!!smart_results:config.metrics.status_threshold:true}}
Status
{{device?.host_id}}
Host ID
{{device?.device_uuid}}
Device UUID
{{device?.device_label}}
Device Label
{{device?.device_type | uppercase}}
Device Type
{{device?.manufacturer}}
Model Family
{{device?.model_name}}
Device Model
{{device?.serial_number}}
Serial Number
{{device?.wwn}}
LU WWN Device Id
{{device?.firmware}}
Firmware Version
{{device?.capacity | fileSize:config.file_size_si_units}}
Capacity
{{device?.rotational_speed}} RPM
Rotation Rate
{{device?.device_protocol}}
Protocol
{{smart_results[0]?.power_cycle_count}}
Power Cycle Count
{{ smart_results[0]?.power_on_hours | deviceHours:config.powered_on_hours_unit:{ round: true, largest: 1, units: ['y', 'd', 'h'] } }}
Powered On
{{smart_results[0]?.temp | temperature:config.temperature_unit:true}}
Temperature
S.M.A.R.T {{device?.device_protocol}} Attributes
{{this.smartAttributeDataSource.data.length}} visible, {{getHiddenAttributes()}} hidden
Status {{getAttributeStatusName(attribute.status)}} ID {{attribute.attribute_id}} ({{toHex(attribute.attribute_id)}}) Name {{getAttributeName(attribute)}} Value {{getAttributeValue(attribute)}} Worst {{getAttributeWorst(attribute)}} Threshold {{getAttributeThreshold(attribute)}} Ideal {{getAttributeIdeal(attribute) }} Failure Rate {{attribute.failure_rate | percent}} History
{{getAttributeDescription(attribute)}}
Type
Value
Worst/Thresh
Failure %
Scrutiny
{{getAttributeValue(attribute)}}
--
{{(attribute.failure_rate | percent) || '--'}}
Normalized
{{attribute.value}}
{{getAttributeWorst(attribute) || '--' }}/{{getAttributeThreshold(attribute)}}
--
Raw
{{attribute.raw_value}}
--
--
================================================ FILE: webapp/frontend/src/app/modules/detail/detail.component.scss ================================================ @import 'treo'; detail { } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { $background: map-get($theme, background); $foreground: map-get($theme, foreground); $primary: map-get($theme, primary); $accent: map-get($theme, accent); $warn: map-get($theme, warn); $is-dark: map-get($theme, is-dark); detail { } } //table { // width: 100%; //} $primary: map-get($theme, primary); $is-dark: map-get($theme, is-dark); tr.attribute-detail-row { height: 0; } //tr.attribute-row:not(.attribute-expanded-row):hover { // @if ($is-dark) { // background: rgba(0, 0, 0, 0.05); // } @else { // background: map-get($primary, 50); // } //} tr.attribute-row:not(.attribute-expanded-row):active { background: #efefef; } .attribute-row td { border-bottom-width: 0; } .attribute-detail { overflow: hidden; display: flex; } ================================================ FILE: webapp/frontend/src/app/modules/detail/detail.component.ts ================================================ import humanizeDuration from 'humanize-duration'; import {AfterViewInit, Component, Inject, LOCALE_ID, OnDestroy, OnInit, ViewChild} from '@angular/core'; import {ApexOptions} from 'ng-apexcharts'; import {AppConfig} from 'app/core/config/app.config'; import {DetailService} from './detail.service'; import {DetailSettingsComponent} from 'app/layout/common/detail-settings/detail-settings.component'; import {MatDialog} from '@angular/material/dialog'; import {MatSort} from '@angular/material/sort'; import {MatTableDataSource} from '@angular/material/table'; import {Subject} from 'rxjs'; import {ScrutinyConfigService} from 'app/core/config/scrutiny-config.service'; import {animate, state, style, transition, trigger} from '@angular/animations'; import {formatDate} from '@angular/common'; import {takeUntil} from 'rxjs/operators'; import {DeviceModel} from 'app/core/models/device-model'; import {SmartModel} from 'app/core/models/measurements/smart-model'; import {SmartAttributeModel} from 'app/core/models/measurements/smart-attribute-model'; import {AttributeMetadataModel} from 'app/core/models/thresholds/attribute-metadata-model'; import {DeviceStatusPipe} from 'app/shared/device-status.pipe'; // from Constants.go - these must match const AttributeStatusPassed = 0 const AttributeStatusFailedSmart = 1 const AttributeStatusWarningScrutiny = 2 const AttributeStatusFailedScrutiny = 4 @Component({ selector: 'detail', templateUrl: './detail.component.html', styleUrls: ['./detail.component.scss'], animations: [ trigger('detailExpand', [ state('collapsed', style({height: '0px', minHeight: '0'})), state('expanded', style({height: '*'})), transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')), ]), ], }) export class DetailComponent implements OnInit, AfterViewInit, OnDestroy { /** * Constructor * * @param {DetailService} _detailService * @param {MatDialog} dialog * @param {ScrutinyConfigService} _configService * @param {string} locale */ constructor( private _detailService: DetailService, public dialog: MatDialog, private _configService: ScrutinyConfigService, @Inject(LOCALE_ID) public locale: string ) { // Set the private defaults this._unsubscribeAll = new Subject(); // Set the defaults this.smartAttributeDataSource = new MatTableDataSource(); // this.recentTransactionsTableColumns = ['status', 'id', 'name', 'value', 'worst', 'thresh']; this.smartAttributeTableColumns = ['status', 'id', 'name', 'value', 'worst', 'thresh', 'ideal', 'failure', 'history']; this.systemPrefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; } config: AppConfig; onlyCritical = true; // data: any; expandedAttribute: SmartAttributeModel | null; metadata: { [p: string]: AttributeMetadataModel } | { [p: number]: AttributeMetadataModel }; device: DeviceModel; // tslint:disable-next-line:variable-name smart_results: SmartModel[]; commonSparklineOptions: Partial; smartAttributeDataSource: MatTableDataSource; smartAttributeTableColumns: string[]; @ViewChild('smartAttributeTable', {read: MatSort}) smartAttributeTableMatSort: MatSort; // Private private _unsubscribeAll: Subject; private systemPrefersDark: boolean; readonly humanizeDuration = humanizeDuration; deviceStatusForModelWithThreshold = DeviceStatusPipe.deviceStatusForModelWithThreshold // ----------------------------------------------------------------------------------------------------- // @ Lifecycle hooks // ----------------------------------------------------------------------------------------------------- /** * On init */ ngOnInit(): void { // Subscribe to config changes this._configService.config$ .pipe(takeUntil(this._unsubscribeAll)) .subscribe((config: AppConfig) => { this.config = config; }); // Get the data this._detailService.data$ .pipe(takeUntil(this._unsubscribeAll)) .subscribe((respWrapper) => { // Store the data // this.data = data; this.device = respWrapper.data.device; this.smart_results = respWrapper.data.smart_results this.metadata = respWrapper.metadata; // Store the table data this.smartAttributeDataSource.data = this._generateSmartAttributeTableDataSource(this.smart_results); // Prepare the chart data this._prepareChartData(); }); } /** * After view init */ ngAfterViewInit(): void { // Make the data source sortable this.smartAttributeDataSource.sort = this.smartAttributeTableMatSort; } /** * On destroy */ ngOnDestroy(): void { // Unsubscribe from all subscriptions this._unsubscribeAll.next(); this._unsubscribeAll.complete(); } // ----------------------------------------------------------------------------------------------------- // @ Private methods // ----------------------------------------------------------------------------------------------------- getAttributeStatusName(attributeStatus: number): string { // tslint:disable:no-bitwise if (attributeStatus === AttributeStatusPassed) { return 'passed' } else if ((attributeStatus & AttributeStatusFailedScrutiny) !== 0 || (attributeStatus & AttributeStatusFailedSmart) !== 0) { return 'failed' } else if ((attributeStatus & AttributeStatusWarningScrutiny) !== 0) { return 'warn' } return '' // tslint:enable:no-bitwise } getAttributeScrutinyStatusName(attributeStatus: number): string { // tslint:disable:no-bitwise if ((attributeStatus & AttributeStatusFailedScrutiny) !== 0) { return 'failed' } else if ((attributeStatus & AttributeStatusWarningScrutiny) !== 0) { return 'warn' } else { return 'passed' } // tslint:enable:no-bitwise } getAttributeSmartStatusName(attributeStatus: number): string { // tslint:disable:no-bitwise if ((attributeStatus & AttributeStatusFailedSmart) !== 0) { return 'failed' } else { return 'passed' } // tslint:enable:no-bitwise } getAttributeName(attributeData: SmartAttributeModel): string { const attributeMetadata = this.metadata[attributeData.attribute_id] if (!attributeMetadata) { return 'Unknown Attribute Name' } else { return attributeMetadata.display_name } } getAttributeDescription(attributeData: SmartAttributeModel): string { const attributeMetadata = this.metadata[attributeData.attribute_id] if (!attributeMetadata) { return 'Unknown' } else { return attributeMetadata.description } } getAttributeValue(attributeData: SmartAttributeModel): number { if (this.isAta()) { const attributeMetadata = this.metadata[attributeData.attribute_id] if (!attributeMetadata) { return attributeData.value } else if (attributeMetadata.display_type === 'raw') { return attributeData.raw_value } else if (attributeMetadata.display_type === 'transformed' && attributeData.transformed_value) { return attributeData.transformed_value } else { return attributeData.value } } else { return attributeData.value } } getAttributeValueType(attributeData: SmartAttributeModel): string { if (this.isAta()) { const attributeMetadata = this.metadata[attributeData.attribute_id] if (!attributeMetadata) { return '' } else { return attributeMetadata.display_type } } else { return '' } } getAttributeIdeal(attributeData: SmartAttributeModel): string { if (this.isAta()) { return this.metadata[attributeData.attribute_id]?.display_type === 'raw' ? this.metadata[attributeData.attribute_id]?.ideal : '' } else { return this.metadata[attributeData.attribute_id]?.ideal } } getAttributeWorst(attributeData: SmartAttributeModel): number | string { const attributeMetadata = this.metadata[attributeData.attribute_id] if (!attributeMetadata) { return attributeData.worst } else { return attributeMetadata?.display_type === 'normalized' ? attributeData.worst : '' } } getAttributeThreshold(attributeData: SmartAttributeModel): number | string { if (this.isAta()) { const attributeMetadata = this.metadata[attributeData.attribute_id] if (!attributeMetadata || attributeMetadata.display_type === 'normalized') { return attributeData.thresh } else { // if(this.data.metadata[attribute_data.attribute_id].observed_thresholds){ // // } else { // } // return '' return attributeData.thresh } } else { return (attributeData.thresh === -1 ? '' : attributeData.thresh) } } getAttributeCritical(attributeData: SmartAttributeModel): boolean { return this.metadata[attributeData.attribute_id]?.critical } getHiddenAttributes(): number { if (!this.smart_results || this.smart_results.length === 0) { return 0 } let attributesLength = 0 const attributes = this.smart_results[0]?.attrs if (attributes) { attributesLength = Object.keys(attributes).length } return attributesLength - this.smartAttributeDataSource.data.length } isAta(): boolean { return this.device.device_protocol === 'ATA' } isScsi(): boolean { return this.device.device_protocol === 'SCSI' } isNvme(): boolean { return this.device.device_protocol === 'NVMe' } private _generateSmartAttributeTableDataSource(smartResults: SmartModel[]): SmartAttributeModel[] { const smartAttributeDataSource: SmartAttributeModel[] = []; if (smartResults.length === 0) { return smartAttributeDataSource } const latestSmartResult = smartResults[0]; let attributes: { [p: string]: SmartAttributeModel } = {} if (this.isScsi()) { this.smartAttributeTableColumns = ['status', 'name', 'value', 'thresh', 'history']; attributes = latestSmartResult.attrs } else if (this.isNvme()) { this.smartAttributeTableColumns = ['status', 'name', 'value', 'thresh', 'ideal', 'history']; attributes = latestSmartResult.attrs } else { // ATA attributes = latestSmartResult.attrs this.smartAttributeTableColumns = ['status', 'id', 'name', 'value', 'thresh', 'ideal', 'failure', 'history']; } for (const attrId in attributes) { const attr = attributes[attrId] // chart history data if (!attr.chartData) { const attrHistory = [] for (const smartResult of smartResults) { // attrHistory.push(this.getAttributeValue(smart_result.attrs[attrId])) const chartDatapoint = { x: formatDate(smartResult.date, 'MMMM dd, yyyy - HH:mm', this.locale), y: this.getAttributeValue(smartResult.attrs[attrId]) } const attributeStatusName = this.getAttributeStatusName(smartResult.attrs[attrId].status) if (attributeStatusName === 'failed') { chartDatapoint['strokeColor'] = '#F05252' chartDatapoint['fillColor'] = '#F05252' } else if (attributeStatusName === 'warn') { chartDatapoint['strokeColor'] = '#C27803' chartDatapoint['fillColor'] = '#C27803' } attrHistory.push(chartDatapoint) } // var rawHistory = (attr.history || []).map(hist_attr => this.getAttributeValue(hist_attr)).reverse() // rawHistory.push(this.getAttributeValue(attr)) attributes[attrId].chartData = [ { name: 'chart-line-sparkline', // attrHistory needs to be reversed, so the newest data is on the right // fixes #339 data: attrHistory.reverse() } ] } // determine when to include the attributes in table. if (!this.onlyCritical || this.onlyCritical && this.metadata[attr.attribute_id]?.critical || attr.value < attr.thresh) { smartAttributeDataSource.push(attr) } } return smartAttributeDataSource } /** * Prepare the chart data from the data * * @private */ private _prepareChartData(): void { // Account balance this.commonSparklineOptions = { chart: { type: 'bar', width: 100, height: 25, sparkline: { enabled: true }, animations: { enabled: false } }, // theme:{ // // @ts-ignore // // mode: // mode: 'dark', // }, tooltip: { fixed: { enabled: false }, x: { show: true }, y: { title: { formatter: (seriesName) => { return ''; } } }, marker: { show: false }, theme: this.determineTheme(this.config) }, stroke: { width: 2, colors: ['#667EEA'] } }; } private determineTheme(config: AppConfig): string { if (config.theme === 'system') { return this.systemPrefersDark ? 'dark' : 'light' } else { return config.theme } } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- toHex(decimalNumb: number | string): string { return '0x' + Number(decimalNumb).toString(16).padStart(2, '0').toUpperCase() } toggleOnlyCritical(): void { this.onlyCritical = !this.onlyCritical this.smartAttributeDataSource.data = this._generateSmartAttributeTableDataSource(this.smart_results); } openDialog(): void { const dialogRef = this.dialog.open(DetailSettingsComponent); dialogRef.afterClosed().subscribe(result => { console.log(`Dialog result: ${result}`); }); } /** * Track by function for ngFor loops * * @param index * @param item */ trackByFn(index: number, item: any): any { return index; // return item.id || index; } } ================================================ FILE: webapp/frontend/src/app/modules/detail/detail.module.ts ================================================ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; import { SharedModule } from 'app/shared/shared.module'; import { DetailComponent } from 'app/modules/detail/detail.component'; import { detailRoutes } from 'app/modules/detail/detail.routing'; 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 { 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 { TreoCardModule } from '@treo/components/card'; import {DetailSettingsModule} from 'app/layout/common/detail-settings/detail-settings.module'; @NgModule({ declarations: [ DetailComponent ], imports : [ RouterModule.forChild(detailRoutes), MatButtonModule, MatDividerModule, MatTooltipModule, MatIconModule, MatMenuModule, MatProgressBarModule, MatSortModule, MatTableModule, NgApexchartsModule, TreoCardModule, SharedModule, DetailSettingsModule, ] }) export class DetailModule { } ================================================ FILE: webapp/frontend/src/app/modules/detail/detail.resolvers.ts ================================================ import {Injectable} from '@angular/core'; import {ActivatedRouteSnapshot, Resolve, RouterStateSnapshot} from '@angular/router'; import {Observable} from 'rxjs'; import {DetailService} from 'app/modules/detail/detail.service'; import {DeviceDetailsResponseWrapper} from 'app/core/models/device-details-response-wrapper'; @Injectable({ providedIn: 'root' }) export class DetailResolver implements Resolve { /** * Constructor * * @param {FinanceService} _detailService */ constructor( private _detailService: DetailService ) { } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Resolver * * @param route * @param state */ resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { return this._detailService.getData(route.params.wwn); } } ================================================ FILE: webapp/frontend/src/app/modules/detail/detail.routing.ts ================================================ import { Route } from '@angular/router'; import { DetailComponent } from 'app/modules/detail/detail.component'; import {DetailResolver} from './detail.resolvers'; export const detailRoutes: Route[] = [ { path : '', component: DetailComponent, resolve : { sales: DetailResolver } } ]; ================================================ FILE: webapp/frontend/src/app/modules/detail/detail.service.spec.ts ================================================ import {HttpClient} from '@angular/common/http'; import {DetailService} from './detail.service'; import {of} from 'rxjs'; import {sda} from 'app/data/mock/device/details/sda' import {DeviceDetailsResponseWrapper} from 'app/core/models/device-details-response-wrapper'; describe('DetailService', () => { describe('#getData', () => { let service: DetailService; let httpClientSpy: jasmine.SpyObj; beforeEach(() => { httpClientSpy = jasmine.createSpyObj('HttpClient', ['get']); service = new DetailService(httpClientSpy); }); it('should return getData() (HttpClient called once)', (done: DoneFn) => { httpClientSpy.get.and.returnValue(of(sda)); service.getData('test').subscribe(value => { expect(value).toBe(sda as DeviceDetailsResponseWrapper); done(); }); expect(httpClientSpy.get.calls.count()) .withContext('one call') .toBe(1); }); }) }); ================================================ FILE: webapp/frontend/src/app/modules/detail/detail.service.ts ================================================ import {Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; import {BehaviorSubject, Observable} from 'rxjs'; import {tap} from 'rxjs/operators'; import {getBasePath} from 'app/app.routing'; import {DeviceDetailsResponseWrapper} from 'app/core/models/device-details-response-wrapper'; @Injectable({ providedIn: 'root' }) export class DetailService { // Observables private _data: BehaviorSubject; /** * Constructor * * @param {HttpClient} _httpClient */ constructor( private _httpClient: HttpClient ) { // Set the private defaults this._data = new BehaviorSubject(null); } // ----------------------------------------------------------------------------------------------------- // @ Accessors // ----------------------------------------------------------------------------------------------------- /** * Getter for data */ get data$(): Observable { return this._data.asObservable(); } // ----------------------------------------------------------------------------------------------------- // @ Public methods // ----------------------------------------------------------------------------------------------------- /** * Get data */ getData(wwn): Observable { return this._httpClient.get(getBasePath() + `/api/device/${wwn}/details`).pipe( tap((response: DeviceDetailsResponseWrapper) => { this._data.next(response); }) ); } } ================================================ FILE: webapp/frontend/src/app/modules/landing/home/home.component.html ================================================

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 multiple applications setup. You can have different entry points and essentially have different applications within the same codebase.

Launch the App
================================================ FILE: webapp/frontend/src/app/modules/landing/home/home.component.scss ================================================ @import 'treo'; landing-home { } // ----------------------------------------------------------------------------------------------------- // @ Theming // ----------------------------------------------------------------------------------------------------- @include treo-theme { } ================================================ FILE: webapp/frontend/src/app/modules/landing/home/home.component.ts ================================================ import { Component, ViewEncapsulation } from '@angular/core'; @Component({ selector : 'landing-home', templateUrl : './home.component.html', styleUrls : ['./home.component.scss'], encapsulation: ViewEncapsulation.None }) export class LandingHomeComponent { /** * Constructor */ constructor() { } } ================================================ FILE: webapp/frontend/src/app/modules/landing/home/home.module.ts ================================================ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; import { MatButtonModule } from '@angular/material/button'; 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, SharedModule ] }) export class LandingHomeModule { } ================================================ FILE: webapp/frontend/src/app/modules/landing/home/home.routing.ts ================================================ import { Route } from '@angular/router'; import { LandingHomeComponent } from 'app/modules/landing/home/home.component'; export const landingHomeRoutes: Route[] = [ { path : '', component: LandingHomeComponent } ]; ================================================ FILE: webapp/frontend/src/app/shared/device-hours.pipe.spec.ts ================================================ import { DeviceHoursPipe } from "./device-hours.pipe"; describe("DeviceHoursPipe", () => { it("create an instance", () => { const pipe = new DeviceHoursPipe(); expect(pipe).toBeTruthy(); }); describe("#transform", () => { const testCases = [ { input: 12345, configuration: "device_hours", result: "12345 hours", }, { input: 15273, configuration: "humanize", result: "1 year, 8 months, 3 weeks, 6 days, 15 hours", }, { input: 48, configuration: null, result: "2 days", }, { input: 168, configuration: "scrutiny", result: "1 week", }, { input: null, configuration: "device_hours", result: "Unknown", }, { input: null, configuration: "humanize", result: "Unknown", }, ]; testCases.forEach((test, index) => { it(`format input '${test.input}' with configuration '${test.configuration}', should be '${test.result}' (testcase: ${index + 1})`, () => { // test const pipe = new DeviceHoursPipe(); const formatted = pipe.transform(test.input, test.configuration); expect(formatted).toEqual(test.result); }); }); }); }); ================================================ FILE: webapp/frontend/src/app/shared/device-hours.pipe.ts ================================================ import { Pipe, PipeTransform } from '@angular/core'; import humanizeDuration from 'humanize-duration'; @Pipe({ name: 'deviceHours' }) export class DeviceHoursPipe implements PipeTransform { static format(hoursOfRunTime: number, unit: string, humanizeConfig: object): string { if (hoursOfRunTime === null) { return 'Unknown'; } if (unit === 'device_hours') { return `${hoursOfRunTime} hours`; } return humanizeDuration(hoursOfRunTime * 60 * 60 * 1000, humanizeConfig); } transform(hoursOfRunTime: number, unit = 'humanize', humanizeConfig: any = {}): string { return DeviceHoursPipe.format(hoursOfRunTime, unit, humanizeConfig) } } ================================================ FILE: webapp/frontend/src/app/shared/device-sort.pipe.spec.ts ================================================ import { DeviceSortPipe } from './device-sort.pipe'; describe('DeviceSortPipe', () => { it('create an instance', () => { const pipe = new DeviceSortPipe(); expect(pipe).toBeTruthy(); }); }); ================================================ FILE: webapp/frontend/src/app/shared/device-sort.pipe.ts ================================================ import { Pipe, PipeTransform } from '@angular/core'; import {DeviceTitlePipe} from 'app/shared/device-title.pipe'; @Pipe({ name: 'deviceSort' }) export class DeviceSortPipe implements PipeTransform { statusCompareFn(a: any, b: any): number { function deviceStatus(deviceSummary): number { if(!deviceSummary.smart){ return 0 } else if (deviceSummary.device.device_status === 0){ return 1 } else { return deviceSummary.device.device_status * -1 // will return range from -1, -2, -3 } } const left = deviceStatus(a) const right = deviceStatus(b) return left - right; } titleCompareFn(dashboardDisplay: string) { return function (a: any, b: any){ const _dashboardDisplay = dashboardDisplay const left = DeviceTitlePipe.deviceTitleForType(a.device, _dashboardDisplay) || DeviceTitlePipe.deviceTitleForType(a.device, 'name') const right = DeviceTitlePipe.deviceTitleForType(b.device, _dashboardDisplay) || DeviceTitlePipe.deviceTitleForType(b.device, 'name') if( left < right ) return -1; if( left > right ) return 1; return 0; } } ageCompareFn(a: any, b: any): number { const left = a.smart?.power_on_hours const right = b.smart?.power_on_hours return left - right; } transform(deviceSummaries: Array, sortBy = 'status', dashboardDisplay = 'name'): Array { let compareFn: any switch (sortBy) { case 'status': compareFn = this.statusCompareFn break; case 'title': compareFn = this.titleCompareFn(dashboardDisplay) break; case 'age': compareFn = this.ageCompareFn break; } // failed, unknown/empty, passed deviceSummaries.sort(compareFn); return deviceSummaries; } } ================================================ FILE: webapp/frontend/src/app/shared/device-status.pipe.spec.ts ================================================ import {DeviceStatusPipe} from './device-status.pipe'; import {MetricsStatusThreshold} from '../core/config/app.config'; import {DeviceModel} from '../core/models/device-model'; describe('DeviceStatusPipe', () => { it('create an instance', () => { const pipe = new DeviceStatusPipe(); expect(pipe).toBeTruthy(); }); describe('#deviceStatusForModelWithThreshold', () => { it('if healthy device, should be passing', () => { expect(DeviceStatusPipe.deviceStatusForModelWithThreshold( {device_status: 0} as DeviceModel, true, MetricsStatusThreshold.Both )).toBe('passed') }); it('if device with no smart data, should be unknown', () => { expect(DeviceStatusPipe.deviceStatusForModelWithThreshold( {device_status: 0} as DeviceModel, false, MetricsStatusThreshold.Both )).toBe('unknown') }); const testCases = [ { 'deviceStatus': 10000, // invalid status 'hasSmartResults': false, 'threshold': MetricsStatusThreshold.Smart, 'includeReason': false, 'result': 'unknown' }, { 'deviceStatus': 1, 'hasSmartResults': true, 'threshold': MetricsStatusThreshold.Smart, 'includeReason': false, 'result': 'failed' }, { 'deviceStatus': 1, 'hasSmartResults': true, 'threshold': MetricsStatusThreshold.Scrutiny, 'includeReason': false, 'result': 'passed' }, { 'deviceStatus': 1, 'hasSmartResults': true, 'threshold': MetricsStatusThreshold.Both, 'includeReason': false, 'result': 'failed' }, { 'deviceStatus': 2, 'hasSmartResults': true, 'threshold': MetricsStatusThreshold.Smart, 'includeReason': false, 'result': 'passed' }, { 'deviceStatus': 2, 'hasSmartResults': true, 'threshold': MetricsStatusThreshold.Scrutiny, 'includeReason': false, 'result': 'failed' }, { 'deviceStatus': 2, 'hasSmartResults': true, 'threshold': MetricsStatusThreshold.Both, 'includeReason': false, 'result': 'failed' }, { 'deviceStatus': 3, 'hasSmartResults': true, 'threshold': MetricsStatusThreshold.Smart, 'includeReason': false, 'result': 'failed' }, { 'deviceStatus': 3, 'hasSmartResults': true, 'threshold': MetricsStatusThreshold.Scrutiny, 'includeReason': false, 'result': 'failed' }, { 'deviceStatus': 3, 'hasSmartResults': true, 'threshold': MetricsStatusThreshold.Both, 'includeReason': false, 'result': 'failed' }, { 'deviceStatus': 3, 'hasSmartResults': false, 'threshold': MetricsStatusThreshold.Smart, 'includeReason': true, 'result': 'unknown' }, { 'deviceStatus': 3, 'hasSmartResults': true, 'threshold': MetricsStatusThreshold.Smart, 'includeReason': true, 'result': 'failed: smart' }, { 'deviceStatus': 3, 'hasSmartResults': true, 'threshold': MetricsStatusThreshold.Scrutiny, 'includeReason': true, 'result': 'failed: scrutiny' }, { 'deviceStatus': 3, 'hasSmartResults': true, 'threshold': MetricsStatusThreshold.Both, 'includeReason': true, 'result': 'failed: both' } ] testCases.forEach((test, index) => { it(`if device with status (${test.deviceStatus}), hasSmartResults(${test.hasSmartResults}) and threshold (${test.threshold}), should be ${test.result}`, () => { expect(DeviceStatusPipe.deviceStatusForModelWithThreshold( {device_status: test.deviceStatus} as DeviceModel, test.hasSmartResults, test.threshold, test.includeReason )).toBe(test.result) }); }); }); }); ================================================ FILE: webapp/frontend/src/app/shared/device-status.pipe.ts ================================================ import {Pipe, PipeTransform} from '@angular/core'; import {MetricsStatusThreshold} from '../core/config/app.config'; import {DeviceModel} from '../core/models/device-model'; const DEVICE_STATUS_NAMES: { [key: number]: string } = { 0: 'passed', 1: 'failed', 2: 'failed', 3: 'failed' }; const DEVICE_STATUS_NAMES_WITH_REASON: { [key: number]: string } = { 0: 'passed', 1: 'failed: smart', 2: 'failed: scrutiny', 3: 'failed: both' }; @Pipe({ name: 'deviceStatus' }) export class DeviceStatusPipe implements PipeTransform { static deviceStatusForModelWithThreshold( deviceModel: DeviceModel, hasSmartResults: boolean = true, threshold: MetricsStatusThreshold = MetricsStatusThreshold.Both, includeReason: boolean = false ): string { // no smart data, so treat the device status as unknown if (!hasSmartResults) { return 'unknown' } let statusNameLookup = DEVICE_STATUS_NAMES if (includeReason) { statusNameLookup = DEVICE_STATUS_NAMES_WITH_REASON } // determine the device status, by comparing it against the allowed threshold // tslint:disable-next-line:no-bitwise const deviceStatus = deviceModel.device_status & threshold return statusNameLookup[deviceStatus] } // static deviceStatusForModelWithThreshold(deviceModel: DeviceModel | any, threshold: MetricsStatusThreshold): string { // // tslint:disable-next-line:no-bitwise // const deviceStatus = deviceModel?.device_status & threshold // if(deviceStatus === 0){ // return 'passed' // } else if(deviceStatus === 3){ // return 'failed: both' // } else if(deviceStatus === 2) { // return 'failed: scrutiny' // } else if(deviceStatus === 1) { // return 'failed: smart' // } // return 'unknown' // } transform( deviceModel: DeviceModel, hasSmartResults: boolean = true, threshold: MetricsStatusThreshold = MetricsStatusThreshold.Both, includeReason: boolean = false ): string { return DeviceStatusPipe.deviceStatusForModelWithThreshold(deviceModel, hasSmartResults, threshold, includeReason) } } ================================================ FILE: webapp/frontend/src/app/shared/device-title.pipe.spec.ts ================================================ import {DeviceTitlePipe} from './device-title.pipe'; import {DeviceModel} from 'app/core/models/device-model'; describe('DeviceTitlePipe', () => { it('create an instance', () => { const pipe = new DeviceTitlePipe(); expect(pipe).toBeTruthy(); }); describe('#deviceTitleForType', () => { const testCases = [ { 'device': { 'device_name': 'sda', 'device_type': 'ata', 'model_name': 'Samsung', }, 'titleType': 'name', 'result': '/dev/sda - Samsung' },{ 'device': { 'device_name': 'nvme0', 'device_type': 'nvme', 'model_name': 'Samsung', }, 'titleType': 'name', 'result': '/dev/nvme0 - nvme - Samsung' },{ 'device': {}, 'titleType': 'serial_id', 'result': '' },{ 'device': { 'device_serial_id': 'ata-WDC_WD140EDFZ-11AXXXXX_9RXXXXXX', }, 'titleType': 'serial_id', 'result': '/by-id/ata-WDC_WD140EDFZ-11AXXXXX_9RXXXXXX' },{ 'device': {}, 'titleType': 'uuid', 'result': '' },{ 'device': { 'device_uuid': 'abcdef-1234-4567-8901' }, 'titleType': 'uuid', 'result': '/by-uuid/abcdef-1234-4567-8901' },{ 'device': {}, 'titleType': 'label', 'result': '' },{ 'device': { 'label': 'custom-device-label' }, 'titleType': 'label', 'result': 'custom-device-label' },{ 'device': { 'device_label': 'drive-volume-label' }, 'titleType': 'label', 'result': '/by-label/drive-volume-label' }, ] testCases.forEach((test, index) => { it(`should correctly format device title ${JSON.stringify(test.device)}. (testcase: ${index + 1})`, () => { // test const formatted = DeviceTitlePipe.deviceTitleForType(test.device as DeviceModel, test.titleType) expect(formatted).toEqual(test.result); }); }) }) describe('#deviceTitleWithFallback',() => { const testCases = [ { 'device': { 'device_name': 'sda', 'device_type': 'ata', 'model_name': 'Samsung', }, 'titleType': 'name', 'result': '/dev/sda - Samsung' },{ 'device': { 'device_name': 'nvme0', 'device_type': 'nvme', 'model_name': 'Samsung', }, 'titleType': 'name', 'result': '/dev/nvme0 - nvme - Samsung' },{ 'device': { 'device_name': 'fallback', 'device_type': 'ata', 'model_name': 'fallback', }, 'titleType': 'serial_id', 'result': '/dev/fallback - fallback' },{ 'device': { 'device_serial_id': 'ata-WDC_WD140EDFZ-11AXXXXX_9RXXXXXX', }, 'titleType': 'serial_id', 'result': '/by-id/ata-WDC_WD140EDFZ-11AXXXXX_9RXXXXXX' },{ 'device': { 'device_name': 'fallback', 'device_type': 'ata', 'model_name': 'fallback', }, 'titleType': 'uuid', 'result': '/dev/fallback - fallback' },{ 'device': { 'device_uuid': 'abcdef-1234-4567-8901' }, 'titleType': 'uuid', 'result': '/by-uuid/abcdef-1234-4567-8901' },{ 'device': { 'device_name': 'fallback', 'device_type': 'ata', 'model_name': 'fallback', }, 'titleType': 'label', 'result': '/dev/fallback - fallback' },{ 'device': { 'label': 'custom-device-label' }, 'titleType': 'label', 'result': 'custom-device-label' },{ 'device': { 'device_label': 'drive-volume-label' }, 'titleType': 'label', 'result': '/by-label/drive-volume-label' }, ] testCases.forEach((test, index) => { it(`should correctly format device title ${JSON.stringify(test.device)}. (testcase: ${index + 1})`, () => { // test const formatted = DeviceTitlePipe.deviceTitleWithFallback(test.device as DeviceModel, test.titleType) expect(formatted).toEqual(test.result); }); }) }) }); ================================================ FILE: webapp/frontend/src/app/shared/device-title.pipe.ts ================================================ import {Pipe, PipeTransform} from '@angular/core'; import {DeviceModel} from 'app/core/models/device-model'; @Pipe({ name: 'deviceTitle' }) export class DeviceTitlePipe implements PipeTransform { static deviceTitleForType(device: DeviceModel, titleType: string): string { const titleParts = [] switch(titleType){ case 'name': titleParts.push(`/dev/${device.device_name}`) if (device.device_type && device.device_type !== 'scsi' && device.device_type !== 'ata'){ titleParts.push(device.device_type) } titleParts.push(device.model_name) break; case 'serial_id': if(!device.device_serial_id) return '' titleParts.push(`/by-id/${device.device_serial_id}`) break; case 'uuid': if(!device.device_uuid) return '' titleParts.push(`/by-uuid/${device.device_uuid}`) break; case 'label': if(device.label){ titleParts.push(device.label) } else if(device.device_label){ titleParts.push(`/by-label/${device.device_label}`) } break; } return titleParts.join(' - ') } static deviceTitleWithFallback(device: DeviceModel, titleType: string): string { console.log(`Displaying Device ${device.wwn} with: ${titleType}`) const titleParts = [] if (device.host_id) titleParts.push(device.host_id) // add device identifier (fallback to generated device name) titleParts.push(DeviceTitlePipe.deviceTitleForType(device, titleType) || DeviceTitlePipe.deviceTitleForType(device, 'name')) return titleParts.join(' - ') } transform(device: DeviceModel, titleType: string = 'name'): string { return DeviceTitlePipe.deviceTitleWithFallback(device, titleType) } } ================================================ FILE: webapp/frontend/src/app/shared/file-size.pipe.spec.ts ================================================ import {FileSizePipe} from './file-size.pipe'; describe('FileSizePipe', () => { it('create an instance', () => { const pipe = new FileSizePipe(); expect(pipe).toBeTruthy(); }); describe('#transform',() => { const testCases = [ { 'bytes': 1500, 'si': false, 'result': '1.5 KiB' }, { 'bytes': 1500, 'si': true, 'result': '1.5 kB' }, { 'bytes': 5000, 'si': false, 'result': '4.9 KiB', }, { 'bytes': 5000, 'si': true, 'result': '5.0 kB', }, { 'bytes': 999_949, 'si': false, 'result': '976.5 KiB', }, { 'bytes': 999_949, 'si': true, 'result': '999.9 kB', }, { 'bytes': 999_950, 'si': true, 'result': '1.0 MB', }, { 'bytes': 1_551_859_712, 'si': false, 'result': '1.4 GiB', }, { 'bytes': 2_100_000_000, 'si': false, 'result': '2.0 GiB', }, { 'bytes': 2_100_000_000, 'si': true, 'result': '2.1 GB', } ] testCases.forEach((test, index) => { it(`should correctly format bytes ${test.bytes}. (testcase: ${index + 1})`, () => { // test const pipe = new FileSizePipe(); const formatted = pipe.transform(test.bytes, test.si) expect(formatted).toEqual(test.result); }); }) }) }); ================================================ FILE: webapp/frontend/src/app/shared/file-size.pipe.ts ================================================ import {Pipe, PipeTransform} from '@angular/core'; @Pipe({name: 'fileSize'}) export class FileSizePipe implements PipeTransform { transform(bytes: number = 0, si = false, dp = 1): string { const thresh = si ? 1000 : 1024; if (Math.abs(bytes) < thresh) { return bytes + ' B'; } const units = si ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']; let u = -1; const r = 10 ** dp; do { bytes /= thresh; ++u; } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1); return bytes.toFixed(dp) + ' ' + units[u]; } } ================================================ FILE: webapp/frontend/src/app/shared/shared.module.ts ================================================ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import {FileSizePipe} from './file-size.pipe'; import { DeviceSortPipe } from './device-sort.pipe'; import { TemperaturePipe } from './temperature.pipe'; import { DeviceTitlePipe } from './device-title.pipe'; import { DeviceStatusPipe } from './device-status.pipe'; import { DeviceHoursPipe } from './device-hours.pipe'; @NgModule({ declarations: [ FileSizePipe, DeviceSortPipe, TemperaturePipe, DeviceTitlePipe, DeviceStatusPipe, DeviceHoursPipe ], imports: [ CommonModule, FormsModule, ReactiveFormsModule ], exports: [ CommonModule, FormsModule, ReactiveFormsModule, FileSizePipe, DeviceSortPipe, DeviceTitlePipe, DeviceStatusPipe, TemperaturePipe, DeviceHoursPipe ] }) export class SharedModule { } ================================================ FILE: webapp/frontend/src/app/shared/temperature.pipe.spec.ts ================================================ import { TemperaturePipe } from './temperature.pipe'; describe('TemperaturePipe', () => { it('create an instance', () => { const pipe = new TemperaturePipe(); expect(pipe).toBeTruthy(); }); describe('#celsiusToFahrenheit', () => { const testCases = [ { 'c': -273.15, 'f': -459.66999999999996, },{ 'c': -34.44, 'f': -29.991999999999997, },{ 'c': -23.33, 'f': -9.993999999999993, },{ 'c': -17.78, 'f': -0.0040000000000048885, },{ 'c': 0, 'f': 32, },{ 'c': 10, 'f': 50, },{ 'c': 26.67, 'f': 80.006, },{ 'c': 37, 'f': 98.6, },{ 'c': 60, 'f': 140, } ] testCases.forEach((test, index) => { it(`should correctly convert ${test.c}, Celsius to Fahrenheit (testcase: ${index + 1})`, () => { // test const numb = TemperaturePipe.celsiusToFahrenheit(test.c) expect(numb).toEqual(test.f); }); }) }); describe('#formatTemperature',() => { const testCases = [ { 'c': 26.67, 'unit': 'celsius', 'includeUnits': true, 'result': '26.67°C' },{ 'c': 26.6767, 'unit': 'celsius', 'includeUnits': true, 'result': '26.677°C' },{ 'c': 26.67, 'unit': 'celsius', 'includeUnits': false, 'result': '26.67', },{ 'c': 26.67, 'unit': 'fahrenheit', 'includeUnits': true, 'result': '26.67°F', },{ 'c': 26.6767, 'unit': 'fahrenheit', 'includeUnits': true, 'result': '26.677°F', },{ 'c': 26.67, 'unit': 'fahrenheit', 'includeUnits': false, 'result': '26.67', } ] testCases.forEach((test, index) => { it(`should correctly format temperature ${test.c} to ${test.unit} ${test.includeUnits ? 'with' : 'without'} unit. (testcase: ${index + 1})`, () => { // test const formatted = TemperaturePipe.formatTemperature(test.c, test.unit, test.includeUnits) expect(formatted).toEqual(test.result); }); }) }) }); ================================================ FILE: webapp/frontend/src/app/shared/temperature.pipe.ts ================================================ import { Pipe, PipeTransform } from '@angular/core'; import {formatNumber} from '@angular/common'; @Pipe({ name: 'temperature' }) export class TemperaturePipe implements PipeTransform { static celsiusToFahrenheit(celsiusTemp: number): number { return celsiusTemp * 9/5 + 32; } static formatTemperature(temp: number, unit: string, includeUnits: boolean): number|string { let unitSuffix switch (unit) { case 'celsius': unitSuffix = '°C' break case 'fahrenheit': unitSuffix = '°F' break } if(includeUnits){ return formatNumber(temp, 'en-US') + unitSuffix } else { return formatNumber(temp, 'en-US',) } } transform(celsiusTemp: number, unit = 'celsius', includeUnits = false): number|string { let temperature; switch (unit) { case 'celsius': temperature = celsiusTemp; break case 'fahrenheit': temperature = TemperaturePipe.celsiusToFahrenheit(celsiusTemp) break } return TemperaturePipe.formatTemperature(temperature, unit, includeUnits) } } ================================================ FILE: webapp/frontend/src/assets/.gitkeep ================================================ ================================================ FILE: webapp/frontend/src/assets/fonts/ibm-plex-mono/ibm-plex-mono.css ================================================ /* ibm-plex-mono-regular - latin */ @font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 400; src: url('ibm-plex-mono-v12-latin-regular.eot'); /* IE9 Compat Modes */ src: local(''), url('ibm-plex-mono-v12-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('ibm-plex-mono-v12-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ url('ibm-plex-mono-v12-latin-regular.woff') format('woff'), /* Modern Browsers */ url('ibm-plex-mono-v12-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ url('ibm-plex-mono-v12-latin-regular.svg#IBMPlexMono') format('svg'); /* Legacy iOS */ } /* ibm-plex-mono-italic - latin */ @font-face { font-family: 'IBM Plex Mono'; font-style: italic; font-weight: 400; src: url('ibm-plex-mono-v12-latin-italic.eot'); /* IE9 Compat Modes */ src: local(''), url('ibm-plex-mono-v12-latin-italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('ibm-plex-mono-v12-latin-italic.woff2') format('woff2'), /* Super Modern Browsers */ url('ibm-plex-mono-v12-latin-italic.woff') format('woff'), /* Modern Browsers */ url('ibm-plex-mono-v12-latin-italic.ttf') format('truetype'), /* Safari, Android, iOS */ url('ibm-plex-mono-v12-latin-italic.svg#IBMPlexMono') format('svg'); /* Legacy iOS */ } /* ibm-plex-mono-500 - latin */ @font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 500; src: url('ibm-plex-mono-v12-latin-500.eot'); /* IE9 Compat Modes */ src: local(''), url('ibm-plex-mono-v12-latin-500.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('ibm-plex-mono-v12-latin-500.woff2') format('woff2'), /* Super Modern Browsers */ url('ibm-plex-mono-v12-latin-500.woff') format('woff'), /* Modern Browsers */ url('ibm-plex-mono-v12-latin-500.ttf') format('truetype'), /* Safari, Android, iOS */ url('ibm-plex-mono-v12-latin-500.svg#IBMPlexMono') format('svg'); /* Legacy iOS */ } /* ibm-plex-mono-600 - latin */ @font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 600; src: url('ibm-plex-mono-v12-latin-600.eot'); /* IE9 Compat Modes */ src: local(''), url('ibm-plex-mono-v12-latin-600.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('ibm-plex-mono-v12-latin-600.woff2') format('woff2'), /* Super Modern Browsers */ url('ibm-plex-mono-v12-latin-600.woff') format('woff'), /* Modern Browsers */ url('ibm-plex-mono-v12-latin-600.ttf') format('truetype'), /* Safari, Android, iOS */ url('ibm-plex-mono-v12-latin-600.svg#IBMPlexMono') format('svg'); /* Legacy iOS */ } /* ibm-plex-mono-700 - latin */ @font-face { font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 700; src: url('ibm-plex-mono-v12-latin-700.eot'); /* IE9 Compat Modes */ src: local(''), url('ibm-plex-mono-v12-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('ibm-plex-mono-v12-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ url('ibm-plex-mono-v12-latin-700.woff') format('woff'), /* Modern Browsers */ url('ibm-plex-mono-v12-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ url('ibm-plex-mono-v12-latin-700.svg#IBMPlexMono') format('svg'); /* Legacy iOS */ } ================================================ FILE: webapp/frontend/src/assets/fonts/inter/inter.css ================================================ @font-face { font-family: 'Inter'; font-style: normal; font-weight: 400; font-display: swap; src: url("Inter-Regular.woff2?v=3.11") format("woff2"), url("Inter-Regular.woff?v=3.11") format("woff"); } @font-face { font-family: 'Inter'; font-style: italic; font-weight: 400; font-display: swap; src: url("Inter-Italic.woff2?v=3.11") format("woff2"), url("Inter-Italic.woff?v=3.11") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 500; font-display: swap; src: url("Inter-Medium.woff2?v=3.11") format("woff2"), url("Inter-Medium.woff?v=3.11") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 600; font-display: swap; src: url("Inter-SemiBold.woff2?v=3.11") format("woff2"), url("Inter-SemiBold.woff?v=3.11") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 700; font-display: swap; src: url("Inter-Bold.woff2?v=3.11") format("woff2"), url("Inter-Bold.woff?v=3.11") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 800; font-display: swap; src: url("Inter-ExtraBold.woff2?v=3.11") format("woff2"), url("Inter-ExtraBold.woff?v=3.11") format("woff"); } @font-face { font-family: 'Inter'; font-style: normal; font-weight: 900; font-display: swap; src: url("Inter-Black.woff2?v=3.11") format("woff2"), url("Inter-Black.woff?v=3.11") format("woff"); } ================================================ FILE: webapp/frontend/src/assets/fonts/material-icons/MaterialIcons-Regular.codepoints ================================================ 10k e951 10mp e952 11mp e953 123 eb8d 12mp e954 13mp e955 14mp e956 15mp e957 16mp e958 17mp e959 18_up_rating f8fd 18mp e95a 19mp e95b 1k e95c 1k_plus e95d 1x_mobiledata efcd 20mp e95e 21mp e95f 22mp e960 23mp e961 24mp e962 2k e963 2k_plus e964 2mp e965 30fps efce 30fps_select efcf 360 e577 3d_rotation e84d 3g_mobiledata efd0 3k e966 3k_plus e967 3mp e968 3p efd1 4g_mobiledata efd2 4g_plus_mobiledata efd3 4k e072 4k_plus e969 4mp e96a 5g ef38 5k e96b 5k_plus e96c 5mp e96d 60fps efd4 60fps_select efd5 6_ft_apart f21e 6k e96e 6k_plus e96f 6mp e970 7k e971 7k_plus e972 7mp e973 8k e974 8k_plus e975 8mp e976 9k e977 9k_plus e978 9mp e979 abc eb94 ac_unit eb3b access_alarm e190 access_alarms e191 access_time e192 access_time_filled efd6 accessibility e84e accessibility_new e92c accessible e914 accessible_forward e934 account_balance e84f account_balance_wallet e850 account_box e851 account_circle e853 account_tree e97a ad_units ef39 adb e60e add e145 add_a_photo e439 add_alarm e193 add_alert e003 add_box e146 add_business e729 add_call e0e8 add_card eb86 add_chart e97b add_circle e147 add_circle_outline e148 add_comment e266 add_home f8eb add_home_work f8ed add_ic_call e97c add_link e178 add_location e567 add_location_alt ef3a add_moderator e97d add_photo_alternate e43e add_reaction e1d3 add_road ef3b add_shopping_cart e854 add_task f23a add_to_drive e65c add_to_home_screen e1fe add_to_photos e39d add_to_queue e05c addchart ef3c adf_scanner eada adjust e39e admin_panel_settings ef3d adobe ea96 ads_click e762 agriculture ea79 air efd8 airline_seat_flat e630 airline_seat_flat_angled e631 airline_seat_individual_suite e632 airline_seat_legroom_extra e633 airline_seat_legroom_normal e634 airline_seat_legroom_reduced e635 airline_seat_recline_extra e636 airline_seat_recline_normal e637 airline_stops e7d0 airlines e7ca airplane_ticket efd9 airplanemode_active e195 airplanemode_inactive e194 airplanemode_off e194 airplanemode_on e195 airplay e055 airport_shuttle eb3c alarm e855 alarm_add e856 alarm_off e857 alarm_on e858 album e019 align_horizontal_center e00f align_horizontal_left e00d align_horizontal_right e010 align_vertical_bottom e015 align_vertical_center e011 align_vertical_top e00c all_inbox e97f all_inclusive eb3d all_out e90b alt_route f184 alternate_email e0e6 amp_stories ea13 analytics ef3e anchor f1cd android e859 animation e71c announcement e85a aod efda apartment ea40 api f1b7 app_blocking ef3f app_registration ef40 app_settings_alt ef41 app_shortcut eae4 apple ea80 approval e982 apps e5c3 apps_outage e7cc architecture ea3b archive e149 area_chart e770 arrow_back e5c4 arrow_back_ios e5e0 arrow_back_ios_new e2ea arrow_circle_down f181 arrow_circle_left eaa7 arrow_circle_right eaaa arrow_circle_up f182 arrow_downward e5db arrow_drop_down e5c5 arrow_drop_down_circle e5c6 arrow_drop_up e5c7 arrow_forward e5c8 arrow_forward_ios e5e1 arrow_left e5de arrow_outward f8ce arrow_right e5df arrow_right_alt e941 arrow_upward e5d8 art_track e060 article ef42 aspect_ratio e85b assessment e85c assignment e85d assignment_ind e85e assignment_late e85f assignment_return e860 assignment_returned e861 assignment_turned_in e862 assist_walker f8d5 assistant e39f assistant_direction e988 assistant_navigation e989 assistant_photo e3a0 assured_workload eb6f atm e573 attach_email ea5e attach_file e226 attach_money e227 attachment e2bc attractions ea52 attribution efdb audio_file eb82 audiotrack e3a1 auto_awesome e65f auto_awesome_mosaic e660 auto_awesome_motion e661 auto_delete ea4c auto_fix_high e663 auto_fix_normal e664 auto_fix_off e665 auto_graph e4fb auto_mode ec20 auto_stories e666 autofps_select efdc autorenew e863 av_timer e01b baby_changing_station f19b back_hand e764 backpack f19c backspace e14a backup e864 backup_table ef43 badge ea67 bakery_dining ea53 balance eaf6 balcony e58f ballot e172 bar_chart e26b batch_prediction f0f5 bathroom efdd bathtub ea41 battery_0_bar ebdc battery_1_bar ebd9 battery_2_bar ebe0 battery_3_bar ebdd battery_4_bar ebe2 battery_5_bar ebd4 battery_6_bar ebd2 battery_alert e19c battery_charging_full e1a3 battery_full e1a4 battery_saver efde battery_std e1a5 battery_unknown e1a6 beach_access eb3e bed efdf bedroom_baby efe0 bedroom_child efe1 bedroom_parent efe2 bedtime ef44 bedtime_off eb76 beenhere e52d bento f1f4 bike_scooter ef45 biotech ea3a blender efe3 blind f8d6 blinds e286 blinds_closed ec1f block e14b block_flipped ef46 bloodtype efe4 bluetooth e1a7 bluetooth_audio e60f bluetooth_connected e1a8 bluetooth_disabled e1a9 bluetooth_drive efe5 bluetooth_searching e1aa blur_circular e3a2 blur_linear e3a3 blur_off e3a4 blur_on e3a5 bolt ea0b book e865 book_online f217 bookmark e866 bookmark_add e598 bookmark_added e599 bookmark_border e867 bookmark_outline e867 bookmark_remove e59a bookmarks e98b border_all e228 border_bottom e229 border_clear e22a border_color e22b border_horizontal e22c border_inner e22d border_left e22e border_outer e22f border_right e230 border_style e231 border_top e232 border_vertical e233 boy eb67 branding_watermark e06b breakfast_dining ea54 brightness_1 e3a6 brightness_2 e3a7 brightness_3 e3a8 brightness_4 e3a9 brightness_5 e3aa brightness_6 e3ab brightness_7 e3ac brightness_auto e1ab brightness_high e1ac brightness_low e1ad brightness_medium e1ae broadcast_on_home f8f8 broadcast_on_personal f8f9 broken_image e3ad browse_gallery ebd1 browser_not_supported ef47 browser_updated e7cf brunch_dining ea73 brush e3ae bubble_chart e6dd bug_report e868 build e869 build_circle ef48 bungalow e591 burst_mode e43c bus_alert e98f business e0af business_center eb3f cabin e589 cable efe6 cached e86a cake e7e9 calculate ea5f calendar_month ebcc calendar_today e935 calendar_view_day e936 calendar_view_month efe7 calendar_view_week efe8 call e0b0 call_end e0b1 call_made e0b2 call_merge e0b3 call_missed e0b4 call_missed_outgoing e0e4 call_received e0b5 call_split e0b6 call_to_action e06c camera e3af camera_alt e3b0 camera_enhance e8fc camera_front e3b1 camera_indoor efe9 camera_outdoor efea camera_rear e3b2 camera_roll e3b3 cameraswitch efeb campaign ef49 cancel e5c9 cancel_presentation e0e9 cancel_schedule_send ea39 candlestick_chart ead4 car_crash ebf2 car_rental ea55 car_repair ea56 card_giftcard e8f6 card_membership e8f7 card_travel e8f8 carpenter f1f8 cases e992 casino eb40 cast e307 cast_connected e308 cast_for_education efec castle eab1 catching_pokemon e508 category e574 celebration ea65 cell_tower ebba cell_wifi e0ec center_focus_strong e3b4 center_focus_weak e3b5 chair efed chair_alt efee chalet e585 change_circle e2e7 change_history e86b charging_station f19d chat e0b7 chat_bubble e0ca chat_bubble_outline e0cb check e5ca check_box e834 check_box_outline_blank e835 check_circle e86c check_circle_outline e92d checklist e6b1 checklist_rtl e6b3 checkroom f19e chevron_left e5cb chevron_right e5cc child_care eb41 child_friendly eb42 chrome_reader_mode e86d church eaae circle ef4a circle_notifications e994 class e86e clean_hands f21f cleaning_services f0ff clear e14c clear_all e0b8 close e5cd close_fullscreen f1cf closed_caption e01c closed_caption_disabled f1dc closed_caption_off e996 cloud e2bd cloud_circle e2be cloud_done e2bf cloud_download e2c0 cloud_off e2c1 cloud_queue e2c2 cloud_sync eb5a cloud_upload e2c3 cloudy_snowing e810 co2 e7b0 co_present eaf0 code e86f code_off e4f3 coffee efef coffee_maker eff0 collections e3b6 collections_bookmark e431 color_lens e3b7 colorize e3b8 comment e0b9 comment_bank ea4e comments_disabled e7a2 commit eaf5 commute e940 compare e3b9 compare_arrows e915 compass_calibration e57c compost e761 compress e94d computer e30a confirmation_num e638 confirmation_number e638 connect_without_contact f223 connected_tv e998 connecting_airports e7c9 construction ea3c contact_emergency f8d1 contact_mail e0d0 contact_page f22e contact_phone e0cf contact_support e94c contactless ea71 contacts e0ba content_copy e14d content_cut e14e content_paste e14f content_paste_go ea8e content_paste_off e4f8 content_paste_search ea9b contrast eb37 control_camera e074 control_point e3ba control_point_duplicate e3bb cookie eaac copy_all e2ec copyright e90c coronavirus f221 corporate_fare f1d0 cottage e587 countertops f1f7 create e150 create_new_folder e2cc credit_card e870 credit_card_off e4f4 credit_score eff1 crib e588 crisis_alert ebe9 crop e3be crop_16_9 e3bc crop_3_2 e3bd crop_5_4 e3bf crop_7_5 e3c0 crop_din e3c1 crop_free e3c2 crop_landscape e3c3 crop_original e3c4 crop_portrait e3c5 crop_rotate e437 crop_square e3c6 cruelty_free e799 css eb93 currency_bitcoin ebc5 currency_exchange eb70 currency_franc eafa currency_lira eaef currency_pound eaf1 currency_ruble eaec currency_rupee eaf7 currency_yen eafb currency_yuan eaf9 curtains ec1e curtains_closed ec1d cyclone ebd5 dangerous e99a dark_mode e51c dashboard e871 dashboard_customize e99b data_array ead1 data_exploration e76f data_object ead3 data_saver_off eff2 data_saver_on eff3 data_thresholding eb9f data_usage e1af dataset f8ee dataset_linked f8ef date_range e916 deblur eb77 deck ea42 dehaze e3c7 delete e872 delete_forever e92b delete_outline e92e delete_sweep e16c delivery_dining ea72 density_large eba9 density_medium eb9e density_small eba8 departure_board e576 description e873 deselect ebb6 design_services f10a desk f8f4 desktop_access_disabled e99d desktop_mac e30b desktop_windows e30c details e3c8 developer_board e30d developer_board_off e4ff developer_mode e1b0 device_hub e335 device_thermostat e1ff device_unknown e339 devices e1b1 devices_fold ebde devices_other e337 dialer_sip e0bb dialpad e0bc diamond ead5 difference eb7d dining eff4 dinner_dining ea57 directions e52e directions_bike e52f directions_boat e532 directions_boat_filled eff5 directions_bus e530 directions_bus_filled eff6 directions_car e531 directions_car_filled eff7 directions_ferry e532 directions_off f10f directions_railway e534 directions_railway_filled eff8 directions_run e566 directions_subway e533 directions_subway_filled eff9 directions_train e534 directions_transit e535 directions_transit_filled effa directions_walk e536 dirty_lens ef4b disabled_by_default f230 disabled_visible e76e disc_full e610 discord ea6c discount ebc9 display_settings eb97 diversity_1 f8d7 diversity_2 f8d8 diversity_3 f8d9 dnd_forwardslash e611 dns e875 do_disturb f08c do_disturb_alt f08d do_disturb_off f08e do_disturb_on f08f do_not_disturb e612 do_not_disturb_alt e611 do_not_disturb_off e643 do_not_disturb_on e644 do_not_disturb_on_total_silence effb do_not_step f19f do_not_touch f1b0 dock e30e document_scanner e5fa domain e7ee domain_add eb62 domain_disabled e0ef domain_verification ef4c done e876 done_all e877 done_outline e92f donut_large e917 donut_small e918 door_back effc door_front effd door_sliding effe doorbell efff double_arrow ea50 downhill_skiing e509 download f090 download_done f091 download_for_offline f000 downloading f001 drafts e151 drag_handle e25d drag_indicator e945 draw e746 drive_eta e613 drive_file_move e675 drive_file_move_outline e9a1 drive_file_move_rtl e76d drive_file_rename_outline e9a2 drive_folder_upload e9a3 dry f1b3 dry_cleaning ea58 duo e9a5 dvr e1b2 dynamic_feed ea14 dynamic_form f1bf e_mobiledata f002 earbuds f003 earbuds_battery f004 east f1df eco ea35 edgesensor_high f005 edgesensor_low f006 edit e3c9 edit_attributes e578 edit_calendar e742 edit_location e568 edit_location_alt e1c5 edit_note e745 edit_notifications e525 edit_off e950 edit_road ef4d egg eacc egg_alt eac8 eject e8fb elderly f21a elderly_woman eb69 electric_bike eb1b electric_bolt ec1c electric_car eb1c electric_meter ec1b electric_moped eb1d electric_rickshaw eb1e electric_scooter eb1f electrical_services f102 elevator f1a0 email e0be emergency e1eb emergency_recording ebf4 emergency_share ebf6 emoji_emotions ea22 emoji_events ea23 emoji_flags ea1a emoji_food_beverage ea1b emoji_nature ea1c emoji_objects ea24 emoji_people ea1d emoji_symbols ea1e emoji_transportation ea1f energy_savings_leaf ec1a engineering ea3d enhance_photo_translate e8fc enhanced_encryption e63f equalizer e01d error e000 error_outline e001 escalator f1a1 escalator_warning f1ac euro ea15 euro_symbol e926 ev_station e56d event e878 event_available e614 event_busy e615 event_note e616 event_repeat eb7b event_seat e903 exit_to_app e879 expand e94f expand_circle_down e7cd expand_less e5ce expand_more e5cf explicit e01e explore e87a explore_off e9a8 exposure e3ca exposure_minus_1 e3cb exposure_minus_2 e3cc exposure_neg_1 e3cb exposure_neg_2 e3cc exposure_plus_1 e3cd exposure_plus_2 e3ce exposure_zero e3cf extension e87b extension_off e4f5 face e87c face_2 f8da face_3 f8db face_4 f8dc face_5 f8dd face_6 f8de face_retouching_natural ef4e face_retouching_off f007 facebook f234 fact_check f0c5 factory ebbc family_restroom f1a2 fast_forward e01f fast_rewind e020 fastfood e57a favorite e87d favorite_border e87e favorite_outline e87e fax ead8 featured_play_list e06d featured_video e06e feed f009 feedback e87f female e590 fence f1f6 festival ea68 fiber_dvr e05d fiber_manual_record e061 fiber_new e05e fiber_pin e06a fiber_smart_record e062 file_copy e173 file_download e2c4 file_download_done e9aa file_download_off e4fe file_open eaf3 file_present ea0e file_upload e2c6 filter e3d3 filter_1 e3d0 filter_2 e3d1 filter_3 e3d2 filter_4 e3d4 filter_5 e3d5 filter_6 e3d6 filter_7 e3d7 filter_8 e3d8 filter_9 e3d9 filter_9_plus e3da filter_alt ef4f filter_alt_off eb32 filter_b_and_w e3db filter_center_focus e3dc filter_drama e3dd filter_frames e3de filter_hdr e3df filter_list e152 filter_list_alt e94e filter_list_off eb57 filter_none e3e0 filter_tilt_shift e3e2 filter_vintage e3e3 find_in_page e880 find_replace e881 fingerprint e90d fire_extinguisher f1d8 fire_hydrant f1a3 fire_hydrant_alt f8f1 fire_truck f8f2 fireplace ea43 first_page e5dc fit_screen ea10 fitbit e82b fitness_center eb43 flag e153 flag_circle eaf8 flaky ef50 flare e3e4 flash_auto e3e5 flash_off e3e6 flash_on e3e7 flashlight_off f00a flashlight_on f00b flatware f00c flight e539 flight_class e7cb flight_land e904 flight_takeoff e905 flip e3e8 flip_camera_android ea37 flip_camera_ios ea38 flip_to_back e882 flip_to_front e883 flood ebe6 flourescent f00d flutter_dash e00b fmd_bad f00e fmd_good f00f foggy e818 folder e2c7 folder_copy ebbd folder_delete eb34 folder_off eb83 folder_open e2c8 folder_shared e2c9 folder_special e617 folder_zip eb2c follow_the_signs f222 font_download e167 font_download_off e4f9 food_bank f1f2 forest ea99 fork_left eba0 fork_right ebac format_align_center e234 format_align_justify e235 format_align_left e236 format_align_right e237 format_bold e238 format_clear e239 format_color_fill e23a format_color_reset e23b format_color_text e23c format_indent_decrease e23d format_indent_increase e23e format_italic e23f format_line_spacing e240 format_list_bulleted e241 format_list_numbered e242 format_list_numbered_rtl e267 format_overline eb65 format_paint e243 format_quote e244 format_shapes e25e format_size e245 format_strikethrough e246 format_textdirection_l_to_r e247 format_textdirection_r_to_l e248 format_underline e249 format_underlined e249 fort eaad forum e0bf forward e154 forward_10 e056 forward_30 e057 forward_5 e058 forward_to_inbox f187 foundation f200 free_breakfast eb44 free_cancellation e748 front_hand e769 fullscreen e5d0 fullscreen_exit e5d1 functions e24a g_mobiledata f010 g_translate e927 gamepad e30f games e021 garage f011 gas_meter ec19 gavel e90e generating_tokens e749 gesture e155 get_app e884 gif e908 gif_box e7a3 girl eb68 gite e58b goat 10fffd golf_course eb45 gpp_bad f012 gpp_good f013 gpp_maybe f014 gps_fixed e1b3 gps_not_fixed e1b4 gps_off e1b5 grade e885 gradient e3e9 grading ea4f grain e3ea graphic_eq e1b8 grass f205 grid_3x3 f015 grid_4x4 f016 grid_goldenratio f017 grid_off e3eb grid_on e3ec grid_view e9b0 group e7ef group_add e7f0 group_off e747 group_remove e7ad group_work e886 groups f233 groups_2 f8df groups_3 f8e0 h_mobiledata f018 h_plus_mobiledata f019 hail e9b1 handshake ebcb handyman f10b hardware ea59 hd e052 hdr_auto f01a hdr_auto_select f01b hdr_enhanced_select ef51 hdr_off e3ed hdr_off_select f01c hdr_on e3ee hdr_on_select f01d hdr_plus f01e hdr_strong e3f1 hdr_weak e3f2 headphones f01f headphones_battery f020 headset e310 headset_mic e311 headset_off e33a healing e3f3 health_and_safety e1d5 hearing e023 hearing_disabled f104 heart_broken eac2 heat_pump ec18 height ea16 help e887 help_center f1c0 help_outline e8fd hevc f021 hexagon eb39 hide_image f022 hide_source f023 high_quality e024 highlight e25f highlight_alt ef52 highlight_off e888 highlight_remove e888 hiking e50a history e889 history_edu ea3e history_toggle_off f17d hive eaa6 hls eb8a hls_off eb8c holiday_village e58a home e88a home_filled e9b2 home_max f024 home_mini f025 home_repair_service f100 home_work ea09 horizontal_distribute e014 horizontal_rule f108 horizontal_split e947 hot_tub eb46 hotel e53a hotel_class e743 hourglass_bottom ea5c hourglass_disabled ef53 hourglass_empty e88b hourglass_full e88c hourglass_top ea5b house ea44 house_siding f202 houseboat e584 how_to_reg e174 how_to_vote e175 html eb7e http e902 https e88d hub e9f4 hvac f10e ice_skating e50b icecream ea69 image e3f4 image_aspect_ratio e3f5 image_not_supported f116 image_search e43f imagesearch_roller e9b4 import_contacts e0e0 import_export e0c3 important_devices e912 inbox e156 incomplete_circle e79b indeterminate_check_box e909 info e88e info_outline e88f input e890 insert_chart e24b insert_chart_outlined e26a insert_comment e24c insert_drive_file e24d insert_emoticon e24e insert_invitation e24f insert_link e250 insert_page_break eaca insert_photo e251 insights f092 install_desktop eb71 install_mobile eb72 integration_instructions ef54 interests e7c8 interpreter_mode e83b inventory e179 inventory_2 e1a1 invert_colors e891 invert_colors_off e0c4 invert_colors_on e891 ios_share e6b8 iron e583 iso e3f6 javascript eb7c join_full eaeb join_inner eaf4 join_left eaf2 join_right eaea kayaking e50c kebab_dining e842 key e73c key_off eb84 keyboard e312 keyboard_alt f028 keyboard_arrow_down e313 keyboard_arrow_left e314 keyboard_arrow_right e315 keyboard_arrow_up e316 keyboard_backspace e317 keyboard_capslock e318 keyboard_command eae0 keyboard_command_key eae7 keyboard_control e5d3 keyboard_control_key eae6 keyboard_double_arrow_down ead0 keyboard_double_arrow_left eac3 keyboard_double_arrow_right eac9 keyboard_double_arrow_up eacf keyboard_hide e31a keyboard_option eadf keyboard_option_key eae8 keyboard_return e31b keyboard_tab e31c keyboard_voice e31d king_bed ea45 kitchen eb47 kitesurfing e50d label e892 label_important e937 label_important_outline e948 label_off e9b6 label_outline e893 lan eb2f landscape e3f7 landslide ebd7 language e894 laptop e31e laptop_chromebook e31f laptop_mac e320 laptop_windows e321 last_page e5dd launch e895 layers e53b layers_clear e53c leaderboard f20c leak_add e3f8 leak_remove e3f9 leave_bags_at_home f21b legend_toggle f11b lens e3fa lens_blur f029 library_add e02e library_add_check e9b7 library_books e02f library_music e030 light f02a light_mode e518 lightbulb e0f0 lightbulb_circle ebfe lightbulb_outline e90f line_axis ea9a line_style e919 line_weight e91a linear_scale e260 link e157 link_off e16f linked_camera e438 liquor ea60 list e896 list_alt e0ee live_help e0c6 live_tv e639 living f02b local_activity e53f local_airport e53d local_atm e53e local_attraction e53f local_bar e540 local_cafe e541 local_car_wash e542 local_convenience_store e543 local_dining e556 local_drink e544 local_fire_department ef55 local_florist e545 local_gas_station e546 local_grocery_store e547 local_hospital e548 local_hotel e549 local_laundry_service e54a local_library e54b local_mall e54c local_movies e54d local_offer e54e local_parking e54f local_pharmacy e550 local_phone e551 local_pizza e552 local_play e553 local_police ef56 local_post_office e554 local_print_shop e555 local_printshop e555 local_restaurant e556 local_see e557 local_shipping e558 local_taxi e559 location_city e7f1 location_disabled e1b6 location_history e55a location_off e0c7 location_on e0c8 location_pin f1db location_searching e1b7 lock e897 lock_clock ef57 lock_open e898 lock_outline e899 lock_person f8f3 lock_reset eade login ea77 logo_dev ead6 logout e9ba looks e3fc looks_3 e3fb looks_4 e3fd looks_5 e3fe looks_6 e3ff looks_one e400 looks_two e401 loop e028 loupe e402 low_priority e16d loyalty e89a lte_mobiledata f02c lte_plus_mobiledata f02d luggage f235 lunch_dining ea61 lyrics ec0b macro_off f8d2 mail e158 mail_lock ec0a mail_outline e0e1 male e58e man e4eb man_2 f8e1 man_3 f8e2 man_4 f8e3 manage_accounts f02e manage_history ebe7 manage_search f02f map e55b maps_home_work f030 maps_ugc ef58 margin e9bb mark_as_unread e9bc mark_chat_read f18b mark_chat_unread f189 mark_email_read f18c mark_email_unread f18a mark_unread_chat_alt eb9d markunread e159 markunread_mailbox e89b masks f218 maximize e930 media_bluetooth_off f031 media_bluetooth_on f032 mediation efa7 medical_information ebed medical_services f109 medication f033 medication_liquid ea87 meeting_room eb4f memory e322 menu e5d2 menu_book ea19 menu_open e9bd merge eb98 merge_type e252 message e0c9 messenger e0ca messenger_outline e0cb mic e029 mic_external_off ef59 mic_external_on ef5a mic_none e02a mic_off e02b microwave f204 military_tech ea3f minimize e931 minor_crash ebf1 miscellaneous_services f10c missed_video_call e073 mms e618 mobile_friendly e200 mobile_off e201 mobile_screen_share e0e7 mobiledata_off f034 mode f097 mode_comment e253 mode_edit e254 mode_edit_outline f035 mode_fan_off ec17 mode_night f036 mode_of_travel e7ce mode_standby f037 model_training f0cf monetization_on e263 money e57d money_off e25c money_off_csred f038 monitor ef5b monitor_heart eaa2 monitor_weight f039 monochrome_photos e403 mood e7f2 mood_bad e7f3 moped eb28 more e619 more_horiz e5d3 more_time ea5d more_vert e5d4 mosque eab2 motion_photos_auto f03a motion_photos_off e9c0 motion_photos_on e9c1 motion_photos_pause f227 motion_photos_paused e9c2 motorcycle e91b mouse e323 move_down eb61 move_to_inbox e168 move_up eb64 movie e02c movie_creation e404 movie_filter e43a moving e501 mp e9c3 multiline_chart e6df multiple_stop f1b9 multitrack_audio e1b8 museum ea36 music_note e405 music_off e440 music_video e063 my_library_add e02e my_library_books e02f my_library_music e030 my_location e55c nat ef5c nature e406 nature_people e407 navigate_before e408 navigate_next e409 navigation e55d near_me e569 near_me_disabled f1ef nearby_error f03b nearby_off f03c nest_cam_wired_stand ec16 network_cell e1b9 network_check e640 network_locked e61a network_ping ebca network_wifi e1ba network_wifi_1_bar ebe4 network_wifi_2_bar ebd6 network_wifi_3_bar ebe1 new_label e609 new_releases e031 newspaper eb81 next_plan ef5d next_week e16a nfc e1bb night_shelter f1f1 nightlife ea62 nightlight f03d nightlight_round ef5e nights_stay ea46 no_accounts f03e no_adult_content f8fe no_backpack f237 no_cell f1a4 no_crash ebf0 no_drinks f1a5 no_encryption e641 no_encryption_gmailerrorred f03f no_flash f1a6 no_food f1a7 no_luggage f23b no_meals f1d6 no_meals_ouline f229 no_meeting_room eb4e no_photography f1a8 no_sim e0cc no_stroller f1af no_transfer f1d5 noise_aware ebec noise_control_off ebf3 nordic_walking e50e north f1e0 north_east f1e1 north_west f1e2 not_accessible f0fe not_interested e033 not_listed_location e575 not_started f0d1 note e06f note_add e89c note_alt f040 notes e26c notification_add e399 notification_important e004 notifications e7f4 notifications_active e7f7 notifications_none e7f5 notifications_off e7f6 notifications_on e7f7 notifications_paused e7f8 now_wallpaper e1bc now_widgets e1bd numbers eac7 offline_bolt e932 offline_pin e90a offline_share e9c5 oil_barrel ec15 on_device_training ebfd ondemand_video e63a online_prediction f0eb opacity e91c open_in_browser e89d open_in_full f1ce open_in_new e89e open_in_new_off e4f6 open_with e89f other_houses e58c outbond f228 outbound e1ca outbox ef5f outdoor_grill ea47 outgoing_mail f0d2 outlet f1d4 outlined_flag e16e output ebbe padding e9c8 pages e7f9 pageview e8a0 paid f041 palette e40a pan_tool e925 pan_tool_alt ebb9 panorama e40b panorama_fish_eye e40c panorama_fisheye e40c panorama_horizontal e40d panorama_horizontal_select ef60 panorama_photosphere e9c9 panorama_photosphere_select e9ca panorama_vertical e40e panorama_vertical_select ef61 panorama_wide_angle e40f panorama_wide_angle_select ef62 paragliding e50f park ea63 party_mode e7fa password f042 pattern f043 pause e034 pause_circle e1a2 pause_circle_filled e035 pause_circle_outline e036 pause_presentation e0ea payment e8a1 payments ef63 paypal ea8d pedal_bike eb29 pending ef64 pending_actions f1bb pentagon eb50 people e7fb people_alt ea21 people_outline e7fc percent eb58 perm_camera_mic e8a2 perm_contact_cal e8a3 perm_contact_calendar e8a3 perm_data_setting e8a4 perm_device_info e8a5 perm_device_information e8a5 perm_identity e8a6 perm_media e8a7 perm_phone_msg e8a8 perm_scan_wifi e8a9 person e7fd person_2 f8e4 person_3 f8e5 person_4 f8e6 person_add e7fe person_add_alt ea4d person_add_alt_1 ef65 person_add_disabled e9cb person_off e510 person_outline e7ff person_pin e55a person_pin_circle e56a person_remove ef66 person_remove_alt_1 ef67 person_search f106 personal_injury e6da personal_video e63b pest_control f0fa pest_control_rodent f0fd pets e91d phishing ead7 phone e0cd phone_android e324 phone_bluetooth_speaker e61b phone_callback e649 phone_disabled e9cc phone_enabled e9cd phone_forwarded e61c phone_in_talk e61d phone_iphone e325 phone_locked e61e phone_missed e61f phone_paused e620 phonelink e326 phonelink_erase e0db phonelink_lock e0dc phonelink_off e327 phonelink_ring e0dd phonelink_setup e0de photo e410 photo_album e411 photo_camera e412 photo_camera_back ef68 photo_camera_front ef69 photo_filter e43b photo_library e413 photo_size_select_actual e432 photo_size_select_large e433 photo_size_select_small e434 php eb8f piano e521 piano_off e520 picture_as_pdf e415 picture_in_picture e8aa picture_in_picture_alt e911 pie_chart e6c4 pie_chart_outline f044 pie_chart_outlined e6c5 pin f045 pin_drop e55e pin_end e767 pin_invoke e763 pinch eb38 pivot_table_chart e9ce pix eaa3 place e55f plagiarism ea5a play_arrow e037 play_circle e1c4 play_circle_fill e038 play_circle_filled e038 play_circle_outline e039 play_disabled ef6a play_for_work e906 play_lesson f047 playlist_add e03b playlist_add_check e065 playlist_add_check_circle e7e6 playlist_add_circle e7e5 playlist_play e05f playlist_remove eb80 plumbing f107 plus_one e800 podcasts f048 point_of_sale f17e policy ea17 poll e801 polyline ebbb polymer e8ab pool eb48 portable_wifi_off e0ce portrait e416 post_add ea20 power e63c power_input e336 power_off e646 power_settings_new e8ac precision_manufacturing f049 pregnant_woman e91e present_to_all e0df preview f1c5 price_change f04a price_check f04b print e8ad print_disabled e9cf priority_high e645 privacy_tip f0dc private_connectivity e744 production_quantity_limits e1d1 propane ec14 propane_tank ec13 psychology ea4a psychology_alt f8ea public e80b public_off f1ca publish e255 published_with_changes f232 punch_clock eaa8 push_pin f10d qr_code ef6b qr_code_2 e00a qr_code_scanner f206 query_builder e8ae query_stats e4fc question_answer e8af question_mark eb8b queue e03c queue_music e03d queue_play_next e066 quick_contacts_dialer e0cf quick_contacts_mail e0d0 quickreply ef6c quiz f04c quora ea98 r_mobiledata f04d radar f04e radio e03e radio_button_checked e837 radio_button_off e836 radio_button_on e837 radio_button_unchecked e836 railway_alert e9d1 ramen_dining ea64 ramp_left eb9c ramp_right eb96 rate_review e560 raw_off f04f raw_on f050 read_more ef6d real_estate_agent e73a receipt e8b0 receipt_long ef6e recent_actors e03f recommend e9d2 record_voice_over e91f rectangle eb54 recycling e760 reddit eaa0 redeem e8b1 redo e15a reduce_capacity f21c refresh e5d5 remember_me f051 remove e15b remove_circle e15c remove_circle_outline e15d remove_done e9d3 remove_from_queue e067 remove_moderator e9d4 remove_red_eye e417 remove_road ebfc remove_shopping_cart e928 reorder e8fe repartition f8e8 repeat e040 repeat_on e9d6 repeat_one e041 repeat_one_on e9d7 replay e042 replay_10 e059 replay_30 e05a replay_5 e05b replay_circle_filled e9d8 reply e15e reply_all e15f report e160 report_gmailerrorred f052 report_off e170 report_problem e8b2 request_page f22c request_quote f1b6 reset_tv e9d9 restart_alt f053 restaurant e56c restaurant_menu e561 restore e8b3 restore_from_trash e938 restore_page e929 reviews f054 rice_bowl f1f5 ring_volume e0d1 rocket eba5 rocket_launch eb9b roller_shades ec12 roller_shades_closed ec11 roller_skating ebcd roofing f201 room e8b4 room_preferences f1b8 room_service eb49 rotate_90_degrees_ccw e418 rotate_90_degrees_cw eaab rotate_left e419 rotate_right e41a roundabout_left eb99 roundabout_right eba3 rounded_corner e920 route eacd router e328 rowing e921 rss_feed e0e5 rsvp f055 rtt e9ad rule f1c2 rule_folder f1c9 run_circle ef6f running_with_errors e51d rv_hookup e642 safety_check ebef safety_divider e1cc sailing e502 sanitizer f21d satellite e562 satellite_alt eb3a save e161 save_alt e171 save_as eb60 saved_search ea11 savings e2eb scale eb5f scanner e329 scatter_plot e268 schedule e8b5 schedule_send ea0a schema e4fd school e80c science ea4b score e269 scoreboard ebd0 screen_lock_landscape e1be screen_lock_portrait e1bf screen_lock_rotation e1c0 screen_rotation e1c1 screen_rotation_alt ebee screen_search_desktop ef70 screen_share e0e2 screenshot f056 screenshot_monitor ec08 scuba_diving ebce sd e9dd sd_card e623 sd_card_alert f057 sd_storage e1c2 search e8b6 search_off ea76 security e32a security_update f058 security_update_good f059 security_update_warning f05a segment e94b select_all e162 self_improvement ea78 sell f05b send e163 send_and_archive ea0c send_time_extension eadb send_to_mobile f05c sensor_door f1b5 sensor_occupied ec10 sensor_window f1b4 sensors e51e sensors_off e51f sentiment_dissatisfied e811 sentiment_neutral e812 sentiment_satisfied e813 sentiment_satisfied_alt e0ed sentiment_very_dissatisfied e814 sentiment_very_satisfied e815 set_meal f1ea settings e8b8 settings_accessibility f05d settings_applications e8b9 settings_backup_restore e8ba settings_bluetooth e8bb settings_brightness e8bd settings_cell e8bc settings_display e8bd settings_ethernet e8be settings_input_antenna e8bf settings_input_component e8c0 settings_input_composite e8c1 settings_input_hdmi e8c2 settings_input_svideo e8c3 settings_overscan e8c4 settings_phone e8c5 settings_power e8c6 settings_remote e8c7 settings_suggest f05e settings_system_daydream e1c3 settings_voice e8c8 severe_cold ebd3 shape_line f8d3 share e80d share_arrival_time e524 share_location f05f shield e9e0 shield_moon eaa9 shop e8c9 shop_2 e19e shop_two e8ca shopify ea9d shopping_bag f1cc shopping_basket e8cb shopping_cart e8cc shopping_cart_checkout eb88 short_text e261 shortcut f060 show_chart e6e1 shower f061 shuffle e043 shuffle_on e9e1 shutter_speed e43d sick f220 sign_language ebe5 signal_cellular_0_bar f0a8 signal_cellular_4_bar e1c8 signal_cellular_alt e202 signal_cellular_alt_1_bar ebdf signal_cellular_alt_2_bar ebe3 signal_cellular_connected_no_internet_0_bar f0ac signal_cellular_connected_no_internet_4_bar e1cd signal_cellular_no_sim e1ce signal_cellular_nodata f062 signal_cellular_null e1cf signal_cellular_off e1d0 signal_wifi_0_bar f0b0 signal_wifi_4_bar e1d8 signal_wifi_4_bar_lock e1d9 signal_wifi_bad f063 signal_wifi_connected_no_internet_4 f064 signal_wifi_off e1da signal_wifi_statusbar_4_bar f065 signal_wifi_statusbar_connected_no_internet_4 f066 signal_wifi_statusbar_null f067 signpost eb91 sim_card e32b sim_card_alert e624 sim_card_download f068 single_bed ea48 sip f069 skateboarding e511 skip_next e044 skip_previous e045 sledding e512 slideshow e41b slow_motion_video e068 smart_button f1c1 smart_display f06a smart_screen f06b smart_toy f06c smartphone e32c smoke_free eb4a smoking_rooms eb4b sms e625 sms_failed e626 snapchat ea6e snippet_folder f1c7 snooze e046 snowboarding e513 snowing e80f snowmobile e503 snowshoeing e514 soap f1b2 social_distance e1cb solar_power ec0f sort e164 sort_by_alpha e053 sos ebf7 soup_kitchen e7d3 source f1c4 south f1e3 south_america e7e4 south_east f1e4 south_west f1e5 spa eb4c space_bar e256 space_dashboard e66b spatial_audio ebeb spatial_audio_off ebe8 spatial_tracking ebea speaker e32d speaker_group e32e speaker_notes e8cd speaker_notes_off e92a speaker_phone e0d2 speed e9e4 spellcheck e8ce splitscreen f06d spoke e9a7 sports ea30 sports_bar f1f3 sports_baseball ea51 sports_basketball ea26 sports_cricket ea27 sports_esports ea28 sports_football ea29 sports_golf ea2a sports_gymnastics ebc4 sports_handball ea33 sports_hockey ea2b sports_kabaddi ea34 sports_martial_arts eae9 sports_mma ea2c sports_motorsports ea2d sports_rugby ea2e sports_score f06e sports_soccer ea2f sports_tennis ea32 sports_volleyball ea31 square eb36 square_foot ea49 ssid_chart eb66 stacked_bar_chart e9e6 stacked_line_chart f22b stadium eb90 stairs f1a9 star e838 star_border e83a star_border_purple500 f099 star_half e839 star_outline f06f star_purple500 f09a star_rate f0ec stars e8d0 start e089 stay_current_landscape e0d3 stay_current_portrait e0d4 stay_primary_landscape e0d5 stay_primary_portrait e0d6 sticky_note_2 f1fc stop e047 stop_circle ef71 stop_screen_share e0e3 storage e1db store e8d1 store_mall_directory e563 storefront ea12 storm f070 straight eb95 straighten e41c stream e9e9 streetview e56e strikethrough_s e257 stroller f1ae style e41d subdirectory_arrow_left e5d9 subdirectory_arrow_right e5da subject e8d2 subscript f111 subscriptions e064 subtitles e048 subtitles_off ef72 subway e56f summarize f071 sunny e81a sunny_snowing e819 superscript f112 supervised_user_circle e939 supervisor_account e8d3 support ef73 support_agent f0e2 surfing e515 surround_sound e049 swap_calls e0d7 swap_horiz e8d4 swap_horizontal_circle e933 swap_vert e8d5 swap_vert_circle e8d6 swap_vertical_circle e8d6 swipe e9ec swipe_down eb53 swipe_down_alt eb30 swipe_left eb59 swipe_left_alt eb33 swipe_right eb52 swipe_right_alt eb56 swipe_up eb2e swipe_up_alt eb35 swipe_vertical eb51 switch_access_shortcut e7e1 switch_access_shortcut_add e7e2 switch_account e9ed switch_camera e41e switch_left f1d1 switch_right f1d2 switch_video e41f synagogue eab0 sync e627 sync_alt ea18 sync_disabled e628 sync_lock eaee sync_problem e629 system_security_update f072 system_security_update_good f073 system_security_update_warning f074 system_update e62a system_update_alt e8d7 system_update_tv e8d7 tab e8d8 tab_unselected e8d9 table_bar ead2 table_chart e265 table_restaurant eac6 table_rows f101 table_view f1be tablet e32f tablet_android e330 tablet_mac e331 tag e9ef tag_faces e420 takeout_dining ea74 tap_and_play e62b tapas f1e9 task f075 task_alt e2e6 taxi_alert ef74 telegram ea6b temple_buddhist eab3 temple_hindu eaaf terminal eb8e terrain e564 text_decrease eadd text_fields e262 text_format e165 text_increase eae2 text_rotate_up e93a text_rotate_vertical e93b text_rotation_angledown e93c text_rotation_angleup e93d text_rotation_down e93e text_rotation_none e93f text_snippet f1c6 textsms e0d8 texture e421 theater_comedy ea66 theaters e8da thermostat f076 thermostat_auto f077 thumb_down e8db thumb_down_alt e816 thumb_down_off_alt e9f2 thumb_up e8dc thumb_up_alt e817 thumb_up_off_alt e9f3 thumbs_up_down e8dd thunderstorm ebdb tiktok ea7e time_to_leave e62c timelapse e422 timeline e922 timer e425 timer_10 e423 timer_10_select f07a timer_3 e424 timer_3_select f07b timer_off e426 tips_and_updates e79a tire_repair ebc8 title e264 toc e8de today e8df toggle_off e9f5 toggle_on e9f6 token ea25 toll e8e0 tonality e427 topic f1c8 tornado e199 touch_app e913 tour ef75 toys e332 track_changes e8e1 traffic e565 train e570 tram e571 transcribe f8ec transfer_within_a_station e572 transform e428 transgender e58d transit_enterexit e579 translate e8e2 travel_explore e2db trending_down e8e3 trending_flat e8e4 trending_neutral e8e4 trending_up e8e5 trip_origin e57b troubleshoot e1d2 try f07c tsunami ebd8 tty f1aa tune e429 tungsten f07d turn_left eba6 turn_right ebab turn_sharp_left eba7 turn_sharp_right ebaa turn_slight_left eba4 turn_slight_right eb9a turned_in e8e6 turned_in_not e8e7 tv e333 tv_off e647 two_wheeler e9f9 type_specimen f8f0 u_turn_left eba1 u_turn_right eba2 umbrella f1ad unarchive e169 undo e166 unfold_less e5d6 unfold_less_double f8cf unfold_more e5d7 unfold_more_double f8d0 unpublished f236 unsubscribe e0eb upcoming f07e update e923 update_disabled e075 upgrade f0fb upload f09b upload_file e9fc usb e1e0 usb_off e4fa vaccines e138 vape_free ebc6 vaping_rooms ebcf verified ef76 verified_user e8e8 vertical_align_bottom e258 vertical_align_center e259 vertical_align_top e25a vertical_distribute e076 vertical_shades ec0e vertical_shades_closed ec0d vertical_split e949 vibration e62d video_call e070 video_camera_back f07f video_camera_front f080 video_collection e04a video_file eb87 video_label e071 video_library e04a video_settings ea75 video_stable f081 videocam e04b videocam_off e04c videogame_asset e338 videogame_asset_off e500 view_agenda e8e9 view_array e8ea view_carousel e8eb view_column e8ec view_comfortable e42a view_comfy e42a view_comfy_alt eb73 view_compact e42b view_compact_alt eb74 view_cozy eb75 view_day e8ed view_headline e8ee view_in_ar e9fe view_kanban eb7f view_list e8ef view_module e8f0 view_quilt e8f1 view_sidebar f114 view_stream e8f2 view_timeline eb85 view_week e8f3 vignette e435 villa e586 visibility e8f4 visibility_off e8f5 voice_chat e62e voice_over_off e94a voicemail e0d9 volcano ebda volume_down e04d volume_down_alt e79c volume_mute e04e volume_off e04f volume_up e050 volunteer_activism ea70 vpn_key e0da vpn_key_off eb7a vpn_lock e62f vrpano f082 wallet f8ff wallet_giftcard e8f6 wallet_membership e8f7 wallet_travel e8f8 wallpaper e1bc warehouse ebb8 warning e002 warning_amber f083 wash f1b1 watch e334 watch_later e924 watch_off eae3 water f084 water_damage f203 water_drop e798 waterfall_chart ea00 waves e176 waving_hand e766 wb_auto e42c wb_cloudy e42d wb_incandescent e42e wb_iridescent e436 wb_shade ea01 wb_sunny e430 wb_twighlight ea02 wb_twilight e1c6 wc e63d web e051 web_asset e069 web_asset_off e4f7 web_stories e595 webhook eb92 wechat ea81 weekend e16b west f1e6 whatsapp ea9c whatshot e80e wheelchair_pickup f1ab where_to_vote e177 widgets e1bd width_full f8f5 width_normal f8f6 width_wide f8f7 wifi e63e wifi_1_bar e4ca wifi_2_bar e4d9 wifi_calling ef77 wifi_calling_3 f085 wifi_channel eb6a wifi_find eb31 wifi_lock e1e1 wifi_off e648 wifi_password eb6b wifi_protected_setup f0fc wifi_tethering e1e2 wifi_tethering_error ead9 wifi_tethering_error_rounded f086 wifi_tethering_off f087 wind_power ec0c window f088 wine_bar f1e8 woman e13e woman_2 f8e7 woo_commerce ea6d wordpress ea9f work e8f9 work_history ec09 work_off e942 work_outline e943 workspace_premium e7af workspaces e1a0 workspaces_filled ea0d workspaces_outline ea0f wrap_text e25b wrong_location ef78 wysiwyg f1c3 yard f089 youtube_searched_for e8fa zoom_in e8ff zoom_in_map eb2d zoom_out e900 zoom_out_map e56b ================================================ FILE: webapp/frontend/src/assets/fonts/material-icons/MaterialIconsOutlined-Regular.codepoints ================================================ 10k e951 10mp e952 11mp e953 123 eb8d 12mp e954 13mp e955 14mp e956 15mp e957 16mp e958 17mp e959 18_up_rating f8fd 18mp e95a 19mp e95b 1k e95c 1k_plus e95d 1x_mobiledata efcd 20mp e95e 21mp e95f 22mp e960 23mp e961 24mp e962 2k e963 2k_plus e964 2mp e965 30fps efce 30fps_select efcf 360 e577 3d_rotation e84d 3g_mobiledata efd0 3k e966 3k_plus e967 3mp e968 3p efd1 4g_mobiledata efd2 4g_plus_mobiledata efd3 4k e072 4k_plus e969 4mp e96a 5g ef38 5k e96b 5k_plus e96c 5mp e96d 60fps efd4 60fps_select efd5 6_ft_apart f21e 6k e96e 6k_plus e96f 6mp e970 7k e971 7k_plus e972 7mp e973 8k e974 8k_plus e975 8mp e976 9k e977 9k_plus e978 9mp e979 abc eb94 ac_unit eb3b access_alarm e190 access_alarms e191 access_time e192 access_time_filled efd6 accessibility e84e accessibility_new e92c accessible e914 accessible_forward e934 account_balance e84f account_balance_wallet e850 account_box e851 account_circle e853 account_tree e97a ad_units ef39 adb e60e add e145 add_a_photo e439 add_alarm e193 add_alert e003 add_box e146 add_business e729 add_card eb86 add_chart e97b add_circle e147 add_circle_outline e148 add_comment e266 add_home f8eb add_home_work f8ed add_ic_call e97c add_link e178 add_location e567 add_location_alt ef3a add_moderator e97d add_photo_alternate e43e add_reaction e1d3 add_road ef3b add_shopping_cart e854 add_task f23a add_to_drive e65c add_to_home_screen e1fe add_to_photos e39d add_to_queue e05c addchart ef3c adf_scanner eada adjust e39e admin_panel_settings ef3d adobe ea96 ads_click e762 agriculture ea79 air efd8 airline_seat_flat e630 airline_seat_flat_angled e631 airline_seat_individual_suite e632 airline_seat_legroom_extra e633 airline_seat_legroom_normal e634 airline_seat_legroom_reduced e635 airline_seat_recline_extra e636 airline_seat_recline_normal e637 airline_stops e7d0 airlines e7ca airplane_ticket efd9 airplanemode_active e195 airplanemode_inactive e194 airplanemode_off e194 airplanemode_on e195 airplay e055 airport_shuttle eb3c alarm e855 alarm_add e856 alarm_off e857 alarm_on e858 album e019 align_horizontal_center e00f align_horizontal_left e00d align_horizontal_right e010 align_vertical_bottom e015 align_vertical_center e011 align_vertical_top e00c all_inbox e97f all_inclusive eb3d all_out e90b alt_route f184 alternate_email e0e6 amp_stories ea13 analytics ef3e anchor f1cd android e859 animation e71c announcement e85a aod efda apartment ea40 api f1b7 app_blocking ef3f app_registration ef40 app_settings_alt ef41 app_shortcut eae4 apple ea80 approval e982 apps e5c3 apps_outage e7cc architecture ea3b archive e149 area_chart e770 arrow_back e5c4 arrow_back_ios e5e0 arrow_back_ios_new e2ea arrow_circle_down f181 arrow_circle_left eaa7 arrow_circle_right eaaa arrow_circle_up f182 arrow_downward e5db arrow_drop_down e5c5 arrow_drop_down_circle e5c6 arrow_drop_up e5c7 arrow_forward e5c8 arrow_forward_ios e5e1 arrow_left e5de arrow_outward f8ce arrow_right e5df arrow_right_alt e941 arrow_upward e5d8 art_track e060 article ef42 aspect_ratio e85b assessment e85c assignment e85d assignment_ind e85e assignment_late e85f assignment_return e860 assignment_returned e861 assignment_turned_in e862 assist_walker f8d5 assistant e39f assistant_direction e988 assistant_photo e3a0 assured_workload eb6f atm e573 attach_email ea5e attach_file e226 attach_money e227 attachment e2bc attractions ea52 attribution efdb audio_file eb82 audiotrack e3a1 auto_awesome e65f auto_awesome_mosaic e660 auto_awesome_motion e661 auto_delete ea4c auto_fix_high e663 auto_fix_normal e664 auto_fix_off e665 auto_graph e4fb auto_mode ec20 auto_stories e666 autofps_select efdc autorenew e863 av_timer e01b baby_changing_station f19b back_hand e764 backpack f19c backspace e14a backup e864 backup_table ef43 badge ea67 bakery_dining ea53 balance eaf6 balcony e58f ballot e172 bar_chart e26b batch_prediction f0f5 bathroom efdd bathtub ea41 battery_0_bar ebdc battery_1_bar ebd9 battery_2_bar ebe0 battery_3_bar ebdd battery_4_bar ebe2 battery_5_bar ebd4 battery_6_bar ebd2 battery_alert e19c battery_charging_full e1a3 battery_full e1a4 battery_saver efde battery_std e1a5 battery_unknown e1a6 beach_access eb3e bed efdf bedroom_baby efe0 bedroom_child efe1 bedroom_parent efe2 bedtime ef44 bedtime_off eb76 beenhere e52d bento f1f4 bike_scooter ef45 biotech ea3a blender efe3 blind f8d6 blinds e286 blinds_closed ec1f block e14b bloodtype efe4 bluetooth e1a7 bluetooth_audio e60f bluetooth_connected e1a8 bluetooth_disabled e1a9 bluetooth_drive efe5 bluetooth_searching e1aa blur_circular e3a2 blur_linear e3a3 blur_off e3a4 blur_on e3a5 bolt ea0b book e865 book_online f217 bookmark e866 bookmark_add e598 bookmark_added e599 bookmark_border e867 bookmark_outline e867 bookmark_remove e59a bookmarks e98b border_all e228 border_bottom e229 border_clear e22a border_color e22b border_horizontal e22c border_inner e22d border_left e22e border_outer e22f border_right e230 border_style e231 border_top e232 border_vertical e233 boy eb67 branding_watermark e06b breakfast_dining ea54 brightness_1 e3a6 brightness_2 e3a7 brightness_3 e3a8 brightness_4 e3a9 brightness_5 e3aa brightness_6 e3ab brightness_7 e3ac brightness_auto e1ab brightness_high e1ac brightness_low e1ad brightness_medium e1ae broadcast_on_home f8f8 broadcast_on_personal f8f9 broken_image e3ad browse_gallery ebd1 browser_not_supported ef47 browser_updated e7cf brunch_dining ea73 brush e3ae bubble_chart e6dd bug_report e868 build e869 build_circle ef48 bungalow e591 burst_mode e43c bus_alert e98f business e0af business_center eb3f cabin e589 cable efe6 cached e86a cake e7e9 calculate ea5f calendar_month ebcc calendar_today e935 calendar_view_day e936 calendar_view_month efe7 calendar_view_week efe8 call e0b0 call_end e0b1 call_made e0b2 call_merge e0b3 call_missed e0b4 call_missed_outgoing e0e4 call_received e0b5 call_split e0b6 call_to_action e06c camera e3af camera_alt e3b0 camera_enhance e8fc camera_front e3b1 camera_indoor efe9 camera_outdoor efea camera_rear e3b2 camera_roll e3b3 cameraswitch efeb campaign ef49 cancel e5c9 cancel_presentation e0e9 cancel_schedule_send ea39 candlestick_chart ead4 car_crash ebf2 car_rental ea55 car_repair ea56 card_giftcard e8f6 card_membership e8f7 card_travel e8f8 carpenter f1f8 cases e992 casino eb40 cast e307 cast_connected e308 cast_for_education efec castle eab1 catching_pokemon e508 category e574 celebration ea65 cell_tower ebba cell_wifi e0ec center_focus_strong e3b4 center_focus_weak e3b5 chair efed chair_alt efee chalet e585 change_circle e2e7 change_history e86b charging_station f19d chat e0b7 chat_bubble e0ca chat_bubble_outline e0cb check e5ca check_box e834 check_box_outline_blank e835 check_circle e86c check_circle_outline e92d checklist e6b1 checklist_rtl e6b3 checkroom f19e chevron_left e5cb chevron_right e5cc child_care eb41 child_friendly eb42 chrome_reader_mode e86d church eaae circle ef4a circle_notifications e994 class e86e clean_hands f21f cleaning_services f0ff clear e14c clear_all e0b8 close e5cd close_fullscreen f1cf closed_caption e01c closed_caption_disabled f1dc closed_caption_off e996 cloud e2bd cloud_circle e2be cloud_done e2bf cloud_download e2c0 cloud_off e2c1 cloud_queue e2c2 cloud_sync eb5a cloud_upload e2c3 co2 e7b0 co_present eaf0 code e86f code_off e4f3 coffee efef coffee_maker eff0 collections e3b6 collections_bookmark e431 color_lens e3b7 colorize e3b8 comment e0b9 comment_bank ea4e comments_disabled e7a2 commit eaf5 commute e940 compare e3b9 compare_arrows e915 compass_calibration e57c compost e761 compress e94d computer e30a confirmation_num e638 confirmation_number e638 connect_without_contact f223 connected_tv e998 connecting_airports e7c9 construction ea3c contact_emergency f8d1 contact_mail e0d0 contact_page f22e contact_phone e0cf contact_support e94c contactless ea71 contacts e0ba content_copy f08a content_cut f08b content_paste f098 content_paste_go ea8e content_paste_off e4f8 content_paste_search ea9b contrast eb37 control_camera e074 control_point e3ba control_point_duplicate e3bb cookie eaac copy f08a copy_all e2ec copyright e90c coronavirus f221 corporate_fare f1d0 cottage e587 countertops f1f7 create e150 create_new_folder e2cc credit_card e870 credit_card_off e4f4 credit_score eff1 crib e588 crisis_alert ebe9 crop e3be crop_16_9 e3bc crop_3_2 e3bd crop_5_4 e3bf crop_7_5 e3c0 crop_din e3c1 crop_free e3c2 crop_landscape e3c3 crop_original e3c4 crop_portrait e3c5 crop_rotate e437 crop_square e3c6 cruelty_free e799 css eb93 currency_bitcoin ebc5 currency_exchange eb70 currency_franc eafa currency_lira eaef currency_pound eaf1 currency_ruble eaec currency_rupee eaf7 currency_yen eafb currency_yuan eaf9 curtains ec1e curtains_closed ec1d cut f08b cyclone ebd5 dangerous e99a dark_mode e51c dashboard e871 dashboard_customize e99b data_array ead1 data_exploration e76f data_object ead3 data_saver_off eff2 data_saver_on eff3 data_thresholding eb9f data_usage e1af dataset f8ee dataset_linked f8ef date_range e916 deblur eb77 deck ea42 dehaze e3c7 delete e872 delete_forever e92b delete_outline e92e delete_sweep e16c delivery_dining ea72 density_large eba9 density_medium eb9e density_small eba8 departure_board e576 description e873 deselect ebb6 design_services f10a desk f8f4 desktop_access_disabled e99d desktop_mac e30b desktop_windows e30c details e3c8 developer_board e30d developer_board_off e4ff developer_mode e1b0 device_hub e335 device_thermostat e1ff device_unknown e339 devices e1b1 devices_fold ebde devices_other e337 dialer_sip e0bb dialpad e0bc diamond ead5 difference eb7d dining eff4 dinner_dining ea57 directions e52e directions_bike e52f directions_boat e532 directions_boat_filled eff5 directions_bus e530 directions_bus_filled eff6 directions_car e531 directions_car_filled eff7 directions_ferry e532 directions_off f10f directions_railway e534 directions_railway_filled eff8 directions_run e566 directions_subway e533 directions_subway_filled eff9 directions_train e534 directions_transit e535 directions_transit_filled effa directions_walk e536 dirty_lens ef4b disabled_by_default f230 disabled_visible e76e disc_full e610 discord ea6c discount ebc9 display_settings eb97 diversity_1 f8d7 diversity_2 f8d8 diversity_3 f8d9 dnd_forwardslash e611 dns e875 do_disturb f08c do_disturb_alt f08d do_disturb_off f08e do_disturb_on f08f do_not_disturb e612 do_not_disturb_alt e611 do_not_disturb_off e643 do_not_disturb_on e644 do_not_disturb_on_total_silence effb do_not_step f19f do_not_touch f1b0 dock e30e document_scanner e5fa domain e7ee domain_add eb62 domain_disabled e0ef domain_verification ef4c done e876 done_all e877 done_outline e92f donut_large e917 donut_small e918 door_back effc door_front effd door_sliding effe doorbell efff double_arrow ea50 downhill_skiing e509 download f090 download_done f091 download_for_offline f000 downloading f001 drafts e151 drag_handle e25d drag_indicator e945 draw e746 drive_eta e613 drive_file_move e675 drive_file_move_rtl e76d drive_file_rename_outline e9a2 drive_folder_upload e9a3 dry f1b3 dry_cleaning ea58 duo e9a5 dvr e1b2 dynamic_feed ea14 dynamic_form f1bf e_mobiledata f002 earbuds f003 earbuds_battery f004 east f1df eco ea35 edgesensor_high f005 edgesensor_low f006 edit e3c9 edit_attributes e578 edit_calendar e742 edit_location e568 edit_location_alt e1c5 edit_note e745 edit_notifications e525 edit_off e950 edit_road ef4d egg eacc egg_alt eac8 eject e8fb elderly f21a elderly_woman eb69 electric_bike eb1b electric_bolt ec1c electric_car eb1c electric_meter ec1b electric_moped eb1d electric_rickshaw eb1e electric_scooter eb1f electrical_services f102 elevator f1a0 email e0be emergency e1eb emergency_recording ebf4 emergency_share ebf6 emoji_emotions ea22 emoji_events ea23 emoji_flags ea1a emoji_food_beverage ea1b emoji_nature ea1c emoji_objects ea24 emoji_people ea1d emoji_symbols ea1e emoji_transportation ea1f energy_savings_leaf ec1a engineering ea3d enhance_photo_translate e8fc enhanced_encryption e63f equalizer e01d error e000 error_outline e001 escalator f1a1 escalator_warning f1ac euro ea15 euro_symbol e926 ev_station e56d event e878 event_available e614 event_busy e615 event_note e616 event_repeat eb7b event_seat e903 exit_to_app e879 expand e94f expand_circle_down e7cd expand_less e5ce expand_more e5cf explicit e01e explore e87a explore_off e9a8 exposure e3ca exposure_minus_1 e3cb exposure_minus_2 e3cc exposure_neg_1 e3cb exposure_neg_2 e3cc exposure_plus_1 e3cd exposure_plus_2 e3ce exposure_zero e3cf extension e87b extension_off e4f5 face e87c face_2 f8da face_3 f8db face_4 f8dc face_5 f8dd face_6 f8de face_retouching_natural ef4e face_retouching_off f007 face_unlock f008 facebook f234 fact_check f0c5 factory ebbc family_restroom f1a2 fast_forward e01f fast_rewind e020 fastfood e57a favorite e87d favorite_border e87e favorite_outline e87e fax ead8 featured_play_list e06d featured_video e06e feed f009 feedback e87f female e590 fence f1f6 festival ea68 fiber_dvr e05d fiber_manual_record e061 fiber_new e05e fiber_pin e06a fiber_smart_record e062 file_copy e173 file_download e2c4 file_download_done e9aa file_download_off e4fe file_open eaf3 file_present ea0e file_upload e2c6 filter e3d3 filter_1 e3d0 filter_2 e3d1 filter_3 e3d2 filter_4 e3d4 filter_5 e3d5 filter_6 e3d6 filter_7 e3d7 filter_8 e3d8 filter_9 e3d9 filter_9_plus e3da filter_alt ef4f filter_alt_off eb32 filter_b_and_w e3db filter_center_focus e3dc filter_drama e3dd filter_frames e3de filter_hdr e3df filter_list e152 filter_list_off eb57 filter_none e3e0 filter_tilt_shift e3e2 filter_vintage e3e3 find_in_page e880 find_replace e881 fingerprint e90d fire_extinguisher f1d8 fire_hydrant_alt f8f1 fire_truck f8f2 fireplace ea43 first_page e5dc fit_screen ea10 fitbit e82b fitness_center eb43 flag e153 flag_circle eaf8 flaky ef50 flare e3e4 flash_auto e3e5 flash_off e3e6 flash_on e3e7 flashlight_off f00a flashlight_on f00b flatware f00c flight e539 flight_class e7cb flight_land e904 flight_takeoff e905 flip e3e8 flip_camera_android ea37 flip_camera_ios ea38 flip_to_back e882 flip_to_front e883 flood ebe6 flourescent f00d flutter_dash e00b fmd_bad f00e fmd_good f00f folder e2c7 folder_copy ebbd folder_delete eb34 folder_off eb83 folder_open e2c8 folder_shared e2c9 folder_special e617 folder_zip eb2c follow_the_signs f222 font_download e167 font_download_off e4f9 food_bank f1f2 forest ea99 fork_left eba0 fork_right ebac format_align_center e234 format_align_justify e235 format_align_left e236 format_align_right e237 format_bold e238 format_clear e239 format_color_fill e23a format_color_reset e23b format_color_text e23c format_indent_decrease e23d format_indent_increase e23e format_italic e23f format_line_spacing e240 format_list_bulleted e241 format_list_numbered e242 format_list_numbered_rtl e267 format_overline eb65 format_paint e243 format_quote e244 format_shapes e25e format_size e245 format_strikethrough e246 format_textdirection_l_to_r e247 format_textdirection_r_to_l e248 format_underline e765 format_underlined e765 fort eaad forum e0bf forward e154 forward_10 e056 forward_30 e057 forward_5 e058 forward_to_inbox f187 foundation f200 free_breakfast eb44 free_cancellation e748 front_hand e769 fullscreen e5d0 fullscreen_exit e5d1 functions e24a g_mobiledata f010 g_translate e927 gamepad e30f games e021 garage f011 gas_meter ec19 gavel e90e generating_tokens e749 gesture e155 get_app e884 gif e908 gif_box e7a3 girl eb68 gite e58b golf_course eb45 gpp_bad f012 gpp_good f013 gpp_maybe f014 gps_fixed e1b3 gps_not_fixed e1b4 gps_off e1b5 grade e885 gradient e3e9 grading ea4f grain e3ea graphic_eq e1b8 grass f205 grid_3x3 f015 grid_4x4 f016 grid_goldenratio f017 grid_off e3eb grid_on e3ec grid_view e9b0 group e7ef group_add e7f0 group_off e747 group_remove e7ad group_work e886 groups f233 groups_2 f8df groups_3 f8e0 h_mobiledata f018 h_plus_mobiledata f019 hail e9b1 handshake ebcb handyman f10b hardware ea59 hd e052 hdr_auto f01a hdr_auto_select f01b hdr_enhanced_select ef51 hdr_off e3ed hdr_off_select f01c hdr_on e3ee hdr_on_select f01d hdr_plus f01e hdr_strong e3f1 hdr_weak e3f2 headphones f01f headphones_battery f020 headset e310 headset_mic e311 headset_off e33a healing e3f3 health_and_safety e1d5 hearing e023 hearing_disabled f104 heart_broken eac2 heat_pump ec18 height ea16 help e887 help_center f1c0 help_outline e8fd hevc f021 hexagon eb39 hide_image f022 hide_source f023 high_quality e024 highlight e25f highlight_alt ef52 highlight_off e888 highlight_remove e888 hiking e50a history e889 history_edu ea3e history_toggle_off f17d hive eaa6 hls eb8a hls_off eb8c holiday_village e58a home e88a home_max f024 home_mini f025 home_repair_service f100 home_work ea09 horizontal_distribute e014 horizontal_rule f108 horizontal_split e947 hot_tub eb46 hotel e53a hotel_class e743 hourglass_bottom ea5c hourglass_disabled ef53 hourglass_empty e88b hourglass_full e88c hourglass_top ea5b house ea44 house_siding f202 houseboat e584 how_to_reg e174 how_to_vote e175 html eb7e http e902 https e88d hub e9f4 hvac f10e ice_skating e50b icecream ea69 image e3f4 image_aspect_ratio e3f5 image_not_supported f116 image_search e43f imagesearch_roller e9b4 import_contacts e0e0 import_export e0c3 important_devices e912 inbox e156 incomplete_circle e79b indeterminate_check_box e909 info e88e input e890 insert_chart e24b insert_chart_outlined e26a insert_comment e24c insert_drive_file e24d insert_emoticon e24e insert_invitation e24f insert_link e250 insert_page_break eaca insert_photo e251 insights f092 install_desktop eb71 install_mobile eb72 integration_instructions ef54 interests e7c8 interpreter_mode e83b inventory e179 inventory_2 e1a1 invert_colors e891 invert_colors_off e0c4 invert_colors_on e891 ios_share e6b8 iron e583 iso e3f6 javascript eb7c join_full eaeb join_inner eaf4 join_left eaf2 join_right eaea kayaking e50c kebab_dining e842 key e73c key_off eb84 keyboard e312 keyboard_alt f028 keyboard_arrow_down e313 keyboard_arrow_left e314 keyboard_arrow_right e315 keyboard_arrow_up e316 keyboard_backspace e317 keyboard_capslock e318 keyboard_command_key eae7 keyboard_control eae1 keyboard_control_key eae6 keyboard_double_arrow_down ead0 keyboard_double_arrow_left eac3 keyboard_double_arrow_right eac9 keyboard_double_arrow_up eacf keyboard_hide e31a keyboard_option_key eae8 keyboard_return e31b keyboard_tab e31c keyboard_voice e31d king_bed ea45 kitchen eb47 kitesurfing e50d label e892 label_important e937 label_off e9b6 lan eb2f landscape e3f7 landslide ebd7 language e894 laptop e31e laptop_chromebook e31f laptop_mac e320 laptop_windows e321 last_page e5dd launch e895 layers e53b layers_clear e53c leaderboard f20c leak_add e3f8 leak_remove e3f9 leave_bags_at_home f23b legend_toggle f11b lens e3fa lens_blur f029 library_add e02e library_add_check e9b7 library_books e02f library_music e030 light f02a light_mode e518 lightbulb e0f0 lightbulb_circle ebfe line_axis ea9a line_style e919 line_weight e91a linear_scale e260 link e157 link_off e16f linked_camera e438 liquor ea60 list e896 list_alt e0ee live_help e0c6 live_tv e639 living f02b local_activity e53f local_airport e53d local_atm e53e local_attraction e53f local_bar e540 local_cafe e541 local_car_wash e542 local_convenience_store e543 local_dining e556 local_drink e544 local_fire_department ef55 local_florist e545 local_gas_station e546 local_grocery_store e547 local_hospital e548 local_hotel e549 local_laundry_service e54a local_library e54b local_mall e54c local_movies e54d local_offer e54e local_parking e54f local_pharmacy e550 local_phone e551 local_pizza e552 local_play e553 local_police ef56 local_post_office e554 local_print_shop e555 local_printshop e555 local_restaurant e556 local_see e557 local_shipping e558 local_taxi e559 location_city e7f1 location_disabled e1b6 location_history e55a location_off e0c7 location_on e0c8 location_searching e1b7 lock e897 lock_clock ef57 lock_open e898 lock_person f8f3 lock_reset eade login ea77 logo_dev ead6 logout e9ba looks e3fc looks_3 e3fb looks_4 e3fd looks_5 e3fe looks_6 e3ff looks_one e400 looks_two e401 loop e028 loupe e402 low_priority e16d loyalty e89a lte_mobiledata f02c lte_plus_mobiledata f02d luggage f235 lunch_dining ea61 lyrics ec0b macro_off f8d2 mail e158 mail_lock ec0a mail_outline e0e1 male e58e man e4eb man_2 f8e1 man_3 f8e2 man_4 f8e3 manage_accounts f02e manage_history ebe7 manage_search f02f map e55b maps_home_work f030 maps_ugc ef58 margin e9bb mark_as_unread e9bc mark_chat_read f18b mark_chat_unread f189 mark_email_read f18c mark_email_unread f18a mark_unread_chat_alt eb9d markunread e159 markunread_mailbox e89b masks f218 maximize e930 media_bluetooth_off f031 media_bluetooth_on f032 mediation efa7 medical_information ebed medical_services f109 medication f033 medication_liquid ea87 meeting_room eb4f memory e322 menu e5d2 menu_book ea19 menu_open e9bd merge eb98 merge_type e252 message e0c9 messenger e0ca messenger_outline e0cb mic e029 mic_external_off ef59 mic_external_on ef5a mic_none e02a mic_off e02b microwave f204 military_tech ea3f minimize e931 minor_crash ebf1 miscellaneous_services f10c missed_video_call e073 mms e618 mobile_friendly e200 mobile_off e201 mobile_screen_share e0e7 mobiledata_off f034 mode f097 mode_comment e253 mode_edit e254 mode_edit_outline f035 mode_fan_off ec17 mode_night f036 mode_of_travel e7ce mode_standby f037 model_training f0cf monetization_on e263 money e57d money_off e25c money_off_csred f038 monitor ef5b monitor_heart eaa2 monitor_weight f039 monochrome_photos e403 mood e7f2 mood_bad e7f3 moped eb28 more e619 more_horiz eae1 more_time ea5d more_vert e5d4 mosque eab2 motion_photos_auto f03a motion_photos_off e9c0 motion_photos_on e9c1 motion_photos_pause f227 motion_photos_paused e9c2 motorcycle e91b mouse e323 move_down eb61 move_to_inbox e168 move_up eb64 movie e02c movie_creation e404 movie_filter e43a moving e501 mp e9c3 multiline_chart e6df multiple_stop f1b9 multitrack_audio e1b8 museum ea36 music_note e405 music_off e440 music_video e063 my_library_add e02e my_library_books e02f my_library_music e030 my_location e55c nat ef5c nature e406 nature_people e407 navigate_before e408 navigate_next e409 navigation e55d near_me e569 near_me_disabled f1ef nearby_error f03b nearby_off f03c nest_cam_wired_stand ec16 network_cell e1b9 network_check e640 network_locked e61a network_ping ebca network_wifi e1ba network_wifi_1_bar ebe4 network_wifi_2_bar ebd6 network_wifi_3_bar ebe1 new_label e609 new_releases e031 newspaper eb81 next_plan ef5d next_week e16a nfc e1bb night_shelter f1f1 nightlife ea62 nightlight f03d nightlight_round ef5e nights_stay ea46 no_accounts f03e no_adult_content f8fe no_backpack f237 no_cell f1a4 no_crash ebf0 no_drinks f1a5 no_encryption e641 no_encryption_gmailerrorred f03f no_flash f1a6 no_food f1a7 no_luggage f23b no_meals f1d6 no_meeting_room eb4e no_photography f1a8 no_sim e0cc no_stroller f1af no_transfer f1d5 noise_aware ebec noise_control_off ebf3 nordic_walking e50e north f1e0 north_east f1e1 north_west f1e2 not_accessible f0fe not_interested e033 not_listed_location e575 not_started f0d1 note e06f note_add e89c note_alt f040 notes e26c notification_add e399 notification_important e004 notifications e7f4 notifications_active e7f7 notifications_none e7f5 notifications_off e7f6 notifications_on e7f7 notifications_paused e7f8 now_wallpaper e75f now_widgets e75e numbers eac7 offline_bolt e932 offline_pin e90a offline_share e9c5 oil_barrel ec15 on_device_training ebfd ondemand_video e63a online_prediction f0eb opacity e91c open_in_browser e89d open_in_full f1ce open_in_new e89e open_in_new_off e4f6 open_with e89f other_houses e58c outbond f228 outbound e1ca outbox ef5f outdoor_grill ea47 outlet f1d4 outlined_flag e16e output ebbe padding e9c8 pages e7f9 pageview e8a0 paid f041 palette e40a pan_tool e925 pan_tool_alt ebb9 panorama e40b panorama_fish_eye e40c panorama_fisheye e40c panorama_horizontal e40d panorama_horizontal_select ef60 panorama_photosphere e9c9 panorama_photosphere_select e9ca panorama_vertical e40e panorama_vertical_select ef61 panorama_wide_angle e40f panorama_wide_angle_select ef62 paragliding e50f park ea63 party_mode e7fa password f042 paste f098 pattern f043 pause e034 pause_circle e1a2 pause_circle_filled e035 pause_circle_outline e036 pause_presentation e0ea payment e8a1 payments ef63 paypal ea8d pedal_bike eb29 pending ef64 pending_actions f1bb pentagon eb50 people e7fb people_alt ea21 people_outline e7fc percent eb58 perm_camera_mic e8a2 perm_contact_cal e8a3 perm_contact_calendar e8a3 perm_data_setting e8a4 perm_device_info e8a5 perm_device_information e8a5 perm_identity e8a6 perm_media e8a7 perm_phone_msg e8a8 perm_scan_wifi e8a9 person e7fd person_2 f8e4 person_3 f8e5 person_4 f8e6 person_add e7fe person_add_alt ea4d person_add_alt_1 ef65 person_add_disabled e9cb person_off e510 person_outline e7ff person_pin e55a person_pin_circle e56a person_remove ef66 person_remove_alt_1 ef67 person_search f106 personal_injury e6da personal_video e63b pest_control f0fa pest_control_rodent f0fd pets e91d phishing ead7 phone e0cd phone_android e324 phone_bluetooth_speaker e61b phone_callback e649 phone_disabled e9cc phone_enabled e9cd phone_forwarded e61c phone_in_talk e61d phone_iphone e325 phone_locked e61e phone_missed e61f phone_paused e620 phonelink e326 phonelink_erase e0db phonelink_lock e0dc phonelink_off e327 phonelink_ring e0dd phonelink_setup e0de photo e410 photo_album e411 photo_camera e412 photo_camera_back ef68 photo_camera_front ef69 photo_filter e43b photo_library e413 photo_size_select_actual e432 photo_size_select_large e433 photo_size_select_small e434 php eb8f piano e521 piano_off e520 picture_as_pdf e415 picture_in_picture e8aa picture_in_picture_alt e911 pie_chart e6c4 pie_chart_outline f044 pin f045 pin_drop e55e pin_end e767 pin_invoke e763 pinch eb38 pivot_table_chart e9ce pix eaa3 place e55f plagiarism ea5a play_arrow e037 play_circle e1c4 play_circle_fill e038 play_circle_filled e038 play_circle_outline e039 play_disabled ef6a play_for_work e906 play_lesson f047 playlist_add e03b playlist_add_check e065 playlist_add_check_circle e7e6 playlist_add_circle e7e5 playlist_play e05f playlist_remove eb80 plumbing f107 plus_one e800 podcasts f048 point_of_sale f17e policy ea17 poll e801 polyline ebbb polymer e8ab pool eb48 portable_wifi_off e0ce portrait e416 post_add ea20 power e63c power_input e336 power_off e646 power_settings_new e8ac precision_manufacturing f049 pregnant_woman e91e present_to_all e0df preview f1c5 price_change f04a price_check f04b print e8ad print_disabled e9cf priority_high e645 privacy_tip f0dc private_connectivity e744 production_quantity_limits e1d1 propane ec14 propane_tank ec13 psychology ea4a psychology_alt f8ea public e80b public_off f1ca publish e255 published_with_changes f232 punch_clock eaa8 push_pin f10d qr_code ef6b qr_code_2 e00a qr_code_scanner f206 query_builder e8ae query_stats e4fc question_answer e8af question_mark eb8b queue e03c queue_music e03d queue_play_next e066 quick_contacts_dialer e0cf quick_contacts_mail e0d0 quickreply ef6c quiz f04c quora ea98 r_mobiledata f04d radar f04e radio e03e radio_button_checked e837 radio_button_off e836 radio_button_on e837 radio_button_unchecked e836 railway_alert e9d1 ramen_dining ea64 ramp_left eb9c ramp_right eb96 rate_review e560 raw_off f04f raw_on f050 read_more ef6d real_estate_agent e73a receipt e8b0 receipt_long ef6e recent_actors e03f recommend e9d2 record_voice_over e91f rectangle eb54 recycling e760 reddit eaa0 redeem e8b1 redo e15a reduce_capacity f21c refresh e5d5 remember_me f051 remove e15b remove_circle e15c remove_circle_outline e15d remove_done e9d3 remove_from_queue e067 remove_moderator e9d4 remove_red_eye e417 remove_road ebfc remove_shopping_cart e928 reorder e8fe repartition f8e8 repeat e040 repeat_on e9d6 repeat_one e041 repeat_one_on e9d7 replay e042 replay_10 e059 replay_30 e05a replay_5 e05b replay_circle_filled e9d8 reply e15e reply_all e15f report e160 report_gmailerrorred f052 report_off e170 report_problem e8b2 request_page f22c request_quote f1b6 reset_tv e9d9 restart_alt f053 restaurant e56c restaurant_menu e561 restore e8b3 restore_from_trash e938 restore_page e929 reviews f054 rice_bowl f1f5 ring_volume e0d1 rocket eba5 rocket_launch eb9b roller_shades ec12 roller_shades_closed ec11 roller_skating ebcd roofing f201 room e8b4 room_preferences f1b8 room_service eb49 rotate_90_degrees_ccw e418 rotate_90_degrees_cw eaab rotate_left e419 rotate_right e41a roundabout_left eb99 roundabout_right eba3 rounded_corner e920 route eacd router e328 rowing e921 rss_feed e0e5 rsvp f055 rtt e9ad rule f1c2 rule_folder f1c9 run_circle ef6f running_with_errors e51d rv_hookup e642 safety_check ebef safety_divider e1cc sailing e502 sanitizer f21d satellite e562 satellite_alt eb3a save e161 save_alt e171 save_as eb60 saved_search ea11 savings e2eb scale eb5f scanner e329 scatter_plot e268 schedule e8b5 schedule_send ea0a schema e4fd school e80c science ea4b score e269 scoreboard ebd0 screen_lock_landscape e1be screen_lock_portrait e1bf screen_lock_rotation e1c0 screen_rotation e1c1 screen_rotation_alt ebee screen_search_desktop ef70 screen_share e0e2 screenshot f056 screenshot_monitor ec08 scuba_diving ebce sd e9dd sd_card e623 sd_card_alert f057 sd_storage e1c2 search e8b6 search_off ea76 security e32a security_update f058 security_update_good f059 security_update_warning f05a segment e94b select_all e162 self_improvement ea78 sell f05b send e163 send_and_archive ea0c send_time_extension eadb send_to_mobile f05c sensor_door f1b5 sensor_occupied ec10 sensor_window f1b4 sensors e51e sensors_off e51f sentiment_dissatisfied e811 sentiment_neutral e812 sentiment_satisfied e813 sentiment_satisfied_alt e0ed sentiment_very_dissatisfied e814 sentiment_very_satisfied e815 set_meal f1ea settings e8b8 settings_accessibility f05d settings_applications e8b9 settings_backup_restore e8ba settings_bluetooth e8bb settings_brightness e8bd settings_cell e8bc settings_display e8bd settings_ethernet e8be settings_input_antenna e8bf settings_input_component e8c0 settings_input_composite e8c1 settings_input_hdmi e8c2 settings_input_svideo e8c3 settings_overscan e8c4 settings_phone e8c5 settings_power e8c6 settings_remote e8c7 settings_suggest f05e settings_system_daydream e1c3 settings_voice e8c8 severe_cold ebd3 shape_line f8d3 share e80d share_arrival_time e524 share_location f05f shield e9e0 shield_moon eaa9 shop e8c9 shop_2 e19e shop_two e8ca shopify ea9d shopping_bag f1cc shopping_basket e8cb shopping_cart e8cc shopping_cart_checkout eb88 short_text e261 shortcut f060 show_chart e6e1 shower f061 shuffle e043 shuffle_on e9e1 shutter_speed e43d sick f220 sign_language ebe5 signal_cellular_0_bar f0a8 signal_cellular_4_bar e1c8 signal_cellular_alt e202 signal_cellular_alt_1_bar ebdf signal_cellular_alt_2_bar ebe3 signal_cellular_connected_no_internet_0_bar f0ac signal_cellular_connected_no_internet_4_bar e1cd signal_cellular_no_sim e1ce signal_cellular_nodata f062 signal_cellular_null e1cf signal_cellular_off e1d0 signal_wifi_0_bar f0b0 signal_wifi_4_bar e1d8 signal_wifi_4_bar_lock e1d9 signal_wifi_bad f063 signal_wifi_connected_no_internet_4 f064 signal_wifi_off e1da signal_wifi_statusbar_4_bar f065 signal_wifi_statusbar_connected_no_internet_4 f066 signal_wifi_statusbar_null f067 signpost eb91 sim_card e32b sim_card_alert e624 sim_card_download f068 single_bed ea48 sip f069 skateboarding e511 skip_next e044 skip_previous e045 sledding e512 slideshow e41b slow_motion_video e068 smart_button f1c1 smart_display f06a smart_screen f06b smart_toy f06c smartphone e32c smoke_free eb4a smoking_rooms eb4b sms e625 sms_failed e626 snapchat ea6e snippet_folder f1c7 snooze e046 snowboarding e513 snowmobile e503 snowshoeing e514 soap f1b2 social_distance e1cb solar_power ec0f sort e164 sort_by_alpha e053 sos ebf7 soup_kitchen e7d3 source f1c4 south f1e3 south_america e7e4 south_east f1e4 south_west f1e5 spa eb4c space_bar e256 space_dashboard e66b spatial_audio ebeb spatial_audio_off ebe8 spatial_tracking ebea speaker e32d speaker_group e32e speaker_notes e8cd speaker_notes_off e92a speaker_phone e0d2 speed e9e4 spellcheck e8ce splitscreen f06d spoke e9a7 sports ea30 sports_bar f1f3 sports_baseball ea51 sports_basketball ea26 sports_cricket ea27 sports_esports ea28 sports_football ea29 sports_golf ea2a sports_gymnastics ebc4 sports_handball ea33 sports_hockey ea2b sports_kabaddi ea34 sports_martial_arts eae9 sports_mma ea2c sports_motorsports ea2d sports_rugby ea2e sports_score f06e sports_soccer ea2f sports_tennis ea32 sports_volleyball ea31 square eb36 square_foot ea49 ssid_chart eb66 stacked_bar_chart e9e6 stacked_line_chart f22b stadium eb90 stairs f1a9 star e838 star_border e83a star_border_purple500 f099 star_half e839 star_outline f06f star_purple500 f09a star_rate f0ec stars e8d0 start e089 stay_current_landscape e0d3 stay_current_portrait e0d4 stay_primary_landscape e0d5 stay_primary_portrait e0d6 sticky_note_2 f1fc stop e047 stop_circle ef71 stop_screen_share e0e3 storage e1db store e8d1 store_mall_directory e563 storefront ea12 storm f070 straight eb95 straighten e41c stream e9e9 streetview e56e strikethrough_s e257 stroller f1ae style e41d subdirectory_arrow_left e5d9 subdirectory_arrow_right e5da subject e8d2 subscript f111 subscriptions e064 subtitles e048 subtitles_off ef72 subway e56f summarize f071 superscript f112 supervised_user_circle e939 supervisor_account e8d3 support ef73 support_agent f0e2 surfing e515 surround_sound e049 swap_calls e0d7 swap_horiz e8d4 swap_horizontal_circle e933 swap_vert e8d5 swap_vert_circle e8d6 swap_vertical_circle e8d6 swipe e9ec swipe_down eb53 swipe_down_alt eb30 swipe_left eb59 swipe_left_alt eb33 swipe_right eb52 swipe_right_alt eb56 swipe_up eb2e swipe_up_alt eb35 swipe_vertical eb51 switch_access_shortcut e7e1 switch_access_shortcut_add e7e2 switch_account e9ed switch_camera e41e switch_left f1d1 switch_right f1d2 switch_video e41f synagogue eab0 sync e627 sync_alt ea18 sync_disabled e628 sync_lock eaee sync_problem e629 system_security_update f072 system_security_update_good f073 system_security_update_warning f074 system_update e62a system_update_alt e8d7 system_update_tv e8d7 tab e8d8 tab_unselected e8d9 table_bar ead2 table_chart e265 table_restaurant eac6 table_rows f101 table_view f1be tablet e32f tablet_android e330 tablet_mac e331 tag e9ef tag_faces e420 takeout_dining ea74 tap_and_play e62b tapas f1e9 task f075 task_alt e2e6 taxi_alert ef74 telegram ea6b temple_buddhist eab3 temple_hindu eaaf terminal eb8e terrain e564 text_decrease eadd text_fields e262 text_format e165 text_increase eae2 text_rotate_up e93a text_rotate_vertical e93b text_rotation_angledown e93c text_rotation_angleup e93d text_rotation_down e93e text_rotation_none e93f text_snippet f1c6 textsms e0d8 texture e421 theater_comedy ea66 theaters e8da thermostat f076 thermostat_auto f077 thumb_down e8db thumb_down_alt e816 thumb_down_off_alt e9f2 thumb_up e8dc thumb_up_alt e817 thumb_up_off_alt e9f3 thumbs_up_down e8dd thunderstorm ebdb tiktok ea7e time_to_leave e62c timelapse e422 timeline e922 timer e425 timer_10 e423 timer_10_select f07a timer_3 e424 timer_3_select f07b timer_off e426 tips_and_updates e79a tire_repair ebc8 title e264 toc e8de today e8df toggle_off e9f5 toggle_on e9f6 token ea25 toll e8e0 tonality e427 topic f1c8 tornado e199 touch_app e913 tour ef75 toys e332 track_changes e8e1 traffic e565 train e570 tram e571 transcribe f8ec transfer_within_a_station e572 transform e428 transgender e58d transit_enterexit e579 translate e8e2 travel_explore e2db trending_down e8e3 trending_flat e8e4 trending_neutral e8e4 trending_up e8e5 trip_origin e57b troubleshoot e1d2 try f07c tsunami ebd8 tty f1aa tune e429 tungsten f07d turn_left eba6 turn_right ebab turn_sharp_left eba7 turn_sharp_right ebaa turn_slight_left eba4 turn_slight_right eb9a turned_in e8e6 turned_in_not e8e7 tv e333 tv_off e647 two_wheeler e9f9 type_specimen f8f0 u_turn_left eba1 u_turn_right eba2 umbrella f1ad unarchive e169 undo e166 unfold_less e5d6 unfold_less_double f8cf unfold_more e5d7 unfold_more_double f8d0 unpublished f236 unsubscribe e0eb upcoming f07e update e923 update_disabled e075 upgrade f0fb upload f09b upload_file e9fc usb e1e0 usb_off e4fa vaccines e138 vape_free ebc6 vaping_rooms ebcf verified ef76 verified_user e8e8 vertical_align_bottom e258 vertical_align_center e259 vertical_align_top e25a vertical_distribute e076 vertical_shades ec0e vertical_shades_closed ec0d vertical_split e949 vibration e62d video_call e070 video_camera_back f07f video_camera_front f080 video_collection e04a video_file eb87 video_label e071 video_library e04a video_settings ea75 video_stable f081 videocam e04b videocam_off e04c videogame_asset e338 videogame_asset_off e500 view_agenda e8e9 view_array e8ea view_carousel e8eb view_column e8ec view_comfortable e42a view_comfy e42a view_comfy_alt eb73 view_compact e42b view_compact_alt eb74 view_cozy eb75 view_day e8ed view_headline e8ee view_in_ar e9fe view_kanban eb7f view_list e8ef view_module e8f0 view_quilt e8f1 view_sidebar f114 view_stream e8f2 view_timeline eb85 view_week e8f3 vignette e435 villa e586 visibility e8f4 visibility_off e8f5 voice_chat e62e voice_over_off e94a voicemail e0d9 volcano ebda volume_down e04d volume_mute e04e volume_off e04f volume_up e050 volunteer_activism ea70 vpn_key e0da vpn_key_off eb7a vpn_lock e62f vrpano f082 wallet f8ff wallet_giftcard e8f6 wallet_membership e8f7 wallet_travel e8f8 wallpaper e75f warehouse ebb8 warning e002 warning_amber f083 wash f1b1 watch e334 watch_later e924 watch_off eae3 water f084 water_damage f203 water_drop e798 waterfall_chart ea00 waves e176 waving_hand e766 wb_auto e42c wb_cloudy e42d wb_incandescent e42e wb_iridescent e436 wb_shade ea01 wb_sunny e430 wb_twilight e1c6 wc e63d web e051 web_asset e069 web_asset_off e4f7 web_stories e595 webhook eb92 wechat ea81 weekend e16b west f1e6 whatsapp ea9c whatshot e80e wheelchair_pickup f1ab where_to_vote e177 widgets e75e width_full f8f5 width_normal f8f6 width_wide f8f7 wifi e63e wifi_1_bar e4ca wifi_2_bar e4d9 wifi_calling ef77 wifi_calling_3 f085 wifi_channel eb6a wifi_find eb31 wifi_lock e1e1 wifi_off e648 wifi_password eb6b wifi_protected_setup f0fc wifi_tethering e1e2 wifi_tethering_error f086 wifi_tethering_error_rounded f086 wifi_tethering_off f087 wind_power ec0c window f088 wine_bar f1e8 woman e13e woman_2 f8e7 woo_commerce ea6d wordpress ea9f work e8f9 work_history ec09 work_off e942 work_outline e943 workspace_premium e7af workspaces e1a0 wrap_text e25b wrong_location ef78 wysiwyg f1c3 yard f089 youtube_searched_for e8fa zoom_in e8ff zoom_in_map eb2d zoom_out e900 zoom_out_map e56b ================================================ FILE: webapp/frontend/src/assets/fonts/material-icons/MaterialIconsRound-Regular.codepoints ================================================ 10k e951 10mp e952 11mp e953 123 eb8d 12mp e954 13mp e955 14mp e956 15mp e957 16mp e958 17mp e959 18_up_rating f8fd 18mp e95a 19mp e95b 1k e95c 1k_plus e95d 1x_mobiledata efcd 20mp e95e 21mp e95f 22mp e960 23mp e961 24mp e962 2k e963 2k_plus e964 2mp e965 30fps efce 30fps_select efcf 360 e577 3d_rotation e84d 3g_mobiledata efd0 3k e966 3k_plus e967 3mp e968 3p efd1 4g_mobiledata efd2 4g_plus_mobiledata efd3 4k e072 4k_plus e969 4mp e96a 5g ef38 5k e96b 5k_plus e96c 5mp e96d 60fps efd4 60fps_select efd5 6_ft_apart f21e 6k e96e 6k_plus e96f 6mp e970 7k e971 7k_plus e972 7mp e973 8k e974 8k_plus e975 8mp e976 9k e977 9k_plus e978 9mp e979 abc eb94 ac_unit eb3b access_alarm e190 access_alarms e191 access_time e192 access_time_filled efd6 accessibility e84e accessibility_new e92c accessible e914 accessible_forward e934 account_balance e84f account_balance_wallet e850 account_box e851 account_circle e853 account_tree e97a ad_units ef39 adb e60e add e145 add_a_photo e439 add_alarm e193 add_alert e003 add_box e146 add_business e729 add_card eb86 add_chart e97b add_circle e147 add_circle_outline e148 add_comment e266 add_home f8eb add_home_work f8ed add_ic_call e97c add_link e178 add_location e567 add_location_alt ef3a add_moderator e97d add_photo_alternate e43e add_reaction e1d3 add_road ef3b add_shopping_cart e854 add_task f23a add_to_drive e65c add_to_home_screen e1fe add_to_photos e39d add_to_queue e05c addchart ef3c adf_scanner eada adjust e39e admin_panel_settings ef3d adobe ea96 ads_click e762 agriculture ea79 air efd8 airline_seat_flat e630 airline_seat_flat_angled e631 airline_seat_individual_suite e632 airline_seat_legroom_extra e633 airline_seat_legroom_normal e634 airline_seat_legroom_reduced e635 airline_seat_recline_extra e636 airline_seat_recline_normal e637 airline_stops e7d0 airlines e7ca airplane_ticket efd9 airplanemode_active e195 airplanemode_inactive e194 airplanemode_off e194 airplanemode_on e195 airplay e055 airport_shuttle eb3c alarm e855 alarm_add e856 alarm_off e857 alarm_on e858 album e019 align_horizontal_center e00f align_horizontal_left e00d align_horizontal_right e010 align_vertical_bottom e015 align_vertical_center e011 align_vertical_top e00c all_inbox e97f all_inclusive eb3d all_out e90b alt_route f184 alternate_email e0e6 amp_stories ea13 analytics ef3e anchor f1cd android e859 animation e71c announcement e85a aod efda apartment ea40 api f1b7 app_blocking ef3f app_registration ef40 app_settings_alt ef41 app_shortcut eae4 apple ea80 approval e982 apps e5c3 apps_outage e7cc architecture ea3b archive e149 area_chart e770 arrow_back e5c4 arrow_back_ios e5e0 arrow_back_ios_new e2ea arrow_circle_down f181 arrow_circle_left eaa7 arrow_circle_right eaaa arrow_circle_up f182 arrow_downward e5db arrow_drop_down e5c5 arrow_drop_down_circle e5c6 arrow_drop_up e5c7 arrow_forward e5c8 arrow_forward_ios e5e1 arrow_left e5de arrow_outward f8ce arrow_right e5df arrow_right_alt e941 arrow_upward e5d8 art_track e060 article ef42 aspect_ratio e85b assessment e85c assignment e85d assignment_ind e85e assignment_late e85f assignment_return e860 assignment_returned e861 assignment_turned_in e862 assist_walker f8d5 assistant e39f assistant_direction e988 assistant_photo e3a0 assured_workload eb6f atm e573 attach_email ea5e attach_file e226 attach_money e227 attachment e2bc attractions ea52 attribution efdb audio_file eb82 audiotrack e3a1 auto_awesome e65f auto_awesome_mosaic e660 auto_awesome_motion e661 auto_delete ea4c auto_fix_high e663 auto_fix_normal e664 auto_fix_off e665 auto_graph e4fb auto_mode ec20 auto_stories e666 autofps_select efdc autorenew e863 av_timer e01b baby_changing_station f19b back_hand e764 backpack f19c backspace e14a backup e864 backup_table ef43 badge ea67 bakery_dining ea53 balance eaf6 balcony e58f ballot e172 bar_chart e26b batch_prediction f0f5 bathroom efdd bathtub ea41 battery_0_bar ebdc battery_1_bar ebd9 battery_2_bar ebe0 battery_3_bar ebdd battery_4_bar ebe2 battery_5_bar ebd4 battery_6_bar ebd2 battery_alert e19c battery_charging_full e1a3 battery_full e1a4 battery_saver efde battery_std e1a5 battery_unknown e1a6 beach_access eb3e bed efdf bedroom_baby efe0 bedroom_child efe1 bedroom_parent efe2 bedtime ef44 bedtime_off eb76 beenhere e52d bento f1f4 bike_scooter ef45 biotech ea3a blender efe3 blind f8d6 blinds e286 blinds_closed ec1f block e14b bloodtype efe4 bluetooth e1a7 bluetooth_audio e60f bluetooth_connected e1a8 bluetooth_disabled e1a9 bluetooth_drive efe5 bluetooth_searching e1aa blur_circular e3a2 blur_linear e3a3 blur_off e3a4 blur_on e3a5 bolt ea0b book e865 book_online f217 bookmark e866 bookmark_add e598 bookmark_added e599 bookmark_border e867 bookmark_outline e867 bookmark_remove e59a bookmarks e98b border_all e228 border_bottom e229 border_clear e22a border_color e22b border_horizontal e22c border_inner e22d border_left e22e border_outer e22f border_right e230 border_style e231 border_top e232 border_vertical e233 boy eb67 branding_watermark e06b breakfast_dining ea54 brightness_1 e3a6 brightness_2 e3a7 brightness_3 e3a8 brightness_4 e3a9 brightness_5 e3aa brightness_6 e3ab brightness_7 e3ac brightness_auto e1ab brightness_high e1ac brightness_low e1ad brightness_medium e1ae broadcast_on_home f8f8 broadcast_on_personal f8f9 broken_image e3ad browse_gallery ebd1 browser_not_supported ef47 browser_updated e7cf brunch_dining ea73 brush e3ae bubble_chart e6dd bug_report e868 build e869 build_circle ef48 bungalow e591 burst_mode e43c bus_alert e98f business e0af business_center eb3f cabin e589 cable efe6 cached e86a cake e7e9 calculate ea5f calendar_month ebcc calendar_today e935 calendar_view_day e936 calendar_view_month efe7 calendar_view_week efe8 call e0b0 call_end e0b1 call_made e0b2 call_merge e0b3 call_missed e0b4 call_missed_outgoing e0e4 call_received e0b5 call_split e0b6 call_to_action e06c camera e3af camera_alt e3b0 camera_enhance e8fc camera_front e3b1 camera_indoor efe9 camera_outdoor efea camera_rear e3b2 camera_roll e3b3 cameraswitch efeb campaign ef49 cancel e5c9 cancel_presentation e0e9 cancel_schedule_send ea39 candlestick_chart ead4 car_crash ebf2 car_rental ea55 car_repair ea56 card_giftcard e8f6 card_membership e8f7 card_travel e8f8 carpenter f1f8 cases e992 casino eb40 cast e307 cast_connected e308 cast_for_education efec castle eab1 catching_pokemon e508 category e574 celebration ea65 cell_tower ebba cell_wifi e0ec center_focus_strong e3b4 center_focus_weak e3b5 chair efed chair_alt efee chalet e585 change_circle e2e7 change_history e86b charging_station f19d chat e0b7 chat_bubble e0ca chat_bubble_outline e0cb check e5ca check_box e834 check_box_outline_blank e835 check_circle e86c check_circle_outline e92d checklist e6b1 checklist_rtl e6b3 checkroom f19e chevron_left e5cb chevron_right e5cc child_care eb41 child_friendly eb42 chrome_reader_mode e86d church eaae circle ef4a circle_notifications e994 class e86e clean_hands f21f cleaning_services f0ff clear e14c clear_all e0b8 close e5cd close_fullscreen f1cf closed_caption e01c closed_caption_disabled f1dc closed_caption_off e996 cloud e2bd cloud_circle e2be cloud_done e2bf cloud_download e2c0 cloud_off e2c1 cloud_queue e2c2 cloud_sync eb5a cloud_upload e2c3 co2 e7b0 co_present eaf0 code e86f code_off e4f3 coffee efef coffee_maker eff0 collections e3b6 collections_bookmark e431 color_lens e3b7 colorize e3b8 comment e0b9 comment_bank ea4e comments_disabled e7a2 commit eaf5 commute e940 compare e3b9 compare_arrows e915 compass_calibration e57c compost e761 compress e94d computer e30a confirmation_num e638 confirmation_number e638 connect_without_contact f223 connected_tv e998 connecting_airports e7c9 construction ea3c contact_emergency f8d1 contact_mail e0d0 contact_page f22e contact_phone e0cf contact_support e94c contactless ea71 contacts e0ba content_copy f08a content_cut f08b content_paste f098 content_paste_go ea8e content_paste_off e4f8 content_paste_search ea9b contrast eb37 control_camera e074 control_point e3ba control_point_duplicate e3bb cookie eaac copy f08a copy_all e2ec copyright e90c coronavirus f221 corporate_fare f1d0 cottage e587 countertops f1f7 create e150 create_new_folder e2cc credit_card e870 credit_card_off e4f4 credit_score eff1 crib e588 crisis_alert ebe9 crop e3be crop_16_9 e3bc crop_3_2 e3bd crop_5_4 e3bf crop_7_5 e3c0 crop_din e3c1 crop_free e3c2 crop_landscape e3c3 crop_original e3c4 crop_portrait e3c5 crop_rotate e437 crop_square e3c6 cruelty_free e799 css eb93 currency_bitcoin ebc5 currency_exchange eb70 currency_franc eafa currency_lira eaef currency_pound eaf1 currency_ruble eaec currency_rupee eaf7 currency_yen eafb currency_yuan eaf9 curtains ec1e curtains_closed ec1d cut f08b cyclone ebd5 dangerous e99a dark_mode e51c dashboard e871 dashboard_customize e99b data_array ead1 data_exploration e76f data_object ead3 data_saver_off eff2 data_saver_on eff3 data_thresholding eb9f data_usage e1af dataset f8ee dataset_linked f8ef date_range e916 deblur eb77 deck ea42 dehaze e3c7 delete e872 delete_forever e92b delete_outline e92e delete_sweep e16c delivery_dining ea72 density_large eba9 density_medium eb9e density_small eba8 departure_board e576 description e873 deselect ebb6 design_services f10a desk f8f4 desktop_access_disabled e99d desktop_mac e30b desktop_windows e30c details e3c8 developer_board e30d developer_board_off e4ff developer_mode e1b0 device_hub e335 device_thermostat e1ff device_unknown e339 devices e1b1 devices_fold ebde devices_other e337 dialer_sip e0bb dialpad e0bc diamond ead5 difference eb7d dining eff4 dinner_dining ea57 directions e52e directions_bike e52f directions_boat e532 directions_boat_filled eff5 directions_bus e530 directions_bus_filled eff6 directions_car e531 directions_car_filled eff7 directions_ferry e532 directions_off f10f directions_railway e534 directions_railway_filled eff8 directions_run e566 directions_subway e533 directions_subway_filled eff9 directions_train e534 directions_transit e535 directions_transit_filled effa directions_walk e536 dirty_lens ef4b disabled_by_default f230 disabled_visible e76e disc_full e610 discord ea6c discount ebc9 display_settings eb97 diversity_1 f8d7 diversity_2 f8d8 diversity_3 f8d9 dnd_forwardslash e611 dns e875 do_disturb f08c do_disturb_alt f08d do_disturb_off f08e do_disturb_on f08f do_not_disturb e612 do_not_disturb_alt e611 do_not_disturb_off e643 do_not_disturb_on e644 do_not_disturb_on_total_silence effb do_not_step f19f do_not_touch f1b0 dock e30e document_scanner e5fa domain e7ee domain_add eb62 domain_disabled e0ef domain_verification ef4c done e876 done_all e877 done_outline e92f donut_large e917 donut_small e918 door_back effc door_front effd door_sliding effe doorbell efff double_arrow ea50 downhill_skiing e509 download f090 download_done f091 download_for_offline f000 downloading f001 drafts e151 drag_handle e25d drag_indicator e945 draw e746 drive_eta e613 drive_file_move e675 drive_file_move_rtl e76d drive_file_rename_outline e9a2 drive_folder_upload e9a3 dry f1b3 dry_cleaning ea58 duo e9a5 dvr e1b2 dynamic_feed ea14 dynamic_form f1bf e_mobiledata f002 earbuds f003 earbuds_battery f004 east f1df eco ea35 edgesensor_high f005 edgesensor_low f006 edit e3c9 edit_attributes e578 edit_calendar e742 edit_location e568 edit_location_alt e1c5 edit_note e745 edit_notifications e525 edit_off e950 edit_road ef4d egg eacc egg_alt eac8 eject e8fb elderly f21a elderly_woman eb69 electric_bike eb1b electric_bolt ec1c electric_car eb1c electric_meter ec1b electric_moped eb1d electric_rickshaw eb1e electric_scooter eb1f electrical_services f102 elevator f1a0 email e0be emergency e1eb emergency_recording ebf4 emergency_share ebf6 emoji_emotions ea22 emoji_events ea23 emoji_flags ea1a emoji_food_beverage ea1b emoji_nature ea1c emoji_objects ea24 emoji_people ea1d emoji_symbols ea1e emoji_transportation ea1f energy_savings_leaf ec1a engineering ea3d enhance_photo_translate e8fc enhanced_encryption e63f equalizer e01d error e000 error_outline e001 escalator f1a1 escalator_warning f1ac euro ea15 euro_symbol e926 ev_station e56d event e878 event_available e614 event_busy e615 event_note e616 event_repeat eb7b event_seat e903 exit_to_app e879 expand e94f expand_circle_down e7cd expand_less e5ce expand_more e5cf explicit e01e explore e87a explore_off e9a8 exposure e3ca exposure_minus_1 e3cb exposure_minus_2 e3cc exposure_neg_1 e3cb exposure_neg_2 e3cc exposure_plus_1 e3cd exposure_plus_2 e3ce exposure_zero e3cf extension e87b extension_off e4f5 face e87c face_2 f8da face_3 f8db face_4 f8dc face_5 f8dd face_6 f8de face_retouching_natural ef4e face_retouching_off f007 face_unlock f008 facebook f234 fact_check f0c5 factory ebbc family_restroom f1a2 fast_forward e01f fast_rewind e020 fastfood e57a favorite e87d favorite_border e87e favorite_outline e87e fax ead8 featured_play_list e06d featured_video e06e feed f009 feedback e87f female e590 fence f1f6 festival ea68 fiber_dvr e05d fiber_manual_record e061 fiber_new e05e fiber_pin e06a fiber_smart_record e062 file_copy e173 file_download e2c4 file_download_done e9aa file_download_off e4fe file_open eaf3 file_present ea0e file_upload e2c6 filter e3d3 filter_1 e3d0 filter_2 e3d1 filter_3 e3d2 filter_4 e3d4 filter_5 e3d5 filter_6 e3d6 filter_7 e3d7 filter_8 e3d8 filter_9 e3d9 filter_9_plus e3da filter_alt ef4f filter_alt_off eb32 filter_b_and_w e3db filter_center_focus e3dc filter_drama e3dd filter_frames e3de filter_hdr e3df filter_list e152 filter_list_off eb57 filter_none e3e0 filter_tilt_shift e3e2 filter_vintage e3e3 find_in_page e880 find_replace e881 fingerprint e90d fire_extinguisher f1d8 fire_hydrant_alt f8f1 fire_truck f8f2 fireplace ea43 first_page e5dc fit_screen ea10 fitbit e82b fitness_center eb43 flag e153 flag_circle eaf8 flaky ef50 flare e3e4 flash_auto e3e5 flash_off e3e6 flash_on e3e7 flashlight_off f00a flashlight_on f00b flatware f00c flight e539 flight_class e7cb flight_land e904 flight_takeoff e905 flip e3e8 flip_camera_android ea37 flip_camera_ios ea38 flip_to_back e882 flip_to_front e883 flood ebe6 flourescent f00d flutter_dash e00b fmd_bad f00e fmd_good f00f folder e2c7 folder_copy ebbd folder_delete eb34 folder_off eb83 folder_open e2c8 folder_shared e2c9 folder_special e617 folder_zip eb2c follow_the_signs f222 font_download e167 font_download_off e4f9 food_bank f1f2 forest ea99 fork_left eba0 fork_right ebac format_align_center e234 format_align_justify e235 format_align_left e236 format_align_right e237 format_bold e238 format_clear e239 format_color_fill e23a format_color_reset e23b format_color_text e23c format_indent_decrease e23d format_indent_increase e23e format_italic e23f format_line_spacing e240 format_list_bulleted e241 format_list_numbered e242 format_list_numbered_rtl e267 format_overline eb65 format_paint e243 format_quote e244 format_shapes e25e format_size e245 format_strikethrough e246 format_textdirection_l_to_r e247 format_textdirection_r_to_l e248 format_underline e765 format_underlined e765 fort eaad forum e0bf forward e154 forward_10 e056 forward_30 e057 forward_5 e058 forward_to_inbox f187 foundation f200 free_breakfast eb44 free_cancellation e748 front_hand e769 fullscreen e5d0 fullscreen_exit e5d1 functions e24a g_mobiledata f010 g_translate e927 gamepad e30f games e021 garage f011 gas_meter ec19 gavel e90e generating_tokens e749 gesture e155 get_app e884 gif e908 gif_box e7a3 girl eb68 gite e58b golf_course eb45 gpp_bad f012 gpp_good f013 gpp_maybe f014 gps_fixed e1b3 gps_not_fixed e1b4 gps_off e1b5 grade e885 gradient e3e9 grading ea4f grain e3ea graphic_eq e1b8 grass f205 grid_3x3 f015 grid_4x4 f016 grid_goldenratio f017 grid_off e3eb grid_on e3ec grid_view e9b0 group e7ef group_add e7f0 group_off e747 group_remove e7ad group_work e886 groups f233 groups_2 f8df groups_3 f8e0 h_mobiledata f018 h_plus_mobiledata f019 hail e9b1 handshake ebcb handyman f10b hardware ea59 hd e052 hdr_auto f01a hdr_auto_select f01b hdr_enhanced_select ef51 hdr_off e3ed hdr_off_select f01c hdr_on e3ee hdr_on_select f01d hdr_plus f01e hdr_strong e3f1 hdr_weak e3f2 headphones f01f headphones_battery f020 headset e310 headset_mic e311 headset_off e33a healing e3f3 health_and_safety e1d5 hearing e023 hearing_disabled f104 heart_broken eac2 heat_pump ec18 height ea16 help e887 help_center f1c0 help_outline e8fd hevc f021 hexagon eb39 hide_image f022 hide_source f023 high_quality e024 highlight e25f highlight_alt ef52 highlight_off e888 highlight_remove e888 hiking e50a history e889 history_edu ea3e history_toggle_off f17d hive eaa6 hls eb8a hls_off eb8c holiday_village e58a home e88a home_max f024 home_mini f025 home_repair_service f100 home_work ea09 horizontal_distribute e014 horizontal_rule f108 horizontal_split e947 hot_tub eb46 hotel e53a hotel_class e743 hourglass_bottom ea5c hourglass_disabled ef53 hourglass_empty e88b hourglass_full e88c hourglass_top ea5b house ea44 house_siding f202 houseboat e584 how_to_reg e174 how_to_vote e175 html eb7e http e902 https e88d hub e9f4 hvac f10e ice_skating e50b icecream ea69 image e3f4 image_aspect_ratio e3f5 image_not_supported f116 image_search e43f imagesearch_roller e9b4 import_contacts e0e0 import_export e0c3 important_devices e912 inbox e156 incomplete_circle e79b indeterminate_check_box e909 info e88e info_outline e88f input e890 insert_chart e24b insert_chart_outlined e26a insert_comment e24c insert_drive_file e24d insert_emoticon e24e insert_invitation e24f insert_link e250 insert_page_break eaca insert_photo e251 insights f092 install_desktop eb71 install_mobile eb72 integration_instructions ef54 interests e7c8 interpreter_mode e83b inventory e179 inventory_2 e1a1 invert_colors e891 invert_colors_off e0c4 invert_colors_on e891 ios_share e6b8 iron e583 iso e3f6 javascript eb7c join_full eaeb join_inner eaf4 join_left eaf2 join_right eaea kayaking e50c kebab_dining e842 key e73c key_off eb84 keyboard e312 keyboard_alt f028 keyboard_arrow_down e313 keyboard_arrow_left e314 keyboard_arrow_right e315 keyboard_arrow_up e316 keyboard_backspace e317 keyboard_capslock e318 keyboard_command_key eae7 keyboard_control eae1 keyboard_control_key eae6 keyboard_double_arrow_down ead0 keyboard_double_arrow_left eac3 keyboard_double_arrow_right eac9 keyboard_double_arrow_up eacf keyboard_hide e31a keyboard_option_key eae8 keyboard_return e31b keyboard_tab e31c keyboard_voice e31d king_bed ea45 kitchen eb47 kitesurfing e50d label e892 label_important e937 label_important_outline e948 label_off e9b6 label_outline e893 lan eb2f landscape e3f7 landslide ebd7 language e894 laptop e31e laptop_chromebook e31f laptop_mac e320 laptop_windows e321 last_page e5dd launch e895 layers e53b layers_clear e53c leaderboard f20c leak_add e3f8 leak_remove e3f9 leave_bags_at_home f23b legend_toggle f11b lens e3fa lens_blur f029 library_add e02e library_add_check e9b7 library_books e02f library_music e030 light f02a light_mode e518 lightbulb e0f0 lightbulb_circle ebfe lightbulb_outline e90f line_axis ea9a line_style e919 line_weight e91a linear_scale e260 link e157 link_off e16f linked_camera e438 liquor ea60 list e896 list_alt e0ee live_help e0c6 live_tv e639 living f02b local_activity e53f local_airport e53d local_atm e53e local_attraction e53f local_bar e540 local_cafe e541 local_car_wash e542 local_convenience_store e543 local_dining e556 local_drink e544 local_fire_department ef55 local_florist e545 local_gas_station e546 local_grocery_store e547 local_hospital e548 local_hotel e549 local_laundry_service e54a local_library e54b local_mall e54c local_movies e54d local_offer e54e local_parking e54f local_pharmacy e550 local_phone e551 local_pizza e552 local_play e553 local_police ef56 local_post_office e554 local_print_shop e555 local_printshop e555 local_restaurant e556 local_see e557 local_shipping e558 local_taxi e559 location_city e7f1 location_disabled e1b6 location_history e55a location_off e0c7 location_on e0c8 location_searching e1b7 lock e897 lock_clock ef57 lock_open e898 lock_outline e899 lock_person f8f3 lock_reset eade login ea77 logo_dev ead6 logout e9ba looks e3fc looks_3 e3fb looks_4 e3fd looks_5 e3fe looks_6 e3ff looks_one e400 looks_two e401 loop e028 loupe e402 low_priority e16d loyalty e89a lte_mobiledata f02c lte_plus_mobiledata f02d luggage f235 lunch_dining ea61 lyrics ec0b macro_off f8d2 mail e158 mail_lock ec0a mail_outline e0e1 male e58e man e4eb man_2 f8e1 man_3 f8e2 man_4 f8e3 manage_accounts f02e manage_history ebe7 manage_search f02f map e55b maps_home_work f030 maps_ugc ef58 margin e9bb mark_as_unread e9bc mark_chat_read f18b mark_chat_unread f189 mark_email_read f18c mark_email_unread f18a mark_unread_chat_alt eb9d markunread e159 markunread_mailbox e89b masks f218 maximize e930 media_bluetooth_off f031 media_bluetooth_on f032 mediation efa7 medical_information ebed medical_services f109 medication f033 medication_liquid ea87 meeting_room eb4f memory e322 menu e5d2 menu_book ea19 menu_open e9bd merge eb98 merge_type e252 message e0c9 messenger e0ca messenger_outline e0cb mic e029 mic_external_off ef59 mic_external_on ef5a mic_none e02a mic_off e02b microwave f204 military_tech ea3f minimize e931 minor_crash ebf1 miscellaneous_services f10c missed_video_call e073 mms e618 mobile_friendly e200 mobile_off e201 mobile_screen_share e0e7 mobiledata_off f034 mode f097 mode_comment e253 mode_edit e254 mode_edit_outline f035 mode_fan_off ec17 mode_night f036 mode_of_travel e7ce mode_standby f037 model_training f0cf monetization_on e263 money e57d money_off e25c money_off_csred f038 monitor ef5b monitor_heart eaa2 monitor_weight f039 monochrome_photos e403 mood e7f2 mood_bad e7f3 moped eb28 more e619 more_horiz eae1 more_time ea5d more_vert e5d4 mosque eab2 motion_photos_auto f03a motion_photos_off e9c0 motion_photos_on e9c1 motion_photos_pause f227 motion_photos_paused e9c2 motorcycle e91b mouse e323 move_down eb61 move_to_inbox e168 move_up eb64 movie e02c movie_creation e404 movie_filter e43a moving e501 mp e9c3 multiline_chart e6df multiple_stop f1b9 multitrack_audio e1b8 museum ea36 music_note e405 music_off e440 music_video e063 my_library_add e02e my_library_books e02f my_library_music e030 my_location e55c nat ef5c nature e406 nature_people e407 navigate_before e408 navigate_next e409 navigation e55d near_me e569 near_me_disabled f1ef nearby_error f03b nearby_off f03c nest_cam_wired_stand ec16 network_cell e1b9 network_check e640 network_locked e61a network_ping ebca network_wifi e1ba network_wifi_1_bar ebe4 network_wifi_2_bar ebd6 network_wifi_3_bar ebe1 new_label e609 new_releases e031 newspaper eb81 next_plan ef5d next_week e16a nfc e1bb night_shelter f1f1 nightlife ea62 nightlight f03d nightlight_round ef5e nights_stay ea46 no_accounts f03e no_adult_content f8fe no_backpack f237 no_cell f1a4 no_crash ebf0 no_drinks f1a5 no_encryption e641 no_encryption_gmailerrorred f03f no_flash f1a6 no_food f1a7 no_luggage f23b no_meals f1d6 no_meeting_room eb4e no_photography f1a8 no_sim e0cc no_stroller f1af no_transfer f1d5 noise_aware ebec noise_control_off ebf3 nordic_walking e50e north f1e0 north_east f1e1 north_west f1e2 not_accessible f0fe not_interested e033 not_listed_location e575 not_started f0d1 note e06f note_add e89c note_alt f040 notes e26c notification_add e399 notification_important e004 notifications e7f4 notifications_active e7f7 notifications_none e7f5 notifications_off e7f6 notifications_on e7f7 notifications_paused e7f8 now_wallpaper e75f now_widgets e75e numbers eac7 offline_bolt e932 offline_pin e90a offline_share e9c5 oil_barrel ec15 on_device_training ebfd ondemand_video e63a online_prediction f0eb opacity e91c open_in_browser e89d open_in_full f1ce open_in_new e89e open_in_new_off e4f6 open_with e89f other_houses e58c outbond f228 outbound e1ca outbox ef5f outdoor_grill ea47 outlet f1d4 outlined_flag e16e output ebbe padding e9c8 pages e7f9 pageview e8a0 paid f041 palette e40a pan_tool e925 pan_tool_alt ebb9 panorama e40b panorama_fish_eye e40c panorama_fisheye e40c panorama_horizontal e40d panorama_horizontal_select ef60 panorama_photosphere e9c9 panorama_photosphere_select e9ca panorama_vertical e40e panorama_vertical_select ef61 panorama_wide_angle e40f panorama_wide_angle_select ef62 paragliding e50f park ea63 party_mode e7fa password f042 paste f098 pattern f043 pause e034 pause_circle e1a2 pause_circle_filled e035 pause_circle_outline e036 pause_presentation e0ea payment e8a1 payments ef63 paypal ea8d pedal_bike eb29 pending ef64 pending_actions f1bb pentagon eb50 people e7fb people_alt ea21 people_outline e7fc percent eb58 perm_camera_mic e8a2 perm_contact_cal e8a3 perm_contact_calendar e8a3 perm_data_setting e8a4 perm_device_info e8a5 perm_device_information e8a5 perm_identity e8a6 perm_media e8a7 perm_phone_msg e8a8 perm_scan_wifi e8a9 person e7fd person_2 f8e4 person_3 f8e5 person_4 f8e6 person_add e7fe person_add_alt ea4d person_add_alt_1 ef65 person_add_disabled e9cb person_off e510 person_outline e7ff person_pin e55a person_pin_circle e56a person_remove ef66 person_remove_alt_1 ef67 person_search f106 personal_injury e6da personal_video e63b pest_control f0fa pest_control_rodent f0fd pets e91d phishing ead7 phone e0cd phone_android e324 phone_bluetooth_speaker e61b phone_callback e649 phone_disabled e9cc phone_enabled e9cd phone_forwarded e61c phone_in_talk e61d phone_iphone e325 phone_locked e61e phone_missed e61f phone_paused e620 phonelink e326 phonelink_erase e0db phonelink_lock e0dc phonelink_off e327 phonelink_ring e0dd phonelink_setup e0de photo e410 photo_album e411 photo_camera e412 photo_camera_back ef68 photo_camera_front ef69 photo_filter e43b photo_library e413 photo_size_select_actual e432 photo_size_select_large e433 photo_size_select_small e434 php eb8f piano e521 piano_off e520 picture_as_pdf e415 picture_in_picture e8aa picture_in_picture_alt e911 pie_chart e6c4 pie_chart_outline f044 pin f045 pin_drop e55e pin_end e767 pin_invoke e763 pinch eb38 pivot_table_chart e9ce pix eaa3 place e55f plagiarism ea5a play_arrow e037 play_circle e1c4 play_circle_fill e038 play_circle_filled e038 play_circle_outline e039 play_disabled ef6a play_for_work e906 play_lesson f047 playlist_add e03b playlist_add_check e065 playlist_add_check_circle e7e6 playlist_add_circle e7e5 playlist_play e05f playlist_remove eb80 plumbing f107 plus_one e800 podcasts f048 point_of_sale f17e policy ea17 poll e801 polyline ebbb polymer e8ab pool eb48 portable_wifi_off e0ce portrait e416 post_add ea20 power e63c power_input e336 power_off e646 power_settings_new e8ac precision_manufacturing f049 pregnant_woman e91e present_to_all e0df preview f1c5 price_change f04a price_check f04b print e8ad print_disabled e9cf priority_high e645 privacy_tip f0dc private_connectivity e744 production_quantity_limits e1d1 propane ec14 propane_tank ec13 psychology ea4a psychology_alt f8ea public e80b public_off f1ca publish e255 published_with_changes f232 punch_clock eaa8 push_pin f10d qr_code ef6b qr_code_2 e00a qr_code_scanner f206 query_builder e8ae query_stats e4fc question_answer e8af question_mark eb8b queue e03c queue_music e03d queue_play_next e066 quick_contacts_dialer e0cf quick_contacts_mail e0d0 quickreply ef6c quiz f04c quora ea98 r_mobiledata f04d radar f04e radio e03e radio_button_checked e837 radio_button_off e836 radio_button_on e837 radio_button_unchecked e836 railway_alert e9d1 ramen_dining ea64 ramp_left eb9c ramp_right eb96 rate_review e560 raw_off f04f raw_on f050 read_more ef6d real_estate_agent e73a receipt e8b0 receipt_long ef6e recent_actors e03f recommend e9d2 record_voice_over e91f rectangle eb54 recycling e760 reddit eaa0 redeem e8b1 redo e15a reduce_capacity f21c refresh e5d5 remember_me f051 remove e15b remove_circle e15c remove_circle_outline e15d remove_done e9d3 remove_from_queue e067 remove_moderator e9d4 remove_red_eye e417 remove_road ebfc remove_shopping_cart e928 reorder e8fe repartition f8e8 repeat e040 repeat_on e9d6 repeat_one e041 repeat_one_on e9d7 replay e042 replay_10 e059 replay_30 e05a replay_5 e05b replay_circle_filled e9d8 reply e15e reply_all e15f report e160 report_gmailerrorred f052 report_off e170 report_problem e8b2 request_page f22c request_quote f1b6 reset_tv e9d9 restart_alt f053 restaurant e56c restaurant_menu e561 restore e8b3 restore_from_trash e938 restore_page e929 reviews f054 rice_bowl f1f5 ring_volume e0d1 rocket eba5 rocket_launch eb9b roller_shades ec12 roller_shades_closed ec11 roller_skating ebcd roofing f201 room e8b4 room_preferences f1b8 room_service eb49 rotate_90_degrees_ccw e418 rotate_90_degrees_cw eaab rotate_left e419 rotate_right e41a roundabout_left eb99 roundabout_right eba3 rounded_corner e920 route eacd router e328 rowing e921 rss_feed e0e5 rsvp f055 rtt e9ad rule f1c2 rule_folder f1c9 run_circle ef6f running_with_errors e51d rv_hookup e642 safety_check ebef safety_divider e1cc sailing e502 sanitizer f21d satellite e562 satellite_alt eb3a save e161 save_alt e171 save_as eb60 saved_search ea11 savings e2eb scale eb5f scanner e329 scatter_plot e268 schedule e8b5 schedule_send ea0a schema e4fd school e80c science ea4b score e269 scoreboard ebd0 screen_lock_landscape e1be screen_lock_portrait e1bf screen_lock_rotation e1c0 screen_rotation e1c1 screen_rotation_alt ebee screen_search_desktop ef70 screen_share e0e2 screenshot f056 screenshot_monitor ec08 scuba_diving ebce sd e9dd sd_card e623 sd_card_alert f057 sd_storage e1c2 search e8b6 search_off ea76 security e32a security_update f058 security_update_good f059 security_update_warning f05a segment e94b select_all e162 self_improvement ea78 sell f05b send e163 send_and_archive ea0c send_time_extension eadb send_to_mobile f05c sensor_door f1b5 sensor_occupied ec10 sensor_window f1b4 sensors e51e sensors_off e51f sentiment_dissatisfied e811 sentiment_neutral e812 sentiment_satisfied e813 sentiment_satisfied_alt e0ed sentiment_very_dissatisfied e814 sentiment_very_satisfied e815 set_meal f1ea settings e8b8 settings_accessibility f05d settings_applications e8b9 settings_backup_restore e8ba settings_bluetooth e8bb settings_brightness e8bd settings_cell e8bc settings_display e8bd settings_ethernet e8be settings_input_antenna e8bf settings_input_component e8c0 settings_input_composite e8c1 settings_input_hdmi e8c2 settings_input_svideo e8c3 settings_overscan e8c4 settings_phone e8c5 settings_power e8c6 settings_remote e8c7 settings_suggest f05e settings_system_daydream e1c3 settings_voice e8c8 severe_cold ebd3 shape_line f8d3 share e80d share_arrival_time e524 share_location f05f shield e9e0 shield_moon eaa9 shop e8c9 shop_2 e19e shop_two e8ca shopify ea9d shopping_bag f1cc shopping_basket e8cb shopping_cart e8cc shopping_cart_checkout eb88 short_text e261 shortcut f060 show_chart e6e1 shower f061 shuffle e043 shuffle_on e9e1 shutter_speed e43d sick f220 sign_language ebe5 signal_cellular_0_bar f0a8 signal_cellular_4_bar e1c8 signal_cellular_alt e202 signal_cellular_alt_1_bar ebdf signal_cellular_alt_2_bar ebe3 signal_cellular_connected_no_internet_0_bar f0ac signal_cellular_connected_no_internet_4_bar e1cd signal_cellular_no_sim e1ce signal_cellular_nodata f062 signal_cellular_null e1cf signal_cellular_off e1d0 signal_wifi_0_bar f0b0 signal_wifi_4_bar e1d8 signal_wifi_4_bar_lock e1d9 signal_wifi_bad f063 signal_wifi_connected_no_internet_4 f064 signal_wifi_off e1da signal_wifi_statusbar_4_bar f065 signal_wifi_statusbar_connected_no_internet_4 f066 signal_wifi_statusbar_null f067 signpost eb91 sim_card e32b sim_card_alert e624 sim_card_download f068 single_bed ea48 sip f069 skateboarding e511 skip_next e044 skip_previous e045 sledding e512 slideshow e41b slow_motion_video e068 smart_button f1c1 smart_display f06a smart_screen f06b smart_toy f06c smartphone e32c smoke_free eb4a smoking_rooms eb4b sms e625 sms_failed e626 snapchat ea6e snippet_folder f1c7 snooze e046 snowboarding e513 snowmobile e503 snowshoeing e514 soap f1b2 social_distance e1cb solar_power ec0f sort e164 sort_by_alpha e053 sos ebf7 soup_kitchen e7d3 source f1c4 south f1e3 south_america e7e4 south_east f1e4 south_west f1e5 spa eb4c space_bar e256 space_dashboard e66b spatial_audio ebeb spatial_audio_off ebe8 spatial_tracking ebea speaker e32d speaker_group e32e speaker_notes e8cd speaker_notes_off e92a speaker_phone e0d2 speed e9e4 spellcheck e8ce splitscreen f06d spoke e9a7 sports ea30 sports_bar f1f3 sports_baseball ea51 sports_basketball ea26 sports_cricket ea27 sports_esports ea28 sports_football ea29 sports_golf ea2a sports_gymnastics ebc4 sports_handball ea33 sports_hockey ea2b sports_kabaddi ea34 sports_martial_arts eae9 sports_mma ea2c sports_motorsports ea2d sports_rugby ea2e sports_score f06e sports_soccer ea2f sports_tennis ea32 sports_volleyball ea31 square eb36 square_foot ea49 ssid_chart eb66 stacked_bar_chart e9e6 stacked_line_chart f22b stadium eb90 stairs f1a9 star e838 star_border e83a star_border_purple500 f099 star_half e839 star_outline f06f star_purple500 f09a star_rate f0ec stars e8d0 start e089 stay_current_landscape e0d3 stay_current_portrait e0d4 stay_primary_landscape e0d5 stay_primary_portrait e0d6 sticky_note_2 f1fc stop e047 stop_circle ef71 stop_screen_share e0e3 storage e1db store e8d1 store_mall_directory e563 storefront ea12 storm f070 straight eb95 straighten e41c stream e9e9 streetview e56e strikethrough_s e257 stroller f1ae style e41d subdirectory_arrow_left e5d9 subdirectory_arrow_right e5da subject e8d2 subscript f111 subscriptions e064 subtitles e048 subtitles_off ef72 subway e56f summarize f071 superscript f112 supervised_user_circle e939 supervisor_account e8d3 support ef73 support_agent f0e2 surfing e515 surround_sound e049 swap_calls e0d7 swap_horiz e8d4 swap_horizontal_circle e933 swap_vert e8d5 swap_vert_circle e8d6 swap_vertical_circle e8d6 swipe e9ec swipe_down eb53 swipe_down_alt eb30 swipe_left eb59 swipe_left_alt eb33 swipe_right eb52 swipe_right_alt eb56 swipe_up eb2e swipe_up_alt eb35 swipe_vertical eb51 switch_access_shortcut e7e1 switch_access_shortcut_add e7e2 switch_account e9ed switch_camera e41e switch_left f1d1 switch_right f1d2 switch_video e41f synagogue eab0 sync e627 sync_alt ea18 sync_disabled e628 sync_lock eaee sync_problem e629 system_security_update f072 system_security_update_good f073 system_security_update_warning f074 system_update e62a system_update_alt e8d7 system_update_tv e8d7 tab e8d8 tab_unselected e8d9 table_bar ead2 table_chart e265 table_restaurant eac6 table_rows f101 table_view f1be tablet e32f tablet_android e330 tablet_mac e331 tag e9ef tag_faces e420 takeout_dining ea74 tap_and_play e62b tapas f1e9 task f075 task_alt e2e6 taxi_alert ef74 telegram ea6b temple_buddhist eab3 temple_hindu eaaf terminal eb8e terrain e564 text_decrease eadd text_fields e262 text_format e165 text_increase eae2 text_rotate_up e93a text_rotate_vertical e93b text_rotation_angledown e93c text_rotation_angleup e93d text_rotation_down e93e text_rotation_none e93f text_snippet f1c6 textsms e0d8 texture e421 theater_comedy ea66 theaters e8da thermostat f076 thermostat_auto f077 thumb_down e8db thumb_down_alt e816 thumb_down_off_alt e9f2 thumb_up e8dc thumb_up_alt e817 thumb_up_off_alt e9f3 thumbs_up_down e8dd thunderstorm ebdb tiktok ea7e time_to_leave e62c timelapse e422 timeline e922 timer e425 timer_10 e423 timer_10_select f07a timer_3 e424 timer_3_select f07b timer_off e426 tips_and_updates e79a tire_repair ebc8 title e264 toc e8de today e8df toggle_off e9f5 toggle_on e9f6 token ea25 toll e8e0 tonality e427 topic f1c8 tornado e199 touch_app e913 tour ef75 toys e332 track_changes e8e1 traffic e565 train e570 tram e571 transcribe f8ec transfer_within_a_station e572 transform e428 transgender e58d transit_enterexit e579 translate e8e2 travel_explore e2db trending_down e8e3 trending_flat e8e4 trending_neutral e8e4 trending_up e8e5 trip_origin e57b troubleshoot e1d2 try f07c tsunami ebd8 tty f1aa tune e429 tungsten f07d turn_left eba6 turn_right ebab turn_sharp_left eba7 turn_sharp_right ebaa turn_slight_left eba4 turn_slight_right eb9a turned_in e8e6 turned_in_not e8e7 tv e333 tv_off e647 two_wheeler e9f9 type_specimen f8f0 u_turn_left eba1 u_turn_right eba2 umbrella f1ad unarchive e169 undo e166 unfold_less e5d6 unfold_less_double f8cf unfold_more e5d7 unfold_more_double f8d0 unpublished f236 unsubscribe e0eb upcoming f07e update e923 update_disabled e075 upgrade f0fb upload f09b upload_file e9fc usb e1e0 usb_off e4fa vaccines e138 vape_free ebc6 vaping_rooms ebcf verified ef76 verified_user e8e8 vertical_align_bottom e258 vertical_align_center e259 vertical_align_top e25a vertical_distribute e076 vertical_shades ec0e vertical_shades_closed ec0d vertical_split e949 vibration e62d video_call e070 video_camera_back f07f video_camera_front f080 video_collection e04a video_file eb87 video_label e071 video_library e04a video_settings ea75 video_stable f081 videocam e04b videocam_off e04c videogame_asset e338 videogame_asset_off e500 view_agenda e8e9 view_array e8ea view_carousel e8eb view_column e8ec view_comfortable e42a view_comfy e42a view_comfy_alt eb73 view_compact e42b view_compact_alt eb74 view_cozy eb75 view_day e8ed view_headline e8ee view_in_ar e9fe view_kanban eb7f view_list e8ef view_module e8f0 view_quilt e8f1 view_sidebar f114 view_stream e8f2 view_timeline eb85 view_week e8f3 vignette e435 villa e586 visibility e8f4 visibility_off e8f5 voice_chat e62e voice_over_off e94a voicemail e0d9 volcano ebda volume_down e04d volume_mute e04e volume_off e04f volume_up e050 volunteer_activism ea70 vpn_key e0da vpn_key_off eb7a vpn_lock e62f vrpano f082 wallet f8ff wallet_giftcard e8f6 wallet_membership e8f7 wallet_travel e8f8 wallpaper e75f warehouse ebb8 warning e002 warning_amber f083 wash f1b1 watch e334 watch_later e924 watch_off eae3 water f084 water_damage f203 water_drop e798 waterfall_chart ea00 waves e176 waving_hand e766 wb_auto e42c wb_cloudy e42d wb_incandescent e42e wb_iridescent e436 wb_shade ea01 wb_sunny e430 wb_twilight e1c6 wc e63d web e051 web_asset e069 web_asset_off e4f7 web_stories e595 webhook eb92 wechat ea81 weekend e16b west f1e6 whatsapp ea9c whatshot e80e wheelchair_pickup f1ab where_to_vote e177 widgets e75e width_full f8f5 width_normal f8f6 width_wide f8f7 wifi e63e wifi_1_bar e4ca wifi_2_bar e4d9 wifi_calling ef77 wifi_calling_3 f085 wifi_channel eb6a wifi_find eb31 wifi_lock e1e1 wifi_off e648 wifi_password eb6b wifi_protected_setup f0fc wifi_tethering e1e2 wifi_tethering_error f086 wifi_tethering_error_rounded f086 wifi_tethering_off f087 wind_power ec0c window f088 wine_bar f1e8 woman e13e woman_2 f8e7 woo_commerce ea6d wordpress ea9f work e8f9 work_history ec09 work_off e942 work_outline e943 workspace_premium e7af workspaces e1a0 wrap_text e25b wrong_location ef78 wysiwyg f1c3 yard f089 youtube_searched_for e8fa zoom_in e8ff zoom_in_map eb2d zoom_out e900 zoom_out_map e56b ================================================ FILE: webapp/frontend/src/assets/fonts/material-icons/MaterialIconsSharp-Regular.codepoints ================================================ 10k e951 10mp e952 11mp e953 123 eb8d 12mp e954 13mp e955 14mp e956 15mp e957 16mp e958 17mp e959 18_up_rating f8fd 18mp e95a 19mp e95b 1k e95c 1k_plus e95d 1x_mobiledata efcd 20mp e95e 21mp e95f 22mp e960 23mp e961 24mp e962 2k e963 2k_plus e964 2mp e965 30fps efce 30fps_select efcf 360 e577 3d_rotation e84d 3g_mobiledata efd0 3k e966 3k_plus e967 3mp e968 3p efd1 4g_mobiledata efd2 4g_plus_mobiledata efd3 4k e072 4k_plus e969 4mp e96a 5g ef38 5k e96b 5k_plus e96c 5mp e96d 60fps efd4 60fps_select efd5 6_ft_apart f21e 6k e96e 6k_plus e96f 6mp e970 7k e971 7k_plus e972 7mp e973 8k e974 8k_plus e975 8mp e976 9k e977 9k_plus e978 9mp e979 abc eb94 ac_unit eb3b access_alarm e190 access_alarms e191 access_time e192 access_time_filled efd6 accessibility e84e accessibility_new e92c accessible e914 accessible_forward e934 account_balance e84f account_balance_wallet e850 account_box e851 account_circle e853 account_tree e97a ad_units ef39 adb e60e add e145 add_a_photo e439 add_alarm e193 add_alert e003 add_box e146 add_business e729 add_card eb86 add_chart e97b add_circle e147 add_circle_outline e148 add_comment e266 add_home f8eb add_home_work f8ed add_ic_call e97c add_link e178 add_location e567 add_location_alt ef3a add_moderator e97d add_photo_alternate e43e add_reaction e1d3 add_road ef3b add_shopping_cart e854 add_task f23a add_to_drive e65c add_to_home_screen e1fe add_to_photos e39d add_to_queue e05c addchart ef3c adf_scanner eada adjust e39e admin_panel_settings ef3d adobe ea96 ads_click e762 agriculture ea79 air efd8 airline_seat_flat e630 airline_seat_flat_angled e631 airline_seat_individual_suite e632 airline_seat_legroom_extra e633 airline_seat_legroom_normal e634 airline_seat_legroom_reduced e635 airline_seat_recline_extra e636 airline_seat_recline_normal e637 airline_stops e7d0 airlines e7ca airplane_ticket efd9 airplanemode_active e195 airplanemode_inactive e194 airplanemode_off e194 airplanemode_on e195 airplay e055 airport_shuttle eb3c alarm e855 alarm_add e856 alarm_off e857 alarm_on e858 album e019 align_horizontal_center e00f align_horizontal_left e00d align_horizontal_right e010 align_vertical_bottom e015 align_vertical_center e011 align_vertical_top e00c all_inbox e97f all_inclusive eb3d all_out e90b alt_route f184 alternate_email e0e6 amp_stories ea13 analytics ef3e anchor f1cd android e859 animation e71c announcement e85a aod efda apartment ea40 api f1b7 app_blocking ef3f app_registration ef40 app_settings_alt ef41 app_shortcut eae4 apple ea80 approval e982 apps e5c3 apps_outage e7cc architecture ea3b archive e149 area_chart e770 arrow_back e5c4 arrow_back_ios e5e0 arrow_back_ios_new e2ea arrow_circle_down f181 arrow_circle_left eaa7 arrow_circle_right eaaa arrow_circle_up f182 arrow_downward e5db arrow_drop_down e5c5 arrow_drop_down_circle e5c6 arrow_drop_up e5c7 arrow_forward e5c8 arrow_forward_ios e5e1 arrow_left e5de arrow_outward f8ce arrow_right e5df arrow_right_alt e941 arrow_upward e5d8 art_track e060 article ef42 aspect_ratio e85b assessment e85c assignment e85d assignment_ind e85e assignment_late e85f assignment_return e860 assignment_returned e861 assignment_turned_in e862 assist_walker f8d5 assistant e39f assistant_direction e988 assistant_photo e3a0 assured_workload eb6f atm e573 attach_email ea5e attach_file e226 attach_money e227 attachment e2bc attractions ea52 attribution efdb audio_file eb82 audiotrack e3a1 auto_awesome e65f auto_awesome_mosaic e660 auto_awesome_motion e661 auto_delete ea4c auto_fix_high e663 auto_fix_normal e664 auto_fix_off e665 auto_graph e4fb auto_mode ec20 auto_stories e666 autofps_select efdc autorenew e863 av_timer e01b baby_changing_station f19b back_hand e764 backpack f19c backspace e14a backup e864 backup_table ef43 badge ea67 bakery_dining ea53 balance eaf6 balcony e58f ballot e172 bar_chart e26b batch_prediction f0f5 bathroom efdd bathtub ea41 battery_0_bar ebdc battery_1_bar ebd9 battery_2_bar ebe0 battery_3_bar ebdd battery_4_bar ebe2 battery_5_bar ebd4 battery_6_bar ebd2 battery_alert e19c battery_charging_full e1a3 battery_full e1a4 battery_saver efde battery_std e1a5 battery_unknown e1a6 beach_access eb3e bed efdf bedroom_baby efe0 bedroom_child efe1 bedroom_parent efe2 bedtime ef44 bedtime_off eb76 beenhere e52d bento f1f4 bike_scooter ef45 biotech ea3a blender efe3 blind f8d6 blinds e286 blinds_closed ec1f block e14b bloodtype efe4 bluetooth e1a7 bluetooth_audio e60f bluetooth_connected e1a8 bluetooth_disabled e1a9 bluetooth_drive efe5 bluetooth_searching e1aa blur_circular e3a2 blur_linear e3a3 blur_off e3a4 blur_on e3a5 bolt ea0b book e865 book_online f217 bookmark e866 bookmark_add e598 bookmark_added e599 bookmark_border e867 bookmark_outline e867 bookmark_remove e59a bookmarks e98b border_all e228 border_bottom e229 border_clear e22a border_color e22b border_horizontal e22c border_inner e22d border_left e22e border_outer e22f border_right e230 border_style e231 border_top e232 border_vertical e233 boy eb67 branding_watermark e06b breakfast_dining ea54 brightness_1 e3a6 brightness_2 e3a7 brightness_3 e3a8 brightness_4 e3a9 brightness_5 e3aa brightness_6 e3ab brightness_7 e3ac brightness_auto e1ab brightness_high e1ac brightness_low e1ad brightness_medium e1ae broadcast_on_home f8f8 broadcast_on_personal f8f9 broken_image e3ad browse_gallery ebd1 browser_not_supported ef47 browser_updated e7cf brunch_dining ea73 brush e3ae bubble_chart e6dd bug_report e868 build e869 build_circle ef48 bungalow e591 burst_mode e43c bus_alert e98f business e0af business_center eb3f cabin e589 cable efe6 cached e86a cake e7e9 calculate ea5f calendar_month ebcc calendar_today e935 calendar_view_day e936 calendar_view_month efe7 calendar_view_week efe8 call e0b0 call_end e0b1 call_made e0b2 call_merge e0b3 call_missed e0b4 call_missed_outgoing e0e4 call_received e0b5 call_split e0b6 call_to_action e06c camera e3af camera_alt e3b0 camera_enhance e8fc camera_front e3b1 camera_indoor efe9 camera_outdoor efea camera_rear e3b2 camera_roll e3b3 cameraswitch efeb campaign ef49 cancel e5c9 cancel_presentation e0e9 cancel_schedule_send ea39 candlestick_chart ead4 car_crash ebf2 car_rental ea55 car_repair ea56 card_giftcard e8f6 card_membership e8f7 card_travel e8f8 carpenter f1f8 cases e992 casino eb40 cast e307 cast_connected e308 cast_for_education efec castle eab1 catching_pokemon e508 category e574 celebration ea65 cell_tower ebba cell_wifi e0ec center_focus_strong e3b4 center_focus_weak e3b5 chair efed chair_alt efee chalet e585 change_circle e2e7 change_history e86b charging_station f19d chat e0b7 chat_bubble e0ca chat_bubble_outline e0cb check e5ca check_box e834 check_box_outline_blank e835 check_circle e86c check_circle_outline e92d checklist e6b1 checklist_rtl e6b3 checkroom f19e chevron_left e5cb chevron_right e5cc child_care eb41 child_friendly eb42 chrome_reader_mode e86d church eaae circle ef4a circle_notifications e994 class e86e clean_hands f21f cleaning_services f0ff clear e14c clear_all e0b8 close e5cd close_fullscreen f1cf closed_caption e01c closed_caption_disabled f1dc closed_caption_off e996 cloud e2bd cloud_circle e2be cloud_done e2bf cloud_download e2c0 cloud_off e2c1 cloud_queue e2c2 cloud_sync eb5a cloud_upload e2c3 co2 e7b0 co_present eaf0 code e86f code_off e4f3 coffee efef coffee_maker eff0 collections e3b6 collections_bookmark e431 color_lens e3b7 colorize e3b8 comment e0b9 comment_bank ea4e comments_disabled e7a2 commit eaf5 commute e940 compare e3b9 compare_arrows e915 compass_calibration e57c compost e761 compress e94d computer e30a confirmation_num e638 confirmation_number e638 connect_without_contact f223 connected_tv e998 connecting_airports e7c9 construction ea3c contact_emergency f8d1 contact_mail e0d0 contact_page f22e contact_phone e0cf contact_support e94c contactless ea71 contacts e0ba content_copy f08a content_cut f08b content_paste f098 content_paste_go ea8e content_paste_off e4f8 content_paste_search ea9b contrast eb37 control_camera e074 control_point e3ba control_point_duplicate e3bb cookie eaac copy f08a copy_all e2ec copyright e90c coronavirus f221 corporate_fare f1d0 cottage e587 countertops f1f7 create e150 create_new_folder e2cc credit_card e870 credit_card_off e4f4 credit_score eff1 crib e588 crisis_alert ebe9 crop e3be crop_16_9 e3bc crop_3_2 e3bd crop_5_4 e3bf crop_7_5 e3c0 crop_din e3c1 crop_free e3c2 crop_landscape e3c3 crop_original e3c4 crop_portrait e3c5 crop_rotate e437 crop_square e3c6 cruelty_free e799 css eb93 currency_bitcoin ebc5 currency_exchange eb70 currency_franc eafa currency_lira eaef currency_pound eaf1 currency_ruble eaec currency_rupee eaf7 currency_yen eafb currency_yuan eaf9 curtains ec1e curtains_closed ec1d cut f08b cyclone ebd5 dangerous e99a dark_mode e51c dashboard e871 dashboard_customize e99b data_array ead1 data_exploration e76f data_object ead3 data_saver_off eff2 data_saver_on eff3 data_thresholding eb9f data_usage e1af dataset f8ee dataset_linked f8ef date_range e916 deblur eb77 deck ea42 dehaze e3c7 delete e872 delete_forever e92b delete_outline e92e delete_sweep e16c delivery_dining ea72 density_large eba9 density_medium eb9e density_small eba8 departure_board e576 description e873 deselect ebb6 design_services f10a desk f8f4 desktop_access_disabled e99d desktop_mac e30b desktop_windows e30c details e3c8 developer_board e30d developer_board_off e4ff developer_mode e1b0 device_hub e335 device_thermostat e1ff device_unknown e339 devices e1b1 devices_fold ebde devices_other e337 dialer_sip e0bb dialpad e0bc diamond ead5 difference eb7d dining eff4 dinner_dining ea57 directions e52e directions_bike e52f directions_boat e532 directions_boat_filled eff5 directions_bus e530 directions_bus_filled eff6 directions_car e531 directions_car_filled eff7 directions_ferry e532 directions_off f10f directions_railway e534 directions_railway_filled eff8 directions_run e566 directions_subway e533 directions_subway_filled eff9 directions_train e534 directions_transit e535 directions_transit_filled effa directions_walk e536 dirty_lens ef4b disabled_by_default f230 disabled_visible e76e disc_full e610 discord ea6c discount ebc9 display_settings eb97 diversity_1 f8d7 diversity_2 f8d8 diversity_3 f8d9 dnd_forwardslash e611 dns e875 do_disturb f08c do_disturb_alt f08d do_disturb_off f08e do_disturb_on f08f do_not_disturb e612 do_not_disturb_alt e611 do_not_disturb_off e643 do_not_disturb_on e644 do_not_disturb_on_total_silence effb do_not_step f19f do_not_touch f1b0 dock e30e document_scanner e5fa domain e7ee domain_add eb62 domain_disabled e0ef domain_verification ef4c done e876 done_all e877 done_outline e92f donut_large e917 donut_small e918 door_back effc door_front effd door_sliding effe doorbell efff double_arrow ea50 downhill_skiing e509 download f090 download_done f091 download_for_offline f000 downloading f001 drafts e151 drag_handle e25d drag_indicator e945 draw e746 drive_eta e613 drive_file_move e675 drive_file_move_rtl e76d drive_file_rename_outline e9a2 drive_folder_upload e9a3 dry f1b3 dry_cleaning ea58 duo e9a5 dvr e1b2 dynamic_feed ea14 dynamic_form f1bf e_mobiledata f002 earbuds f003 earbuds_battery f004 east f1df eco ea35 edgesensor_high f005 edgesensor_low f006 edit e3c9 edit_attributes e578 edit_calendar e742 edit_location e568 edit_location_alt e1c5 edit_note e745 edit_notifications e525 edit_off e950 edit_road ef4d egg eacc egg_alt eac8 eject e8fb elderly f21a elderly_woman eb69 electric_bike eb1b electric_bolt ec1c electric_car eb1c electric_meter ec1b electric_moped eb1d electric_rickshaw eb1e electric_scooter eb1f electrical_services f102 elevator f1a0 email e0be emergency e1eb emergency_recording ebf4 emergency_share ebf6 emoji_emotions ea22 emoji_events ea23 emoji_flags ea1a emoji_food_beverage ea1b emoji_nature ea1c emoji_objects ea24 emoji_people ea1d emoji_symbols ea1e emoji_transportation ea1f energy_savings_leaf ec1a engineering ea3d enhance_photo_translate e8fc enhanced_encryption e63f equalizer e01d error e000 error_outline e001 escalator f1a1 escalator_warning f1ac euro ea15 euro_symbol e926 ev_station e56d event e878 event_available e614 event_busy e615 event_note e616 event_repeat eb7b event_seat e903 exit_to_app e879 expand e94f expand_circle_down e7cd expand_less e5ce expand_more e5cf explicit e01e explore e87a explore_off e9a8 exposure e3ca exposure_minus_1 e3cb exposure_minus_2 e3cc exposure_neg_1 e3cb exposure_neg_2 e3cc exposure_plus_1 e3cd exposure_plus_2 e3ce exposure_zero e3cf extension e87b extension_off e4f5 face e87c face_2 f8da face_3 f8db face_4 f8dc face_5 f8dd face_6 f8de face_retouching_natural ef4e face_retouching_off f007 face_unlock f008 facebook f234 fact_check f0c5 factory ebbc family_restroom f1a2 fast_forward e01f fast_rewind e020 fastfood e57a favorite e87d favorite_border e87e favorite_outline e87e fax ead8 featured_play_list e06d featured_video e06e feed f009 feedback e87f female e590 fence f1f6 festival ea68 fiber_dvr e05d fiber_manual_record e061 fiber_new e05e fiber_pin e06a fiber_smart_record e062 file_copy e173 file_download e2c4 file_download_done e9aa file_download_off e4fe file_open eaf3 file_present ea0e file_upload e2c6 filter e3d3 filter_1 e3d0 filter_2 e3d1 filter_3 e3d2 filter_4 e3d4 filter_5 e3d5 filter_6 e3d6 filter_7 e3d7 filter_8 e3d8 filter_9 e3d9 filter_9_plus e3da filter_alt ef4f filter_alt_off eb32 filter_b_and_w e3db filter_center_focus e3dc filter_drama e3dd filter_frames e3de filter_hdr e3df filter_list e152 filter_list_off eb57 filter_none e3e0 filter_tilt_shift e3e2 filter_vintage e3e3 find_in_page e880 find_replace e881 fingerprint e90d fire_extinguisher f1d8 fire_hydrant_alt f8f1 fire_truck f8f2 fireplace ea43 first_page e5dc fit_screen ea10 fitbit e82b fitness_center eb43 flag e153 flag_circle eaf8 flaky ef50 flare e3e4 flash_auto e3e5 flash_off e3e6 flash_on e3e7 flashlight_off f00a flashlight_on f00b flatware f00c flight e539 flight_class e7cb flight_land e904 flight_takeoff e905 flip e3e8 flip_camera_android ea37 flip_camera_ios ea38 flip_to_back e882 flip_to_front e883 flood ebe6 flourescent f00d flutter_dash e00b fmd_bad f00e fmd_good f00f folder e2c7 folder_copy ebbd folder_delete eb34 folder_off eb83 folder_open e2c8 folder_shared e2c9 folder_special e617 folder_zip eb2c follow_the_signs f222 font_download e167 font_download_off e4f9 food_bank f1f2 forest ea99 fork_left eba0 fork_right ebac format_align_center e234 format_align_justify e235 format_align_left e236 format_align_right e237 format_bold e238 format_clear e239 format_color_fill e23a format_color_reset e23b format_color_text e23c format_indent_decrease e23d format_indent_increase e23e format_italic e23f format_line_spacing e240 format_list_bulleted e241 format_list_numbered e242 format_list_numbered_rtl e267 format_overline eb65 format_paint e243 format_quote e244 format_shapes e25e format_size e245 format_strikethrough e246 format_textdirection_l_to_r e247 format_textdirection_r_to_l e248 format_underline e765 format_underlined e765 fort eaad forum e0bf forward e154 forward_10 e056 forward_30 e057 forward_5 e058 forward_to_inbox f187 foundation f200 free_breakfast eb44 free_cancellation e748 front_hand e769 fullscreen e5d0 fullscreen_exit e5d1 functions e24a g_mobiledata f010 g_translate e927 gamepad e30f games e021 garage f011 gas_meter ec19 gavel e90e generating_tokens e749 gesture e155 get_app e884 gif e908 gif_box e7a3 girl eb68 gite e58b golf_course eb45 gpp_bad f012 gpp_good f013 gpp_maybe f014 gps_fixed e1b3 gps_not_fixed e1b4 gps_off e1b5 grade e885 gradient e3e9 grading ea4f grain e3ea graphic_eq e1b8 grass f205 grid_3x3 f015 grid_4x4 f016 grid_goldenratio f017 grid_off e3eb grid_on e3ec grid_view e9b0 group e7ef group_add e7f0 group_off e747 group_remove e7ad group_work e886 groups f233 groups_2 f8df groups_3 f8e0 h_mobiledata f018 h_plus_mobiledata f019 hail e9b1 handshake ebcb handyman f10b hardware ea59 hd e052 hdr_auto f01a hdr_auto_select f01b hdr_enhanced_select ef51 hdr_off e3ed hdr_off_select f01c hdr_on e3ee hdr_on_select f01d hdr_plus f01e hdr_strong e3f1 hdr_weak e3f2 headphones f01f headphones_battery f020 headset e310 headset_mic e311 headset_off e33a healing e3f3 health_and_safety e1d5 hearing e023 hearing_disabled f104 heart_broken eac2 heat_pump ec18 height ea16 help e887 help_center f1c0 help_outline e8fd hevc f021 hexagon eb39 hide_image f022 hide_source f023 high_quality e024 highlight e25f highlight_alt ef52 highlight_off e888 highlight_remove e888 hiking e50a history e889 history_edu ea3e history_toggle_off f17d hive eaa6 hls eb8a hls_off eb8c holiday_village e58a home e88a home_max f024 home_mini f025 home_repair_service f100 home_work ea09 horizontal_distribute e014 horizontal_rule f108 horizontal_split e947 hot_tub eb46 hotel e53a hotel_class e743 hourglass_bottom ea5c hourglass_disabled ef53 hourglass_empty e88b hourglass_full e88c hourglass_top ea5b house ea44 house_siding f202 houseboat e584 how_to_reg e174 how_to_vote e175 html eb7e http e902 https e88d hub e9f4 hvac f10e ice_skating e50b icecream ea69 image e3f4 image_aspect_ratio e3f5 image_not_supported f116 image_search e43f imagesearch_roller e9b4 import_contacts e0e0 import_export e0c3 important_devices e912 inbox e156 incomplete_circle e79b indeterminate_check_box e909 info e88e info_outline e88f input e890 insert_chart e24b insert_chart_outlined e26a insert_comment e24c insert_drive_file e24d insert_emoticon e24e insert_invitation e24f insert_link e250 insert_page_break eaca insert_photo e251 insights f092 install_desktop eb71 install_mobile eb72 integration_instructions ef54 interests e7c8 interpreter_mode e83b inventory e179 inventory_2 e1a1 invert_colors e891 invert_colors_off e0c4 invert_colors_on e891 ios_share e6b8 iron e583 iso e3f6 javascript eb7c join_full eaeb join_inner eaf4 join_left eaf2 join_right eaea kayaking e50c kebab_dining e842 key e73c key_off eb84 keyboard e312 keyboard_alt f028 keyboard_arrow_down e313 keyboard_arrow_left e314 keyboard_arrow_right e315 keyboard_arrow_up e316 keyboard_backspace e317 keyboard_capslock e318 keyboard_command_key eae7 keyboard_control eae1 keyboard_control_key eae6 keyboard_double_arrow_down ead0 keyboard_double_arrow_left eac3 keyboard_double_arrow_right eac9 keyboard_double_arrow_up eacf keyboard_hide e31a keyboard_option_key eae8 keyboard_return e31b keyboard_tab e31c keyboard_voice e31d king_bed ea45 kitchen eb47 kitesurfing e50d label e892 label_important e937 label_important_outline e948 label_off e9b6 label_outline e893 lan eb2f landscape e3f7 landslide ebd7 language e894 laptop e31e laptop_chromebook e31f laptop_mac e320 laptop_windows e321 last_page e5dd launch e895 layers e53b layers_clear e53c leaderboard f20c leak_add e3f8 leak_remove e3f9 leave_bags_at_home f23b legend_toggle f11b lens e3fa lens_blur f029 library_add e02e library_add_check e9b7 library_books e02f library_music e030 light f02a light_mode e518 lightbulb e0f0 lightbulb_circle ebfe lightbulb_outline e90f line_axis ea9a line_style e919 line_weight e91a linear_scale e260 link e157 link_off e16f linked_camera e438 liquor ea60 list e896 list_alt e0ee live_help e0c6 live_tv e639 living f02b local_activity e53f local_airport e53d local_atm e53e local_attraction e53f local_bar e540 local_cafe e541 local_car_wash e542 local_convenience_store e543 local_dining e556 local_drink e544 local_fire_department ef55 local_florist e545 local_gas_station e546 local_grocery_store e547 local_hospital e548 local_hotel e549 local_laundry_service e54a local_library e54b local_mall e54c local_movies e54d local_offer e54e local_parking e54f local_pharmacy e550 local_phone e551 local_pizza e552 local_play e553 local_police ef56 local_post_office e554 local_print_shop e555 local_printshop e555 local_restaurant e556 local_see e557 local_shipping e558 local_taxi e559 location_city e7f1 location_disabled e1b6 location_history e55a location_off e0c7 location_on e0c8 location_searching e1b7 lock e897 lock_clock ef57 lock_open e898 lock_outline e899 lock_person f8f3 lock_reset eade login ea77 logo_dev ead6 logout e9ba looks e3fc looks_3 e3fb looks_4 e3fd looks_5 e3fe looks_6 e3ff looks_one e400 looks_two e401 loop e028 loupe e402 low_priority e16d loyalty e89a lte_mobiledata f02c lte_plus_mobiledata f02d luggage f235 lunch_dining ea61 lyrics ec0b macro_off f8d2 mail e158 mail_lock ec0a mail_outline e0e1 male e58e man e4eb man_2 f8e1 man_3 f8e2 man_4 f8e3 manage_accounts f02e manage_history ebe7 manage_search f02f map e55b maps_home_work f030 maps_ugc ef58 margin e9bb mark_as_unread e9bc mark_chat_read f18b mark_chat_unread f189 mark_email_read f18c mark_email_unread f18a mark_unread_chat_alt eb9d markunread e159 markunread_mailbox e89b masks f218 maximize e930 media_bluetooth_off f031 media_bluetooth_on f032 mediation efa7 medical_information ebed medical_services f109 medication f033 medication_liquid ea87 meeting_room eb4f memory e322 menu e5d2 menu_book ea19 menu_open e9bd merge eb98 merge_type e252 message e0c9 messenger e0ca messenger_outline e0cb mic e029 mic_external_off ef59 mic_external_on ef5a mic_none e02a mic_off e02b microwave f204 military_tech ea3f minimize e931 minor_crash ebf1 miscellaneous_services f10c missed_video_call e073 mms e618 mobile_friendly e200 mobile_off e201 mobile_screen_share e0e7 mobiledata_off f034 mode f097 mode_comment e253 mode_edit e254 mode_edit_outline f035 mode_fan_off ec17 mode_night f036 mode_of_travel e7ce mode_standby f037 model_training f0cf monetization_on e263 money e57d money_off e25c money_off_csred f038 monitor ef5b monitor_heart eaa2 monitor_weight f039 monochrome_photos e403 mood e7f2 mood_bad e7f3 moped eb28 more e619 more_horiz eae1 more_time ea5d more_vert e5d4 mosque eab2 motion_photos_auto f03a motion_photos_off e9c0 motion_photos_on e9c1 motion_photos_pause f227 motion_photos_paused e9c2 motorcycle e91b mouse e323 move_down eb61 move_to_inbox e168 move_up eb64 movie e02c movie_creation e404 movie_filter e43a moving e501 mp e9c3 multiline_chart e6df multiple_stop f1b9 multitrack_audio e1b8 museum ea36 music_note e405 music_off e440 music_video e063 my_library_add e02e my_library_books e02f my_library_music e030 my_location e55c nat ef5c nature e406 nature_people e407 navigate_before e408 navigate_next e409 navigation e55d near_me e569 near_me_disabled f1ef nearby_error f03b nearby_off f03c nest_cam_wired_stand ec16 network_cell e1b9 network_check e640 network_locked e61a network_ping ebca network_wifi e1ba network_wifi_1_bar ebe4 network_wifi_2_bar ebd6 network_wifi_3_bar ebe1 new_label e609 new_releases e031 newspaper eb81 next_plan ef5d next_week e16a nfc e1bb night_shelter f1f1 nightlife ea62 nightlight f03d nightlight_round ef5e nights_stay ea46 no_accounts f03e no_adult_content f8fe no_backpack f237 no_cell f1a4 no_crash ebf0 no_drinks f1a5 no_encryption e641 no_encryption_gmailerrorred f03f no_flash f1a6 no_food f1a7 no_luggage f23b no_meals f1d6 no_meeting_room eb4e no_photography f1a8 no_sim e0cc no_stroller f1af no_transfer f1d5 noise_aware ebec noise_control_off ebf3 nordic_walking e50e north f1e0 north_east f1e1 north_west f1e2 not_accessible f0fe not_interested e033 not_listed_location e575 not_started f0d1 note e06f note_add e89c note_alt f040 notes e26c notification_add e399 notification_important e004 notifications e7f4 notifications_active e7f7 notifications_none e7f5 notifications_off e7f6 notifications_on e7f7 notifications_paused e7f8 now_wallpaper e75f now_widgets e75e numbers eac7 offline_bolt e932 offline_pin e90a offline_share e9c5 oil_barrel ec15 on_device_training ebfd ondemand_video e63a online_prediction f0eb opacity e91c open_in_browser e89d open_in_full f1ce open_in_new e89e open_in_new_off e4f6 open_with e89f other_houses e58c outbond f228 outbound e1ca outbox ef5f outdoor_grill ea47 outlet f1d4 outlined_flag e16e output ebbe padding e9c8 pages e7f9 pageview e8a0 paid f041 palette e40a pan_tool e925 pan_tool_alt ebb9 panorama e40b panorama_fish_eye e40c panorama_fisheye e40c panorama_horizontal e40d panorama_horizontal_select ef60 panorama_photosphere e9c9 panorama_photosphere_select e9ca panorama_vertical e40e panorama_vertical_select ef61 panorama_wide_angle e40f panorama_wide_angle_select ef62 paragliding e50f park ea63 party_mode e7fa password f042 paste f098 pattern f043 pause e034 pause_circle e1a2 pause_circle_filled e035 pause_circle_outline e036 pause_presentation e0ea payment e8a1 payments ef63 paypal ea8d pedal_bike eb29 pending ef64 pending_actions f1bb pentagon eb50 people e7fb people_alt ea21 people_outline e7fc percent eb58 perm_camera_mic e8a2 perm_contact_cal e8a3 perm_contact_calendar e8a3 perm_data_setting e8a4 perm_device_info e8a5 perm_device_information e8a5 perm_identity e8a6 perm_media e8a7 perm_phone_msg e8a8 perm_scan_wifi e8a9 person e7fd person_2 f8e4 person_3 f8e5 person_4 f8e6 person_add e7fe person_add_alt ea4d person_add_alt_1 ef65 person_add_disabled e9cb person_off e510 person_outline e7ff person_pin e55a person_pin_circle e56a person_remove ef66 person_remove_alt_1 ef67 person_search f106 personal_injury e6da personal_video e63b pest_control f0fa pest_control_rodent f0fd pets e91d phishing ead7 phone e0cd phone_android e324 phone_bluetooth_speaker e61b phone_callback e649 phone_disabled e9cc phone_enabled e9cd phone_forwarded e61c phone_in_talk e61d phone_iphone e325 phone_locked e61e phone_missed e61f phone_paused e620 phonelink e326 phonelink_erase e0db phonelink_lock e0dc phonelink_off e327 phonelink_ring e0dd phonelink_setup e0de photo e410 photo_album e411 photo_camera e412 photo_camera_back ef68 photo_camera_front ef69 photo_filter e43b photo_library e413 photo_size_select_actual e432 photo_size_select_large e433 photo_size_select_small e434 php eb8f piano e521 piano_off e520 picture_as_pdf e415 picture_in_picture e8aa picture_in_picture_alt e911 pie_chart e6c4 pie_chart_outline f044 pin f045 pin_drop e55e pin_end e767 pin_invoke e763 pinch eb38 pivot_table_chart e9ce pix eaa3 place e55f plagiarism ea5a play_arrow e037 play_circle e1c4 play_circle_fill e038 play_circle_filled e038 play_circle_outline e039 play_disabled ef6a play_for_work e906 play_lesson f047 playlist_add e03b playlist_add_check e065 playlist_add_check_circle e7e6 playlist_add_circle e7e5 playlist_play e05f playlist_remove eb80 plumbing f107 plus_one e800 podcasts f048 point_of_sale f17e policy ea17 poll e801 polyline ebbb polymer e8ab pool eb48 portable_wifi_off e0ce portrait e416 post_add ea20 power e63c power_input e336 power_off e646 power_settings_new e8ac precision_manufacturing f049 pregnant_woman e91e present_to_all e0df preview f1c5 price_change f04a price_check f04b print e8ad print_disabled e9cf priority_high e645 privacy_tip f0dc private_connectivity e744 production_quantity_limits e1d1 propane ec14 propane_tank ec13 psychology ea4a psychology_alt f8ea public e80b public_off f1ca publish e255 published_with_changes f232 punch_clock eaa8 push_pin f10d qr_code ef6b qr_code_2 e00a qr_code_scanner f206 query_builder e8ae query_stats e4fc question_answer e8af question_mark eb8b queue e03c queue_music e03d queue_play_next e066 quick_contacts_dialer e0cf quick_contacts_mail e0d0 quickreply ef6c quiz f04c quora ea98 r_mobiledata f04d radar f04e radio e03e radio_button_checked e837 radio_button_off e836 radio_button_on e837 radio_button_unchecked e836 railway_alert e9d1 ramen_dining ea64 ramp_left eb9c ramp_right eb96 rate_review e560 raw_off f04f raw_on f050 read_more ef6d real_estate_agent e73a receipt e8b0 receipt_long ef6e recent_actors e03f recommend e9d2 record_voice_over e91f rectangle eb54 recycling e760 reddit eaa0 redeem e8b1 redo e15a reduce_capacity f21c refresh e5d5 remember_me f051 remove e15b remove_circle e15c remove_circle_outline e15d remove_done e9d3 remove_from_queue e067 remove_moderator e9d4 remove_red_eye e417 remove_road ebfc remove_shopping_cart e928 reorder e8fe repartition f8e8 repeat e040 repeat_on e9d6 repeat_one e041 repeat_one_on e9d7 replay e042 replay_10 e059 replay_30 e05a replay_5 e05b replay_circle_filled e9d8 reply e15e reply_all e15f report e160 report_gmailerrorred f052 report_off e170 report_problem e8b2 request_page f22c request_quote f1b6 reset_tv e9d9 restart_alt f053 restaurant e56c restaurant_menu e561 restore e8b3 restore_from_trash e938 restore_page e929 reviews f054 rice_bowl f1f5 ring_volume e0d1 rocket eba5 rocket_launch eb9b roller_shades ec12 roller_shades_closed ec11 roller_skating ebcd roofing f201 room e8b4 room_preferences f1b8 room_service eb49 rotate_90_degrees_ccw e418 rotate_90_degrees_cw eaab rotate_left e419 rotate_right e41a roundabout_left eb99 roundabout_right eba3 rounded_corner e920 route eacd router e328 rowing e921 rss_feed e0e5 rsvp f055 rtt e9ad rule f1c2 rule_folder f1c9 run_circle ef6f running_with_errors e51d rv_hookup e642 safety_check ebef safety_divider e1cc sailing e502 sanitizer f21d satellite e562 satellite_alt eb3a save e161 save_alt e171 save_as eb60 saved_search ea11 savings e2eb scale eb5f scanner e329 scatter_plot e268 schedule e8b5 schedule_send ea0a schema e4fd school e80c science ea4b score e269 scoreboard ebd0 screen_lock_landscape e1be screen_lock_portrait e1bf screen_lock_rotation e1c0 screen_rotation e1c1 screen_rotation_alt ebee screen_search_desktop ef70 screen_share e0e2 screenshot f056 screenshot_monitor ec08 scuba_diving ebce sd e9dd sd_card e623 sd_card_alert f057 sd_storage e1c2 search e8b6 search_off ea76 security e32a security_update f058 security_update_good f059 security_update_warning f05a segment e94b select_all e162 self_improvement ea78 sell f05b send e163 send_and_archive ea0c send_time_extension eadb send_to_mobile f05c sensor_door f1b5 sensor_occupied ec10 sensor_window f1b4 sensors e51e sensors_off e51f sentiment_dissatisfied e811 sentiment_neutral e812 sentiment_satisfied e813 sentiment_satisfied_alt e0ed sentiment_very_dissatisfied e814 sentiment_very_satisfied e815 set_meal f1ea settings e8b8 settings_accessibility f05d settings_applications e8b9 settings_backup_restore e8ba settings_bluetooth e8bb settings_brightness e8bd settings_cell e8bc settings_display e8bd settings_ethernet e8be settings_input_antenna e8bf settings_input_component e8c0 settings_input_composite e8c1 settings_input_hdmi e8c2 settings_input_svideo e8c3 settings_overscan e8c4 settings_phone e8c5 settings_power e8c6 settings_remote e8c7 settings_suggest f05e settings_system_daydream e1c3 settings_voice e8c8 severe_cold ebd3 shape_line f8d3 share e80d share_arrival_time e524 share_location f05f shield e9e0 shield_moon eaa9 shop e8c9 shop_2 e19e shop_two e8ca shopify ea9d shopping_bag f1cc shopping_basket e8cb shopping_cart e8cc shopping_cart_checkout eb88 short_text e261 shortcut f060 show_chart e6e1 shower f061 shuffle e043 shuffle_on e9e1 shutter_speed e43d sick f220 sign_language ebe5 signal_cellular_0_bar f0a8 signal_cellular_4_bar e1c8 signal_cellular_alt e202 signal_cellular_alt_1_bar ebdf signal_cellular_alt_2_bar ebe3 signal_cellular_connected_no_internet_0_bar f0ac signal_cellular_connected_no_internet_4_bar e1cd signal_cellular_no_sim e1ce signal_cellular_nodata f062 signal_cellular_null e1cf signal_cellular_off e1d0 signal_wifi_0_bar f0b0 signal_wifi_4_bar e1d8 signal_wifi_4_bar_lock e1d9 signal_wifi_bad f063 signal_wifi_connected_no_internet_4 f064 signal_wifi_off e1da signal_wifi_statusbar_4_bar f065 signal_wifi_statusbar_connected_no_internet_4 f066 signal_wifi_statusbar_null f067 signpost eb91 sim_card e32b sim_card_alert e624 sim_card_download f068 single_bed ea48 sip f069 skateboarding e511 skip_next e044 skip_previous e045 sledding e512 slideshow e41b slow_motion_video e068 smart_button f1c1 smart_display f06a smart_screen f06b smart_toy f06c smartphone e32c smoke_free eb4a smoking_rooms eb4b sms e625 sms_failed e626 snapchat ea6e snippet_folder f1c7 snooze e046 snowboarding e513 snowmobile e503 snowshoeing e514 soap f1b2 social_distance e1cb solar_power ec0f sort e164 sort_by_alpha e053 sos ebf7 soup_kitchen e7d3 source f1c4 south f1e3 south_america e7e4 south_east f1e4 south_west f1e5 spa eb4c space_bar e256 space_dashboard e66b spatial_audio ebeb spatial_audio_off ebe8 spatial_tracking ebea speaker e32d speaker_group e32e speaker_notes e8cd speaker_notes_off e92a speaker_phone e0d2 speed e9e4 spellcheck e8ce splitscreen f06d spoke e9a7 sports ea30 sports_bar f1f3 sports_baseball ea51 sports_basketball ea26 sports_cricket ea27 sports_esports ea28 sports_football ea29 sports_golf ea2a sports_gymnastics ebc4 sports_handball ea33 sports_hockey ea2b sports_kabaddi ea34 sports_martial_arts eae9 sports_mma ea2c sports_motorsports ea2d sports_rugby ea2e sports_score f06e sports_soccer ea2f sports_tennis ea32 sports_volleyball ea31 square eb36 square_foot ea49 ssid_chart eb66 stacked_bar_chart e9e6 stacked_line_chart f22b stadium eb90 stairs f1a9 star e838 star_border e83a star_border_purple500 f099 star_half e839 star_outline f06f star_purple500 f09a star_rate f0ec stars e8d0 start e089 stay_current_landscape e0d3 stay_current_portrait e0d4 stay_primary_landscape e0d5 stay_primary_portrait e0d6 sticky_note_2 f1fc stop e047 stop_circle ef71 stop_screen_share e0e3 storage e1db store e8d1 store_mall_directory e563 storefront ea12 storm f070 straight eb95 straighten e41c stream e9e9 streetview e56e strikethrough_s e257 stroller f1ae style e41d subdirectory_arrow_left e5d9 subdirectory_arrow_right e5da subject e8d2 subscript f111 subscriptions e064 subtitles e048 subtitles_off ef72 subway e56f summarize f071 superscript f112 supervised_user_circle e939 supervisor_account e8d3 support ef73 support_agent f0e2 surfing e515 surround_sound e049 swap_calls e0d7 swap_horiz e8d4 swap_horizontal_circle e933 swap_vert e8d5 swap_vert_circle e8d6 swap_vertical_circle e8d6 swipe e9ec swipe_down eb53 swipe_down_alt eb30 swipe_left eb59 swipe_left_alt eb33 swipe_right eb52 swipe_right_alt eb56 swipe_up eb2e swipe_up_alt eb35 swipe_vertical eb51 switch_access_shortcut e7e1 switch_access_shortcut_add e7e2 switch_account e9ed switch_camera e41e switch_left f1d1 switch_right f1d2 switch_video e41f synagogue eab0 sync e627 sync_alt ea18 sync_disabled e628 sync_lock eaee sync_problem e629 system_security_update f072 system_security_update_good f073 system_security_update_warning f074 system_update e62a system_update_alt e8d7 system_update_tv e8d7 tab e8d8 tab_unselected e8d9 table_bar ead2 table_chart e265 table_restaurant eac6 table_rows f101 table_view f1be tablet e32f tablet_android e330 tablet_mac e331 tag e9ef tag_faces e420 takeout_dining ea74 tap_and_play e62b tapas f1e9 task f075 task_alt e2e6 taxi_alert ef74 telegram ea6b temple_buddhist eab3 temple_hindu eaaf terminal eb8e terrain e564 text_decrease eadd text_fields e262 text_format e165 text_increase eae2 text_rotate_up e93a text_rotate_vertical e93b text_rotation_angledown e93c text_rotation_angleup e93d text_rotation_down e93e text_rotation_none e93f text_snippet f1c6 textsms e0d8 texture e421 theater_comedy ea66 theaters e8da thermostat f076 thermostat_auto f077 thumb_down e8db thumb_down_alt e816 thumb_down_off_alt e9f2 thumb_up e8dc thumb_up_alt e817 thumb_up_off_alt e9f3 thumbs_up_down e8dd thunderstorm ebdb tiktok ea7e time_to_leave e62c timelapse e422 timeline e922 timer e425 timer_10 e423 timer_10_select f07a timer_3 e424 timer_3_select f07b timer_off e426 tips_and_updates e79a tire_repair ebc8 title e264 toc e8de today e8df toggle_off e9f5 toggle_on e9f6 token ea25 toll e8e0 tonality e427 topic f1c8 tornado e199 touch_app e913 tour ef75 toys e332 track_changes e8e1 traffic e565 train e570 tram e571 transcribe f8ec transfer_within_a_station e572 transform e428 transgender e58d transit_enterexit e579 translate e8e2 travel_explore e2db trending_down e8e3 trending_flat e8e4 trending_neutral e8e4 trending_up e8e5 trip_origin e57b troubleshoot e1d2 try f07c tsunami ebd8 tty f1aa tune e429 tungsten f07d turn_left eba6 turn_right ebab turn_sharp_left eba7 turn_sharp_right ebaa turn_slight_left eba4 turn_slight_right eb9a turned_in e8e6 turned_in_not e8e7 tv e333 tv_off e647 two_wheeler e9f9 type_specimen f8f0 u_turn_left eba1 u_turn_right eba2 umbrella f1ad unarchive e169 undo e166 unfold_less e5d6 unfold_less_double f8cf unfold_more e5d7 unfold_more_double f8d0 unpublished f236 unsubscribe e0eb upcoming f07e update e923 update_disabled e075 upgrade f0fb upload f09b upload_file e9fc usb e1e0 usb_off e4fa vaccines e138 vape_free ebc6 vaping_rooms ebcf verified ef76 verified_user e8e8 vertical_align_bottom e258 vertical_align_center e259 vertical_align_top e25a vertical_distribute e076 vertical_shades ec0e vertical_shades_closed ec0d vertical_split e949 vibration e62d video_call e070 video_camera_back f07f video_camera_front f080 video_collection e04a video_file eb87 video_label e071 video_library e04a video_settings ea75 video_stable f081 videocam e04b videocam_off e04c videogame_asset e338 videogame_asset_off e500 view_agenda e8e9 view_array e8ea view_carousel e8eb view_column e8ec view_comfortable e42a view_comfy e42a view_comfy_alt eb73 view_compact e42b view_compact_alt eb74 view_cozy eb75 view_day e8ed view_headline e8ee view_in_ar e9fe view_kanban eb7f view_list e8ef view_module e8f0 view_quilt e8f1 view_sidebar f114 view_stream e8f2 view_timeline eb85 view_week e8f3 vignette e435 villa e586 visibility e8f4 visibility_off e8f5 voice_chat e62e voice_over_off e94a voicemail e0d9 volcano ebda volume_down e04d volume_mute e04e volume_off e04f volume_up e050 volunteer_activism ea70 vpn_key e0da vpn_key_off eb7a vpn_lock e62f vrpano f082 wallet f8ff wallet_giftcard e8f6 wallet_membership e8f7 wallet_travel e8f8 wallpaper e75f warehouse ebb8 warning e002 warning_amber f083 wash f1b1 watch e334 watch_later e924 watch_off eae3 water f084 water_damage f203 water_drop e798 waterfall_chart ea00 waves e176 waving_hand e766 wb_auto e42c wb_cloudy e42d wb_incandescent e42e wb_iridescent e436 wb_shade ea01 wb_sunny e430 wb_twilight e1c6 wc e63d web e051 web_asset e069 web_asset_off e4f7 web_stories e595 webhook eb92 wechat ea81 weekend e16b west f1e6 whatsapp ea9c whatshot e80e wheelchair_pickup f1ab where_to_vote e177 widgets e75e width_full f8f5 width_normal f8f6 width_wide f8f7 wifi e63e wifi_1_bar e4ca wifi_2_bar e4d9 wifi_calling ef77 wifi_calling_3 f085 wifi_channel eb6a wifi_find eb31 wifi_lock e1e1 wifi_off e648 wifi_password eb6b wifi_protected_setup f0fc wifi_tethering e1e2 wifi_tethering_error f086 wifi_tethering_error_rounded f086 wifi_tethering_off f087 wind_power ec0c window f088 wine_bar f1e8 woman e13e woman_2 f8e7 woo_commerce ea6d wordpress ea9f work e8f9 work_history ec09 work_off e942 work_outline e943 workspace_premium e7af workspaces e1a0 wrap_text e25b wrong_location ef78 wysiwyg f1c3 yard f089 youtube_searched_for e8fa zoom_in e8ff zoom_in_map eb2d zoom_out e900 zoom_out_map e56b ================================================ FILE: webapp/frontend/src/assets/fonts/material-icons/MaterialIconsTwoTone-Regular.codepoints ================================================ 10k e951 10mp e952 11mp e953 123 eb8d 12mp e954 13mp e955 14mp e956 15mp e957 16mp e958 17mp e959 18_up_rating f8fd 18mp e95a 19mp e95b 1k e95c 1k_plus e95d 1x_mobiledata efcd 20mp e95e 21mp e95f 22mp e960 23mp e961 24mp e962 2k e963 2k_plus e964 2mp e965 30fps efce 30fps_select efcf 360 e577 3d_rotation e84d 3g_mobiledata efd0 3k e966 3k_plus e967 3mp e968 3p efd1 4g_mobiledata efd2 4g_plus_mobiledata efd3 4k e072 4k_plus e969 4mp e96a 5g ef38 5k e96b 5k_plus e96c 5mp e96d 60fps efd4 60fps_select efd5 6_ft_apart f21e 6k e96e 6k_plus e96f 6mp e970 7k e971 7k_plus e972 7mp e973 8k e974 8k_plus e975 8mp e976 9k e977 9k_plus e978 9mp e979 abc eb94 ac_unit eb3b access_alarm e190 access_alarms e191 access_time e192 access_time_filled efd6 accessibility e84e accessibility_new e92c accessible e914 accessible_forward e934 account_balance e84f account_balance_wallet e850 account_box e851 account_circle e853 account_tree e97a ad_units ef39 adb e60e add e145 add_a_photo e439 add_alarm e193 add_alert e003 add_box e146 add_business e729 add_card eb86 add_chart e97b add_circle e147 add_circle_outline e148 add_comment e266 add_home f8eb add_home_work f8ed add_ic_call e97c add_link e178 add_location e567 add_location_alt ef3a add_moderator e97d add_photo_alternate e43e add_reaction e1d3 add_road ef3b add_shopping_cart e854 add_task f23a add_to_drive e65c add_to_home_screen e1fe add_to_photos e39d add_to_queue e05c addchart ef3c adf_scanner eada adjust e39e admin_panel_settings ef3d adobe ea96 ads_click e762 agriculture ea79 air efd8 airline_seat_flat e630 airline_seat_flat_angled e631 airline_seat_individual_suite e632 airline_seat_legroom_extra e633 airline_seat_legroom_normal e634 airline_seat_legroom_reduced e635 airline_seat_recline_extra e636 airline_seat_recline_normal e637 airline_stops e7d0 airlines e7ca airplane_ticket efd9 airplanemode_active e195 airplanemode_inactive e194 airplanemode_off e194 airplanemode_on e195 airplay e055 airport_shuttle eb3c alarm e855 alarm_add e856 alarm_off e857 alarm_on e858 album e019 align_horizontal_center e00f align_horizontal_left e00d align_horizontal_right e010 align_vertical_bottom e015 align_vertical_center e011 align_vertical_top e00c all_inbox e97f all_inclusive eb3d all_out e90b alt_route f184 alternate_email e0e6 amp_stories ea13 analytics ef3e anchor f1cd android e859 animation e71c announcement e85a aod efda apartment ea40 api f1b7 app_blocking ef3f app_registration ef40 app_settings_alt ef41 app_shortcut eae4 apple ea80 approval e982 apps e5c3 apps_outage e7cc architecture ea3b archive e149 area_chart e770 arrow_back e5c4 arrow_back_ios e5e0 arrow_back_ios_new e2ea arrow_circle_down f181 arrow_circle_left eaa7 arrow_circle_right eaaa arrow_circle_up f182 arrow_downward e5db arrow_drop_down e5c5 arrow_drop_down_circle e5c6 arrow_drop_up e5c7 arrow_forward e5c8 arrow_forward_ios e5e1 arrow_left e5de arrow_outward f8ce arrow_right e5df arrow_right_alt e941 arrow_upward e5d8 art_track e060 article ef42 aspect_ratio e85b assessment e85c assignment e85d assignment_ind e85e assignment_late e85f assignment_return e860 assignment_returned e861 assignment_turned_in e862 assist_walker f8d5 assistant e39f assistant_direction e988 assistant_photo e3a0 assured_workload eb6f atm e573 attach_email ea5e attach_file e226 attach_money e227 attachment e2bc attractions ea52 attribution efdb audio_file eb82 audiotrack e3a1 auto_awesome e65f auto_awesome_mosaic e660 auto_awesome_motion e661 auto_delete ea4c auto_fix_high e663 auto_fix_normal e664 auto_fix_off e665 auto_graph e4fb auto_mode ec20 auto_stories e666 autofps_select efdc autorenew e863 av_timer e01b baby_changing_station f19b back_hand e764 backpack f19c backspace e14a backup e864 backup_table ef43 badge ea67 bakery_dining ea53 balance eaf6 balcony e58f ballot e172 bar_chart e26b batch_prediction f0f5 bathroom efdd bathtub ea41 battery_0_bar ebdc battery_1_bar ebd9 battery_20 f09c battery_2_bar ebe0 battery_30 f09d battery_3_bar ebdd battery_4_bar ebe2 battery_50 f09e battery_5_bar ebd4 battery_60 f09f battery_6_bar ebd2 battery_80 f0a0 battery_90 f0a1 battery_alert e19c battery_charging_20 f0a2 battery_charging_30 f0a3 battery_charging_50 f0a4 battery_charging_60 f0a5 battery_charging_80 f0a6 battery_charging_90 f0a7 battery_charging_full e1a3 battery_full e1a4 battery_saver efde battery_std e1a5 battery_unknown e1a6 beach_access eb3e bed efdf bedroom_baby efe0 bedroom_child efe1 bedroom_parent efe2 bedtime ef44 bedtime_off eb76 beenhere e52d bento f1f4 bike_scooter ef45 biotech ea3a blender efe3 blind f8d6 blinds e286 blinds_closed ec1f block e14b bloodtype efe4 bluetooth e1a7 bluetooth_audio e60f bluetooth_connected e1a8 bluetooth_disabled e1a9 bluetooth_drive efe5 bluetooth_searching e1aa blur_circular e3a2 blur_linear e3a3 blur_off e3a4 blur_on e3a5 bolt ea0b book e865 book_online f217 bookmark e866 bookmark_add e598 bookmark_added e599 bookmark_border e867 bookmark_outline e867 bookmark_remove e59a bookmarks e98b border_all e228 border_bottom e229 border_clear e22a border_color e22b border_horizontal e22c border_inner e22d border_left e22e border_outer e22f border_right e230 border_style e231 border_top e232 border_vertical e233 boy eb67 branding_watermark e06b breakfast_dining ea54 brightness_1 e3a6 brightness_2 e3a7 brightness_3 e3a8 brightness_4 e3a9 brightness_5 e3aa brightness_6 e3ab brightness_7 e3ac brightness_auto e1ab brightness_high e1ac brightness_low e1ad brightness_medium e1ae broadcast_on_home f8f8 broadcast_on_personal f8f9 broken_image e3ad browse_gallery ebd1 browser_not_supported ef47 browser_updated e7cf brunch_dining ea73 brush e3ae bubble_chart e6dd bug_report e868 build e869 build_circle ef48 bungalow e591 burst_mode e43c bus_alert e98f business e0af business_center eb3f cabin e589 cable efe6 cached e86a cake e7e9 calculate ea5f calendar_month ebcc calendar_today e935 calendar_view_day e936 calendar_view_month efe7 calendar_view_week efe8 call e0b0 call_end e0b1 call_made e0b2 call_merge e0b3 call_missed e0b4 call_missed_outgoing e0e4 call_received e0b5 call_split e0b6 call_to_action e06c camera e3af camera_alt e3b0 camera_enhance e8fc camera_front e3b1 camera_indoor efe9 camera_outdoor efea camera_rear e3b2 camera_roll e3b3 cameraswitch efeb campaign ef49 cancel e5c9 cancel_presentation e0e9 cancel_schedule_send ea39 candlestick_chart ead4 car_crash ebf2 car_rental ea55 car_repair ea56 card_giftcard e8f6 card_membership e8f7 card_travel e8f8 carpenter f1f8 cases e992 casino eb40 cast e307 cast_connected e308 cast_for_education efec castle eab1 catching_pokemon e508 category e574 celebration ea65 cell_tower ebba cell_wifi e0ec center_focus_strong e3b4 center_focus_weak e3b5 chair efed chair_alt efee chalet e585 change_circle e2e7 change_history e86b charging_station f19d chat e0b7 chat_bubble e0ca chat_bubble_outline e0cb check e5ca check_box e834 check_box_outline_blank e835 check_circle e86c check_circle_outline e92d checklist e6b1 checklist_rtl e6b3 checkroom f19e chevron_left e5cb chevron_right e5cc child_care eb41 child_friendly eb42 chrome_reader_mode e86d church eaae circle ef4a circle_notifications e994 class e86e clean_hands f21f cleaning_services f0ff clear e14c clear_all e0b8 close e5cd close_fullscreen f1cf closed_caption e01c closed_caption_disabled f1dc closed_caption_off e996 cloud e2bd cloud_circle e2be cloud_done e2bf cloud_download e2c0 cloud_off e2c1 cloud_queue e2c2 cloud_sync eb5a cloud_upload e2c3 co2 e7b0 co_present eaf0 code e86f code_off e4f3 coffee efef coffee_maker eff0 collections e3b6 collections_bookmark e431 color_lens e3b7 colorize e3b8 comment e0b9 comment_bank ea4e comments_disabled e7a2 commit eaf5 commute e940 compare e3b9 compare_arrows e915 compass_calibration e57c compost e761 compress e94d computer e30a confirmation_num e638 confirmation_number e638 connect_without_contact f223 connected_tv e998 connecting_airports e7c9 construction ea3c contact_emergency f8d1 contact_mail e0d0 contact_page f22e contact_phone e0cf contact_support e94c contactless ea71 contacts e0ba content_copy f08a content_cut f08b content_paste f098 content_paste_go ea8e content_paste_off e4f8 content_paste_search ea9b contrast eb37 control_camera e074 control_point e3ba control_point_duplicate e3bb cookie eaac copy f08a copy_all e2ec copyright e90c coronavirus f221 corporate_fare f1d0 cottage e587 countertops f1f7 create e150 create_new_folder e2cc credit_card e870 credit_card_off e4f4 credit_score eff1 crib e588 crisis_alert ebe9 crop e3be crop_16_9 e3bc crop_3_2 e3bd crop_5_4 e3bf crop_7_5 e3c0 crop_din e3c1 crop_free e3c2 crop_landscape e3c3 crop_original e3c4 crop_portrait e3c5 crop_rotate e437 crop_square e3c6 cruelty_free e799 css eb93 currency_bitcoin ebc5 currency_exchange eb70 currency_franc eafa currency_lira eaef currency_pound eaf1 currency_ruble eaec currency_rupee eaf7 currency_yen eafb currency_yuan eaf9 curtains ec1e curtains_closed ec1d cut f08b cyclone ebd5 dangerous e99a dark_mode e51c dashboard e871 dashboard_customize e99b data_array ead1 data_exploration e76f data_object ead3 data_saver_off eff2 data_saver_on eff3 data_thresholding eb9f data_usage e1af dataset f8ee dataset_linked f8ef date_range e916 deblur eb77 deck ea42 dehaze e3c7 delete e872 delete_forever e92b delete_outline e92e delete_sweep e16c delivery_dining ea72 density_large eba9 density_medium eb9e density_small eba8 departure_board e576 description e873 deselect ebb6 design_services f10a desk f8f4 desktop_access_disabled e99d desktop_mac e30b desktop_windows e30c details e3c8 developer_board e30d developer_board_off e4ff developer_mode e1b0 device_hub e335 device_thermostat e1ff device_unknown e339 devices e1b1 devices_fold ebde devices_other e337 dialer_sip e0bb dialpad e0bc diamond ead5 difference eb7d dining eff4 dinner_dining ea57 directions e52e directions_bike e52f directions_boat e532 directions_boat_filled eff5 directions_bus e530 directions_bus_filled eff6 directions_car e531 directions_car_filled eff7 directions_ferry e532 directions_off f10f directions_railway e534 directions_railway_filled eff8 directions_run e566 directions_subway e533 directions_subway_filled eff9 directions_train e534 directions_transit e535 directions_transit_filled effa directions_walk e536 dirty_lens ef4b disabled_by_default f230 disabled_visible e76e disc_full e610 discord ea6c discount ebc9 display_settings eb97 diversity_1 f8d7 diversity_2 f8d8 diversity_3 f8d9 dnd_forwardslash e611 dns e875 do_disturb f08c do_disturb_alt f08d do_disturb_off f08e do_disturb_on f08f do_not_disturb e612 do_not_disturb_alt e611 do_not_disturb_off e643 do_not_disturb_on e644 do_not_disturb_on_total_silence effb do_not_step f19f do_not_touch f1b0 dock e30e document_scanner e5fa domain e7ee domain_add eb62 domain_disabled e0ef domain_verification ef4c done e876 done_all e877 done_outline e92f donut_large e917 donut_small e918 door_back effc door_front effd door_sliding effe doorbell efff double_arrow ea50 downhill_skiing e509 download f090 download_done f091 download_for_offline f000 downloading f001 drafts e151 drag_handle e25d drag_indicator e945 draw e746 drive_eta e613 drive_file_move e675 drive_file_move_rtl e76d drive_file_rename_outline e9a2 drive_folder_upload e9a3 dry f1b3 dry_cleaning ea58 duo e9a5 dvr e1b2 dynamic_feed ea14 dynamic_form f1bf e_mobiledata f002 earbuds f003 earbuds_battery f004 east f1df eco ea35 edgesensor_high f005 edgesensor_low f006 edit e3c9 edit_attributes e578 edit_calendar e742 edit_location e568 edit_location_alt e1c5 edit_note e745 edit_notifications e525 edit_off e950 edit_road ef4d egg eacc egg_alt eac8 eject e8fb elderly f21a elderly_woman eb69 electric_bike eb1b electric_bolt ec1c electric_car eb1c electric_meter ec1b electric_moped eb1d electric_rickshaw eb1e electric_scooter eb1f electrical_services f102 elevator f1a0 email e0be emergency e1eb emergency_recording ebf4 emergency_share ebf6 emoji_emotions ea22 emoji_events ea23 emoji_flags ea1a emoji_food_beverage ea1b emoji_nature ea1c emoji_objects ea24 emoji_people ea1d emoji_symbols ea1e emoji_transportation ea1f energy_savings_leaf ec1a engineering ea3d enhance_photo_translate e8fc enhanced_encryption e63f equalizer e01d error e000 error_outline e001 escalator f1a1 escalator_warning f1ac euro ea15 euro_symbol e926 ev_station e56d event e878 event_available e614 event_busy e615 event_note e616 event_repeat eb7b event_seat e903 exit_to_app e879 expand e94f expand_circle_down e7cd expand_less e5ce expand_more e5cf explicit e01e explore e87a explore_off e9a8 exposure e3ca exposure_minus_1 e3cb exposure_minus_2 e3cc exposure_neg_1 e3cb exposure_neg_2 e3cc exposure_plus_1 e3cd exposure_plus_2 e3ce exposure_zero e3cf extension e87b extension_off e4f5 face e87c face_2 f8da face_3 f8db face_4 f8dc face_5 f8dd face_6 f8de face_retouching_natural ef4e face_retouching_off f007 face_unlock f008 facebook f234 fact_check f0c5 factory ebbc family_restroom f1a2 fast_forward e01f fast_rewind e020 fastfood e57a favorite e87d favorite_border e87e favorite_outline e87e fax ead8 featured_play_list e06d featured_video e06e feed f009 feedback e87f female e590 fence f1f6 festival ea68 fiber_dvr e05d fiber_manual_record e061 fiber_new e05e fiber_pin e06a fiber_smart_record e062 file_copy e173 file_download e2c4 file_download_done e9aa file_download_off e4fe file_open eaf3 file_present ea0e file_upload e2c6 filter e3d3 filter_1 e3d0 filter_2 e3d1 filter_3 e3d2 filter_4 e3d4 filter_5 e3d5 filter_6 e3d6 filter_7 e3d7 filter_8 e3d8 filter_9 e3d9 filter_9_plus e3da filter_alt ef4f filter_alt_off eb32 filter_b_and_w e3db filter_center_focus e3dc filter_drama e3dd filter_frames e3de filter_hdr e3df filter_list e152 filter_list_off eb57 filter_none e3e0 filter_tilt_shift e3e2 filter_vintage e3e3 find_in_page e880 find_replace e881 fingerprint e90d fire_extinguisher f1d8 fire_hydrant_alt f8f1 fire_truck f8f2 fireplace ea43 first_page e5dc fit_screen ea10 fitbit e82b fitness_center eb43 flag e153 flag_circle eaf8 flaky ef50 flare e3e4 flash_auto e3e5 flash_off e3e6 flash_on e3e7 flashlight_off f00a flashlight_on f00b flatware f00c flight e539 flight_class e7cb flight_land e904 flight_takeoff e905 flip e3e8 flip_camera_android ea37 flip_camera_ios ea38 flip_to_back e882 flip_to_front e883 flood ebe6 flourescent f00d flutter_dash e00b fmd_bad f00e fmd_good f00f folder e2c7 folder_copy ebbd folder_delete eb34 folder_off eb83 folder_open e2c8 folder_shared e2c9 folder_special e617 folder_zip eb2c follow_the_signs f222 font_download e167 font_download_off e4f9 food_bank f1f2 forest ea99 fork_left eba0 fork_right ebac format_align_center e234 format_align_justify e235 format_align_left e236 format_align_right e237 format_bold e238 format_clear e239 format_color_fill e23a format_color_reset e23b format_color_text e23c format_indent_decrease e23d format_indent_increase e23e format_italic e23f format_line_spacing e240 format_list_bulleted e241 format_list_numbered e242 format_list_numbered_rtl e267 format_overline eb65 format_paint e243 format_quote e244 format_shapes e25e format_size e245 format_strikethrough e246 format_textdirection_l_to_r e247 format_textdirection_r_to_l e248 format_underline e765 format_underlined e765 fort eaad forum e0bf forward e154 forward_10 e056 forward_30 e057 forward_5 e058 forward_to_inbox f187 foundation f200 free_breakfast eb44 free_cancellation e748 front_hand e769 fullscreen e5d0 fullscreen_exit e5d1 functions e24a g_mobiledata f010 g_translate e927 gamepad e30f games e021 garage f011 gas_meter ec19 gavel e90e generating_tokens e749 gesture e155 get_app e884 gif e908 gif_box e7a3 girl eb68 gite e58b golf_course eb45 gpp_bad f012 gpp_good f013 gpp_maybe f014 gps_fixed e1b3 gps_not_fixed e1b4 gps_off e1b5 grade e885 gradient e3e9 grading ea4f grain e3ea graphic_eq e1b8 grass f205 grid_3x3 f015 grid_4x4 f016 grid_goldenratio f017 grid_off e3eb grid_on e3ec grid_view e9b0 group e7ef group_add e7f0 group_off e747 group_remove e7ad group_work e886 groups f233 groups_2 f8df groups_3 f8e0 h_mobiledata f018 h_plus_mobiledata f019 hail e9b1 handshake ebcb handyman f10b hardware ea59 hd e052 hdr_auto f01a hdr_auto_select f01b hdr_enhanced_select ef51 hdr_off e3ed hdr_off_select f01c hdr_on e3ee hdr_on_select f01d hdr_plus f01e hdr_strong e3f1 hdr_weak e3f2 headphones f01f headphones_battery f020 headset e310 headset_mic e311 headset_off e33a healing e3f3 health_and_safety e1d5 hearing e023 hearing_disabled f104 heart_broken eac2 heat_pump ec18 height ea16 help e887 help_center f1c0 help_outline e8fd hevc f021 hexagon eb39 hide_image f022 hide_source f023 high_quality e024 highlight e25f highlight_alt ef52 highlight_off e888 highlight_remove e888 hiking e50a history e889 history_edu ea3e history_toggle_off f17d hive eaa6 hls eb8a hls_off eb8c holiday_village e58a home e88a home_max f024 home_mini f025 home_repair_service f100 home_work ea09 horizontal_distribute e014 horizontal_rule f108 horizontal_split e947 hot_tub eb46 hotel e53a hotel_class e743 hourglass_bottom ea5c hourglass_disabled ef53 hourglass_empty e88b hourglass_full e88c hourglass_top ea5b house ea44 house_siding f202 houseboat e584 how_to_reg e174 how_to_vote e175 html eb7e http e902 https e88d hub e9f4 hvac f10e ice_skating e50b icecream ea69 image e3f4 image_aspect_ratio e3f5 image_not_supported f116 image_search e43f imagesearch_roller e9b4 import_contacts e0e0 import_export e0c3 important_devices e912 inbox e156 incomplete_circle e79b indeterminate_check_box e909 info e88e info_outline e88f input e890 insert_chart e24b insert_chart_outlined e26a insert_comment e24c insert_drive_file e24d insert_emoticon e24e insert_invitation e24f insert_link e250 insert_page_break eaca insert_photo e251 insights f092 install_desktop eb71 install_mobile eb72 integration_instructions ef54 interests e7c8 interpreter_mode e83b inventory e179 inventory_2 e1a1 invert_colors e891 invert_colors_off e0c4 invert_colors_on e891 ios_share e6b8 iron e583 iso e3f6 javascript eb7c join_full eaeb join_inner eaf4 join_left eaf2 join_right eaea kayaking e50c kebab_dining e842 key e73c key_off eb84 keyboard e312 keyboard_alt f028 keyboard_arrow_down e313 keyboard_arrow_left e314 keyboard_arrow_right e315 keyboard_arrow_up e316 keyboard_backspace e317 keyboard_capslock e318 keyboard_command_key eae7 keyboard_control eae1 keyboard_control_key eae6 keyboard_double_arrow_down ead0 keyboard_double_arrow_left eac3 keyboard_double_arrow_right eac9 keyboard_double_arrow_up eacf keyboard_hide e31a keyboard_option_key eae8 keyboard_return e31b keyboard_tab e31c keyboard_voice e31d king_bed ea45 kitchen eb47 kitesurfing e50d label e892 label_important e937 label_important_outline e948 label_off e9b6 label_outline e893 lan eb2f landscape e3f7 landslide ebd7 language e894 laptop e31e laptop_chromebook e31f laptop_mac e320 laptop_windows e321 last_page e5dd launch e895 layers e53b layers_clear e53c leaderboard f20c leak_add e3f8 leak_remove e3f9 leave_bags_at_home f23b legend_toggle f11b lens e3fa lens_blur f029 library_add e02e library_add_check e9b7 library_books e02f library_music e030 light f02a light_mode e518 lightbulb e0f0 lightbulb_circle ebfe lightbulb_outline e90f line_axis ea9a line_style e919 line_weight e91a linear_scale e260 link e157 link_off e16f linked_camera e438 liquor ea60 list e896 list_alt e0ee live_help e0c6 live_tv e639 living f02b local_activity e53f local_airport e53d local_atm e53e local_attraction e53f local_bar e540 local_cafe e541 local_car_wash e542 local_convenience_store e543 local_dining e556 local_drink e544 local_fire_department ef55 local_florist e545 local_gas_station e546 local_grocery_store e547 local_hospital e548 local_hotel e549 local_laundry_service e54a local_library e54b local_mall e54c local_movies e54d local_offer e54e local_parking e54f local_pharmacy e550 local_phone e551 local_pizza e552 local_play e553 local_police ef56 local_post_office e554 local_print_shop e555 local_printshop e555 local_restaurant e556 local_see e557 local_shipping e558 local_taxi e559 location_city e7f1 location_disabled e1b6 location_history e55a location_off e0c7 location_on e0c8 location_searching e1b7 lock e897 lock_clock ef57 lock_open e898 lock_outline e899 lock_person f8f3 lock_reset eade login ea77 logo_dev ead6 logout e9ba looks e3fc looks_3 e3fb looks_4 e3fd looks_5 e3fe looks_6 e3ff looks_one e400 looks_two e401 loop e028 loupe e402 low_priority e16d loyalty e89a lte_mobiledata f02c lte_plus_mobiledata f02d luggage f235 lunch_dining ea61 lyrics ec0b macro_off f8d2 mail e158 mail_lock ec0a mail_outline e0e1 male e58e man e4eb man_2 f8e1 man_3 f8e2 man_4 f8e3 manage_accounts f02e manage_history ebe7 manage_search f02f map e55b maps_home_work f030 maps_ugc ef58 margin e9bb mark_as_unread e9bc mark_chat_read f18b mark_chat_unread f189 mark_email_read f18c mark_email_unread f18a mark_unread_chat_alt eb9d markunread e159 markunread_mailbox e89b masks f218 maximize e930 media_bluetooth_off f031 media_bluetooth_on f032 mediation efa7 medical_information ebed medical_services f109 medication f033 medication_liquid ea87 meeting_room eb4f memory e322 menu e5d2 menu_book ea19 menu_open e9bd merge eb98 merge_type e252 message e0c9 messenger e0ca messenger_outline e0cb mic e029 mic_external_off ef59 mic_external_on ef5a mic_none e02a mic_off e02b microwave f204 military_tech ea3f minimize e931 minor_crash ebf1 miscellaneous_services f10c missed_video_call e073 mms e618 mobile_friendly e200 mobile_off e201 mobile_screen_share e0e7 mobiledata_off f034 mode f097 mode_comment e253 mode_edit e254 mode_edit_outline f035 mode_fan_off ec17 mode_night f036 mode_of_travel e7ce mode_standby f037 model_training f0cf monetization_on e263 money e57d money_off e25c money_off_csred f038 monitor ef5b monitor_heart eaa2 monitor_weight f039 monochrome_photos e403 mood e7f2 mood_bad e7f3 moped eb28 more e619 more_horiz eae1 more_time ea5d more_vert e5d4 mosque eab2 motion_photos_auto f03a motion_photos_off e9c0 motion_photos_on e9c1 motion_photos_pause f227 motion_photos_paused e9c2 motorcycle e91b mouse e323 move_down eb61 move_to_inbox e168 move_up eb64 movie e02c movie_creation e404 movie_filter e43a moving e501 mp e9c3 multiline_chart e6df multiple_stop f1b9 multitrack_audio e1b8 museum ea36 music_note e405 music_off e440 music_video e063 my_library_add e02e my_library_books e02f my_library_music e030 my_location e55c nat ef5c nature e406 nature_people e407 navigate_before e408 navigate_next e409 navigation e55d near_me e569 near_me_disabled f1ef nearby_error f03b nearby_off f03c nest_cam_wired_stand ec16 network_cell e1b9 network_check e640 network_locked e61a network_ping ebca network_wifi e1ba network_wifi_1_bar ebe4 network_wifi_2_bar ebd6 network_wifi_3_bar ebe1 new_label e609 new_releases e031 newspaper eb81 next_plan ef5d next_week e16a nfc e1bb night_shelter f1f1 nightlife ea62 nightlight f03d nightlight_round ef5e nights_stay ea46 no_accounts f03e no_adult_content f8fe no_backpack f237 no_cell f1a4 no_crash ebf0 no_drinks f1a5 no_encryption e641 no_encryption_gmailerrorred f03f no_flash f1a6 no_food f1a7 no_luggage f23b no_meals f1d6 no_meeting_room eb4e no_photography f1a8 no_sim e0cc no_stroller f1af no_transfer f1d5 noise_aware ebec noise_control_off ebf3 nordic_walking e50e north f1e0 north_east f1e1 north_west f1e2 not_accessible f0fe not_interested e033 not_listed_location e575 not_started f0d1 note e06f note_add e89c note_alt f040 notes e26c notification_add e399 notification_important e004 notifications e7f4 notifications_active e7f7 notifications_none e7f5 notifications_off e7f6 notifications_on e7f7 notifications_paused e7f8 now_wallpaper e75f now_widgets e75e numbers eac7 offline_bolt e932 offline_pin e90a offline_share e9c5 oil_barrel ec15 on_device_training ebfd ondemand_video e63a online_prediction f0eb opacity e91c open_in_browser e89d open_in_full f1ce open_in_new e89e open_in_new_off e4f6 open_with e89f other_houses e58c outbond f228 outbound e1ca outbox ef5f outdoor_grill ea47 outlet f1d4 outlined_flag e16e output ebbe padding e9c8 pages e7f9 pageview e8a0 paid f041 palette e40a pan_tool e925 pan_tool_alt ebb9 panorama e40b panorama_fish_eye e40c panorama_fisheye e40c panorama_horizontal e40d panorama_horizontal_select ef60 panorama_photosphere e9c9 panorama_photosphere_select e9ca panorama_vertical e40e panorama_vertical_select ef61 panorama_wide_angle e40f panorama_wide_angle_select ef62 paragliding e50f park ea63 party_mode e7fa password f042 paste f098 pattern f043 pause e034 pause_circle e1a2 pause_circle_filled e035 pause_circle_outline e036 pause_presentation e0ea payment e8a1 payments ef63 paypal ea8d pedal_bike eb29 pending ef64 pending_actions f1bb pentagon eb50 people e7fb people_alt ea21 people_outline e7fc percent eb58 perm_camera_mic e8a2 perm_contact_cal e8a3 perm_contact_calendar e8a3 perm_data_setting e8a4 perm_device_info e8a5 perm_device_information e8a5 perm_identity e8a6 perm_media e8a7 perm_phone_msg e8a8 perm_scan_wifi e8a9 person e7fd person_2 f8e4 person_3 f8e5 person_4 f8e6 person_add e7fe person_add_alt ea4d person_add_alt_1 ef65 person_add_disabled e9cb person_off e510 person_outline e7ff person_pin e55a person_pin_circle e56a person_remove ef66 person_remove_alt_1 ef67 person_search f106 personal_injury e6da personal_video e63b pest_control f0fa pest_control_rodent f0fd pets e91d phishing ead7 phone e0cd phone_android e324 phone_bluetooth_speaker e61b phone_callback e649 phone_disabled e9cc phone_enabled e9cd phone_forwarded e61c phone_in_talk e61d phone_iphone e325 phone_locked e61e phone_missed e61f phone_paused e620 phonelink e326 phonelink_erase e0db phonelink_lock e0dc phonelink_off e327 phonelink_ring e0dd phonelink_setup e0de photo e410 photo_album e411 photo_camera e412 photo_camera_back ef68 photo_camera_front ef69 photo_filter e43b photo_library e413 photo_size_select_actual e432 photo_size_select_large e433 photo_size_select_small e434 php eb8f piano e521 piano_off e520 picture_as_pdf e415 picture_in_picture e8aa picture_in_picture_alt e911 pie_chart e6c4 pie_chart_outline f044 pin f045 pin_drop e55e pin_end e767 pin_invoke e763 pinch eb38 pivot_table_chart e9ce pix eaa3 place e55f plagiarism ea5a play_arrow e037 play_circle e1c4 play_circle_fill e038 play_circle_filled e038 play_circle_outline e039 play_disabled ef6a play_for_work e906 play_lesson f047 playlist_add e03b playlist_add_check e065 playlist_add_check_circle e7e6 playlist_add_circle e7e5 playlist_play e05f playlist_remove eb80 plumbing f107 plus_one e800 podcasts f048 point_of_sale f17e policy ea17 poll e801 polyline ebbb polymer e8ab pool eb48 portable_wifi_off e0ce portrait e416 post_add ea20 power e63c power_input e336 power_off e646 power_settings_new e8ac precision_manufacturing f049 pregnant_woman e91e present_to_all e0df preview f1c5 price_change f04a price_check f04b print e8ad print_disabled e9cf priority_high e645 privacy_tip f0dc private_connectivity e744 production_quantity_limits e1d1 propane ec14 propane_tank ec13 psychology ea4a psychology_alt f8ea public e80b public_off f1ca publish e255 published_with_changes f232 punch_clock eaa8 push_pin f10d qr_code ef6b qr_code_2 e00a qr_code_scanner f206 query_builder e8ae query_stats e4fc question_answer e8af question_mark eb8b queue e03c queue_music e03d queue_play_next e066 quick_contacts_dialer e0cf quick_contacts_mail e0d0 quickreply ef6c quiz f04c quora ea98 r_mobiledata f04d radar f04e radio e03e radio_button_checked e837 radio_button_off e836 radio_button_on e837 radio_button_unchecked e836 railway_alert e9d1 ramen_dining ea64 ramp_left eb9c ramp_right eb96 rate_review e560 raw_off f04f raw_on f050 read_more ef6d real_estate_agent e73a receipt e8b0 receipt_long ef6e recent_actors e03f recommend e9d2 record_voice_over e91f rectangle eb54 recycling e760 reddit eaa0 redeem e8b1 redo e15a reduce_capacity f21c refresh e5d5 remember_me f051 remove e15b remove_circle e15c remove_circle_outline e15d remove_done e9d3 remove_from_queue e067 remove_moderator e9d4 remove_red_eye e417 remove_road ebfc remove_shopping_cart e928 reorder e8fe repartition f8e8 repeat e040 repeat_on e9d6 repeat_one e041 repeat_one_on e9d7 replay e042 replay_10 e059 replay_30 e05a replay_5 e05b replay_circle_filled e9d8 reply e15e reply_all e15f report e160 report_gmailerrorred f052 report_off e170 report_problem e8b2 request_page f22c request_quote f1b6 reset_tv e9d9 restart_alt f053 restaurant e56c restaurant_menu e561 restore e8b3 restore_from_trash e938 restore_page e929 reviews f054 rice_bowl f1f5 ring_volume e0d1 rocket eba5 rocket_launch eb9b roller_shades ec12 roller_shades_closed ec11 roller_skating ebcd roofing f201 room e8b4 room_preferences f1b8 room_service eb49 rotate_90_degrees_ccw e418 rotate_90_degrees_cw eaab rotate_left e419 rotate_right e41a roundabout_left eb99 roundabout_right eba3 rounded_corner e920 route eacd router e328 rowing e921 rss_feed e0e5 rsvp f055 rtt e9ad rule f1c2 rule_folder f1c9 run_circle ef6f running_with_errors e51d rv_hookup e642 safety_check ebef safety_divider e1cc sailing e502 sanitizer f21d satellite e562 satellite_alt eb3a save e161 save_alt e171 save_as eb60 saved_search ea11 savings e2eb scale eb5f scanner e329 scatter_plot e268 schedule e8b5 schedule_send ea0a schema e4fd school e80c science ea4b score e269 scoreboard ebd0 screen_lock_landscape e1be screen_lock_portrait e1bf screen_lock_rotation e1c0 screen_rotation e1c1 screen_rotation_alt ebee screen_search_desktop ef70 screen_share e0e2 screenshot f056 screenshot_monitor ec08 scuba_diving ebce sd e9dd sd_card e623 sd_card_alert f057 sd_storage e1c2 search e8b6 search_off ea76 security e32a security_update f058 security_update_good f059 security_update_warning f05a segment e94b select_all e162 self_improvement ea78 sell f05b send e163 send_and_archive ea0c send_time_extension eadb send_to_mobile f05c sensor_door f1b5 sensor_occupied ec10 sensor_window f1b4 sensors e51e sensors_off e51f sentiment_dissatisfied e811 sentiment_neutral e812 sentiment_satisfied e813 sentiment_satisfied_alt e0ed sentiment_very_dissatisfied e814 sentiment_very_satisfied e815 set_meal f1ea settings e8b8 settings_accessibility f05d settings_applications e8b9 settings_backup_restore e8ba settings_bluetooth e8bb settings_brightness e8bd settings_cell e8bc settings_display e8bd settings_ethernet e8be settings_input_antenna e8bf settings_input_component e8c0 settings_input_composite e8c1 settings_input_hdmi e8c2 settings_input_svideo e8c3 settings_overscan e8c4 settings_phone e8c5 settings_power e8c6 settings_remote e8c7 settings_suggest f05e settings_system_daydream e1c3 settings_voice e8c8 severe_cold ebd3 shape_line f8d3 share e80d share_arrival_time e524 share_location f05f shield e9e0 shield_moon eaa9 shop e8c9 shop_2 e19e shop_two e8ca shopify ea9d shopping_bag f1cc shopping_basket e8cb shopping_cart e8cc shopping_cart_checkout eb88 short_text e261 shortcut f060 show_chart e6e1 shower f061 shuffle e043 shuffle_on e9e1 shutter_speed e43d sick f220 sign_language ebe5 signal_cellular_0_bar f0a8 signal_cellular_1_bar f0a9 signal_cellular_2_bar f0aa signal_cellular_3_bar f0ab signal_cellular_4_bar e1c8 signal_cellular_alt e202 signal_cellular_alt_1_bar ebdf signal_cellular_alt_2_bar ebe3 signal_cellular_connected_no_internet_0_bar f0ac signal_cellular_connected_no_internet_1_bar f0ad signal_cellular_connected_no_internet_2_bar f0ae signal_cellular_connected_no_internet_3_bar f0af signal_cellular_connected_no_internet_4_bar e1cd signal_cellular_no_sim e1ce signal_cellular_nodata f062 signal_cellular_null e1cf signal_cellular_off e1d0 signal_wifi_0_bar f0b0 signal_wifi_1_bar f0b1 signal_wifi_1_bar_lock f0b2 signal_wifi_2_bar f0b3 signal_wifi_2_bar_lock f0b4 signal_wifi_3_bar f0b5 signal_wifi_3_bar_lock f0b6 signal_wifi_4_bar e1d8 signal_wifi_4_bar_lock e1d9 signal_wifi_bad f063 signal_wifi_connected_no_internet_0 f0f2 signal_wifi_connected_no_internet_1 f0ee signal_wifi_connected_no_internet_2 f0f1 signal_wifi_connected_no_internet_3 f0ed signal_wifi_connected_no_internet_4 f064 signal_wifi_off e1da signal_wifi_statusbar_1_bar f0e6 signal_wifi_statusbar_2_bar f0f0 signal_wifi_statusbar_3_bar f0ea signal_wifi_statusbar_4_bar f065 signal_wifi_statusbar_connected_no_internet f0f8 signal_wifi_statusbar_connected_no_internet_1 f0e9 signal_wifi_statusbar_connected_no_internet_2 f0f7 signal_wifi_statusbar_connected_no_internet_3 f0e8 signal_wifi_statusbar_connected_no_internet_4 f066 signal_wifi_statusbar_not_connected f0ef signal_wifi_statusbar_null f067 signpost eb91 sim_card e32b sim_card_alert e624 sim_card_download f068 single_bed ea48 sip f069 skateboarding e511 skip_next e044 skip_previous e045 sledding e512 slideshow e41b slow_motion_video e068 smart_button f1c1 smart_display f06a smart_screen f06b smart_toy f06c smartphone e32c smoke_free eb4a smoking_rooms eb4b sms e625 sms_failed e626 snapchat ea6e snippet_folder f1c7 snooze e046 snowboarding e513 snowmobile e503 snowshoeing e514 soap f1b2 social_distance e1cb solar_power ec0f sort e164 sort_by_alpha e053 sos ebf7 soup_kitchen e7d3 source f1c4 south f1e3 south_america e7e4 south_east f1e4 south_west f1e5 spa eb4c space_bar e256 space_dashboard e66b spatial_audio ebeb spatial_audio_off ebe8 spatial_tracking ebea speaker e32d speaker_group e32e speaker_notes e8cd speaker_notes_off e92a speaker_phone e0d2 speed e9e4 spellcheck e8ce splitscreen f06d spoke e9a7 sports ea30 sports_bar f1f3 sports_baseball ea51 sports_basketball ea26 sports_cricket ea27 sports_esports ea28 sports_football ea29 sports_golf ea2a sports_gymnastics ebc4 sports_handball ea33 sports_hockey ea2b sports_kabaddi ea34 sports_martial_arts eae9 sports_mma ea2c sports_motorsports ea2d sports_rugby ea2e sports_score f06e sports_soccer ea2f sports_tennis ea32 sports_volleyball ea31 square eb36 square_foot ea49 ssid_chart eb66 stacked_bar_chart e9e6 stacked_line_chart f22b stadium eb90 stairs f1a9 star e838 star_border e83a star_border_purple500 f099 star_half e839 star_outline f06f star_purple500 f09a star_rate f0ec stars e8d0 start e089 stay_current_landscape e0d3 stay_current_portrait e0d4 stay_primary_landscape e0d5 stay_primary_portrait e0d6 sticky_note_2 f1fc stop e047 stop_circle ef71 stop_screen_share e0e3 storage e1db store e8d1 store_mall_directory e563 storefront ea12 storm f070 straight eb95 straighten e41c stream e9e9 streetview e56e strikethrough_s e257 stroller f1ae style e41d subdirectory_arrow_left e5d9 subdirectory_arrow_right e5da subject e8d2 subscript f111 subscriptions e064 subtitles e048 subtitles_off ef72 subway e56f summarize f071 superscript f112 supervised_user_circle e939 supervisor_account e8d3 support ef73 support_agent f0e2 surfing e515 surround_sound e049 swap_calls e0d7 swap_horiz e8d4 swap_horizontal_circle e933 swap_vert e8d5 swap_vert_circle e8d6 swap_vertical_circle e8d6 swipe e9ec swipe_down eb53 swipe_down_alt eb30 swipe_left eb59 swipe_left_alt eb33 swipe_right eb52 swipe_right_alt eb56 swipe_up eb2e swipe_up_alt eb35 swipe_vertical eb51 switch_access_shortcut e7e1 switch_access_shortcut_add e7e2 switch_account e9ed switch_camera e41e switch_left f1d1 switch_right f1d2 switch_video e41f synagogue eab0 sync e627 sync_alt ea18 sync_disabled e628 sync_lock eaee sync_problem e629 system_security_update f072 system_security_update_good f073 system_security_update_warning f074 system_update e62a system_update_alt e8d7 system_update_tv e8d7 tab e8d8 tab_unselected e8d9 table_bar ead2 table_chart e265 table_restaurant eac6 table_rows f101 table_view f1be tablet e32f tablet_android e330 tablet_mac e331 tag e9ef tag_faces e420 takeout_dining ea74 tap_and_play e62b tapas f1e9 task f075 task_alt e2e6 taxi_alert ef74 telegram ea6b temple_buddhist eab3 temple_hindu eaaf terminal eb8e terrain e564 text_decrease eadd text_fields e262 text_format e165 text_increase eae2 text_rotate_up e93a text_rotate_vertical e93b text_rotation_angledown e93c text_rotation_angleup e93d text_rotation_down e93e text_rotation_none e93f text_snippet f1c6 textsms e0d8 texture e421 theater_comedy ea66 theaters e8da thermostat f076 thermostat_auto f077 thumb_down e8db thumb_down_alt e816 thumb_down_off_alt e9f2 thumb_up e8dc thumb_up_alt e817 thumb_up_off_alt e9f3 thumbs_up_down e8dd thunderstorm ebdb tiktok ea7e time_to_leave e62c timelapse e422 timeline e922 timer e425 timer_10 e423 timer_10_select f07a timer_3 e424 timer_3_select f07b timer_off e426 tips_and_updates e79a tire_repair ebc8 title e264 toc e8de today e8df toggle_off e9f5 toggle_on e9f6 token ea25 toll e8e0 tonality e427 topic f1c8 tornado e199 touch_app e913 tour ef75 toys e332 track_changes e8e1 traffic e565 train e570 tram e571 transcribe f8ec transfer_within_a_station e572 transform e428 transgender e58d transit_enterexit e579 translate e8e2 travel_explore e2db trending_down e8e3 trending_flat e8e4 trending_neutral e8e4 trending_up e8e5 trip_origin e57b troubleshoot e1d2 try f07c tsunami ebd8 tty f1aa tune e429 tungsten f07d turn_left eba6 turn_right ebab turn_sharp_left eba7 turn_sharp_right ebaa turn_slight_left eba4 turn_slight_right eb9a turned_in e8e6 turned_in_not e8e7 tv e333 tv_off e647 two_wheeler e9f9 type_specimen f8f0 u_turn_left eba1 u_turn_right eba2 umbrella f1ad unarchive e169 undo e166 unfold_less e5d6 unfold_less_double f8cf unfold_more e5d7 unfold_more_double f8d0 unpublished f236 unsubscribe e0eb upcoming f07e update e923 update_disabled e075 upgrade f0fb upload f09b upload_file e9fc usb e1e0 usb_off e4fa vaccines e138 vape_free ebc6 vaping_rooms ebcf verified ef76 verified_user e8e8 vertical_align_bottom e258 vertical_align_center e259 vertical_align_top e25a vertical_distribute e076 vertical_shades ec0e vertical_shades_closed ec0d vertical_split e949 vibration e62d video_call e070 video_camera_back f07f video_camera_front f080 video_collection e04a video_file eb87 video_label e071 video_library e04a video_settings ea75 video_stable f081 videocam e04b videocam_off e04c videogame_asset e338 videogame_asset_off e500 view_agenda e8e9 view_array e8ea view_carousel e8eb view_column e8ec view_comfortable e42a view_comfy e42a view_comfy_alt eb73 view_compact e42b view_compact_alt eb74 view_cozy eb75 view_day e8ed view_headline e8ee view_in_ar e9fe view_kanban eb7f view_list e8ef view_module e8f0 view_quilt e8f1 view_sidebar f114 view_stream e8f2 view_timeline eb85 view_week e8f3 vignette e435 villa e586 visibility e8f4 visibility_off e8f5 voice_chat e62e voice_over_off e94a voicemail e0d9 volcano ebda volume_down e04d volume_mute e04e volume_off e04f volume_up e050 volunteer_activism ea70 vpn_key e0da vpn_key_off eb7a vpn_lock e62f vrpano f082 wallet f8ff wallet_giftcard e8f6 wallet_membership e8f7 wallet_travel e8f8 wallpaper e75f warehouse ebb8 warning e002 warning_amber f083 wash f1b1 watch e334 watch_later e924 watch_off eae3 water f084 water_damage f203 water_drop e798 waterfall_chart ea00 waves e176 waving_hand e766 wb_auto e42c wb_cloudy e42d wb_incandescent e42e wb_iridescent e436 wb_shade ea01 wb_sunny e430 wb_twilight e1c6 wc e63d web e051 web_asset e069 web_asset_off e4f7 web_stories e595 webhook eb92 wechat ea81 weekend e16b west f1e6 whatsapp ea9c whatshot e80e wheelchair_pickup f1ab where_to_vote e177 widgets e75e width_full f8f5 width_normal f8f6 width_wide f8f7 wifi e63e wifi_1_bar e4ca wifi_2_bar e4d9 wifi_calling ef77 wifi_calling_1 f0e7 wifi_calling_2 f0f6 wifi_calling_3 f085 wifi_channel eb6a wifi_find eb31 wifi_lock e1e1 wifi_off e648 wifi_password eb6b wifi_protected_setup f0fc wifi_tethering e1e2 wifi_tethering_error f086 wifi_tethering_error_rounded f086 wifi_tethering_off f087 wind_power ec0c window f088 wine_bar f1e8 woman e13e woman_2 f8e7 woo_commerce ea6d wordpress ea9f work e8f9 work_history ec09 work_off e942 work_outline e943 workspace_premium e7af workspaces e1a0 wrap_text e25b wrong_location ef78 wysiwyg f1c3 yard f089 youtube_searched_for e8fa zoom_in e8ff zoom_in_map eb2d zoom_out e900 zoom_out_map e56b ================================================ FILE: webapp/frontend/src/assets/fonts/material-icons/README.md ================================================ The recommended way to use the Material Icons font is by linking to the web font hosted on Google Fonts: ```html ``` ================================================ FILE: webapp/frontend/src/assets/fonts/material-icons/material-icons.css ================================================ @font-face { font-family: 'Material Icons'; font-style: normal; font-weight: 400; src: local('Material Icons'), local('MaterialIcons-Regular'), url('MaterialIcons-Regular.ttf') format('truetype'); } .material-icons { font-family: 'Material Icons'; font-weight: normal; font-style: normal; font-size: 24px; /* Preferred icon size */ display: inline-block; line-height: 1; text-transform: none; letter-spacing: normal; word-wrap: normal; white-space: nowrap; direction: ltr; /* Support for all WebKit browsers. */ -webkit-font-smoothing: antialiased; /* Support for Safari and Chrome. */ text-rendering: optimizeLegibility; /* Support for Firefox. */ -moz-osx-font-smoothing: grayscale; /* Support for IE. */ font-feature-settings: 'liga'; } ================================================ FILE: webapp/frontend/src/assets/fonts/roboto/roboto.css ================================================ /* from https://google-webfonts-helper.herokuapp.com/fonts/roboto?subsets=latin */ /* roboto-300 - latin */ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 300; src: url('roboto-v30-latin-300.eot'); /* IE9 Compat Modes */ src: local(''), url('roboto-v30-latin-300.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('roboto-v30-latin-300.woff2') format('woff2'), /* Super Modern Browsers */ url('roboto-v30-latin-300.woff') format('woff'), /* Modern Browsers */ url('roboto-v30-latin-300.ttf') format('truetype'), /* Safari, Android, iOS */ url('roboto-v30-latin-300.svg#Roboto') format('svg'); /* Legacy iOS */ } /* roboto-regular - latin */ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 400; src: url('roboto-v30-latin-regular.eot'); /* IE9 Compat Modes */ src: local(''), url('roboto-v30-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('roboto-v30-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ url('roboto-v30-latin-regular.woff') format('woff'), /* Modern Browsers */ url('roboto-v30-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ url('roboto-v30-latin-regular.svg#Roboto') format('svg'); /* Legacy iOS */ } /* roboto-italic - latin */ @font-face { font-family: 'Roboto'; font-style: italic; font-weight: 400; src: url('roboto-v30-latin-italic.eot'); /* IE9 Compat Modes */ src: local(''), url('roboto-v30-latin-italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('roboto-v30-latin-italic.woff2') format('woff2'), /* Super Modern Browsers */ url('roboto-v30-latin-italic.woff') format('woff'), /* Modern Browsers */ url('roboto-v30-latin-italic.ttf') format('truetype'), /* Safari, Android, iOS */ url('roboto-v30-latin-italic.svg#Roboto') format('svg'); /* Legacy iOS */ } /* roboto-500 - latin */ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 500; src: url('roboto-v30-latin-500.eot'); /* IE9 Compat Modes */ src: local(''), url('roboto-v30-latin-500.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('roboto-v30-latin-500.woff2') format('woff2'), /* Super Modern Browsers */ url('roboto-v30-latin-500.woff') format('woff'), /* Modern Browsers */ url('roboto-v30-latin-500.ttf') format('truetype'), /* Safari, Android, iOS */ url('roboto-v30-latin-500.svg#Roboto') format('svg'); /* Legacy iOS */ } /* roboto-700 - latin */ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 700; src: url('roboto-v30-latin-700.eot'); /* IE9 Compat Modes */ src: local(''), url('roboto-v30-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('roboto-v30-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ url('roboto-v30-latin-700.woff') format('woff'), /* Modern Browsers */ url('roboto-v30-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ url('roboto-v30-latin-700.svg#Roboto') format('svg'); /* Legacy iOS */ } /* roboto-900 - latin */ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 900; src: url('roboto-v30-latin-900.eot'); /* IE9 Compat Modes */ src: local(''), url('roboto-v30-latin-900.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('roboto-v30-latin-900.woff2') format('woff2'), /* Super Modern Browsers */ url('roboto-v30-latin-900.woff') format('woff'), /* Modern Browsers */ url('roboto-v30-latin-900.ttf') format('truetype'), /* Safari, Android, iOS */ url('roboto-v30-latin-900.svg#Roboto') format('svg'); /* Legacy iOS */ } ================================================ FILE: webapp/frontend/src/browserconfig.xml ================================================ #ffffff ================================================ FILE: webapp/frontend/src/environments/environment.prod.ts ================================================ export const environment = { production: true }; ================================================ FILE: webapp/frontend/src/environments/environment.ts ================================================ // This file can be replaced during build by using the `fileReplacements` array. // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. // The list of file replacements can be found in `angular.json`. export const environment = { production: false }; /* * For easier debugging in development mode, you can import the following file * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. * * This import should be commented out in production mode because it will have a negative impact * on performance if an error is thrown. */ // import 'zone.js/dist/zone-error'; // Included with Angular CLI. ================================================ FILE: webapp/frontend/src/environments/versions.ts ================================================ // this file is automatically generated by git.version.ts script export const versionInfo = { version: 'dev', }; ================================================ FILE: webapp/frontend/src/index.html ================================================ scrutiny Scrutiny logo
================================================ FILE: webapp/frontend/src/main.ts ================================================ import { enableProdMode } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppModule } from './app/app.module'; import { environment } from './environments/environment'; if ( environment.production ) { enableProdMode(); } platformBrowserDynamic().bootstrapModule(AppModule) .catch(err => console.error(err)); ================================================ FILE: webapp/frontend/src/manifest.json ================================================ { "name": "App", "icons": [ { "src": ".\/android-icon-36x36.png", "sizes": "36x36", "type": "image\/png", "density": "0.75" }, { "src": ".\/android-icon-48x48.png", "sizes": "48x48", "type": "image\/png", "density": "1.0" }, { "src": ".\/android-icon-72x72.png", "sizes": "72x72", "type": "image\/png", "density": "1.5" }, { "src": ".\/android-icon-96x96.png", "sizes": "96x96", "type": "image\/png", "density": "2.0" }, { "src": ".\/android-icon-144x144.png", "sizes": "144x144", "type": "image\/png", "density": "3.0" }, { "src": ".\/android-icon-192x192.png", "sizes": "192x192", "type": "image\/png", "density": "4.0" } ] } ================================================ FILE: webapp/frontend/src/polyfills.ts ================================================ /** * This file includes polyfills needed by Angular and is loaded before the app. * You can add your own extra polyfills to this file. * * This file is divided into 2 sections: * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. * 2. Application imports. Files imported after ZoneJS that should be loaded before your main * file. * * The current setup is for so-called "evergreen" browsers; the last versions of browsers that * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. * * Learn more in https://angular.io/guide/browser-support */ /*************************************************************************************************** * BROWSER POLYFILLS */ /** IE10 and IE11 requires the following for NgClass support on SVG elements */ // import 'classlist.js'; // Run `npm install --save classlist.js`. /** * Web Animations `@angular/platform-browser/animations` * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). */ import 'web-animations-js'; // Run `npm install --save web-animations-js`. /** * By default, zone.js will patch all possible macroTask and DomEvents * user can disable parts of macroTask/DomEvents patch by setting following flags * because those flags need to be set before `zone.js` being loaded, and webpack * will put import in the top of bundle, so user need to create a separate file * in this directory (for example: zone-flags.ts), and put the following flags * into that file, and then add the following code before importing zone.js. * import './zone-flags'; * * The flags allowed in zone-flags.ts are listed here. * * The following flags will work for all browsers. * * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames * * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js * with the following flag, it will bypass `zone.js` patch for IE/Edge * * (window as any).__Zone_enable_cross_context_check = true; * */ /*************************************************************************************************** * Zone JS is required by default for Angular itself. */ import 'zone.js/dist/zone'; // Included with Angular CLI. /*************************************************************************************************** * APPLICATION IMPORTS */ ================================================ FILE: webapp/frontend/src/styles/styles.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ You can use this file to import custom styles. // // @ Styles from this file will override anything from 'vendors.scss' file allowing customizations and // modifications of third party libraries. // ----------------------------------------------------------------------------------------------------- .treo-theme-dark { .yellow-50 { background-color: #242b38 !important; .mat-icon { color: #0694a2 !important; } .text-secondary { color: #0694a2 !important } } } ================================================ FILE: webapp/frontend/src/styles/tailwind.scss ================================================ /* ----------------------------------------------------------------------------------------------------- */ /* This injects Tailwind's component classes and any component classes registered by plugins. /* ----------------------------------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------------------------------- */ /* Use custom @apply directives here to inline any existing utility classes into your own custom CSS. /* ----------------------------------------------------------------------------------------------------- */ /** * .btn { * @apply font-bold py-2 px-4 rounded; * } */ /* ----------------------------------------------------------------------------------------------------- */ /* This injects Tailwind's utility classes and any utility classes registered by plugins. /* ----------------------------------------------------------------------------------------------------- */ .space-y-0 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0px * var(--space-y-reverse)) !important; } .space-x-0 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0px * var(--space-x-reverse)) !important; margin-left: calc(0px * calc(1 - var(--space-x-reverse))) !important; } .space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.25rem * var(--space-y-reverse)) !important; } .space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.25rem * var(--space-x-reverse)) !important; margin-left: calc(0.25rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.5rem * var(--space-y-reverse)) !important; } .space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.5rem * var(--space-x-reverse)) !important; margin-left: calc(0.5rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.75rem * var(--space-y-reverse)) !important; } .space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.75rem * var(--space-x-reverse)) !important; margin-left: calc(0.75rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1rem * var(--space-y-reverse)) !important; } .space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1rem * var(--space-x-reverse)) !important; margin-left: calc(1rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.25rem * var(--space-y-reverse)) !important; } .space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.25rem * var(--space-x-reverse)) !important; margin-left: calc(1.25rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.5rem * var(--space-y-reverse)) !important; } .space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.5rem * var(--space-x-reverse)) !important; margin-left: calc(1.5rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2rem * var(--space-y-reverse)) !important; } .space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2rem * var(--space-x-reverse)) !important; margin-left: calc(2rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2.5rem * var(--space-y-reverse)) !important; } .space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2.5rem * var(--space-x-reverse)) !important; margin-left: calc(2.5rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3rem * var(--space-y-reverse)) !important; } .space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3rem * var(--space-x-reverse)) !important; margin-left: calc(3rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3.5rem * var(--space-y-reverse)) !important; } .space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3.5rem * var(--space-x-reverse)) !important; margin-left: calc(3.5rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4rem * var(--space-y-reverse)) !important; } .space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4rem * var(--space-x-reverse)) !important; margin-left: calc(4rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4.5rem * var(--space-y-reverse)) !important; } .space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4.5rem * var(--space-x-reverse)) !important; margin-left: calc(4.5rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5rem * var(--space-y-reverse)) !important; } .space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5rem * var(--space-x-reverse)) !important; margin-left: calc(5rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5.5rem * var(--space-y-reverse)) !important; } .space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5.5rem * var(--space-x-reverse)) !important; margin-left: calc(5.5rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6rem * var(--space-y-reverse)) !important; } .space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6rem * var(--space-x-reverse)) !important; margin-left: calc(6rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6.5rem * var(--space-y-reverse)) !important; } .space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6.5rem * var(--space-x-reverse)) !important; margin-left: calc(6.5rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7rem * var(--space-y-reverse)) !important; } .space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7rem * var(--space-x-reverse)) !important; margin-left: calc(7rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7.5rem * var(--space-y-reverse)) !important; } .space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7.5rem * var(--space-x-reverse)) !important; margin-left: calc(7.5rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(8rem * var(--space-y-reverse)) !important; } .space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(8rem * var(--space-x-reverse)) !important; margin-left: calc(8rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(9rem * var(--space-y-reverse)) !important; } .space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(9rem * var(--space-x-reverse)) !important; margin-left: calc(9rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(10rem * var(--space-y-reverse)) !important; } .space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(10rem * var(--space-x-reverse)) !important; margin-left: calc(10rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(12rem * var(--space-y-reverse)) !important; } .space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(12rem * var(--space-x-reverse)) !important; margin-left: calc(12rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(14rem * var(--space-y-reverse)) !important; } .space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(14rem * var(--space-x-reverse)) !important; margin-left: calc(14rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(16rem * var(--space-y-reverse)) !important; } .space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(16rem * var(--space-x-reverse)) !important; margin-left: calc(16rem * calc(1 - var(--space-x-reverse))) !important; } .space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1px * var(--space-y-reverse)) !important; } .space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1px * var(--space-x-reverse)) !important; margin-left: calc(1px * calc(1 - var(--space-x-reverse))) !important; } .space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2px * var(--space-y-reverse)) !important; } .space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2px * var(--space-x-reverse)) !important; margin-left: calc(2px * calc(1 - var(--space-x-reverse))) !important; } .-space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.25rem * var(--space-y-reverse)) !important; } .-space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.25rem * var(--space-x-reverse)) !important; margin-left: calc(-0.25rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.5rem * var(--space-y-reverse)) !important; } .-space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.5rem * var(--space-x-reverse)) !important; margin-left: calc(-0.5rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.75rem * var(--space-y-reverse)) !important; } .-space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.75rem * var(--space-x-reverse)) !important; margin-left: calc(-0.75rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1rem * var(--space-y-reverse)) !important; } .-space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1rem * var(--space-x-reverse)) !important; margin-left: calc(-1rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.25rem * var(--space-y-reverse)) !important; } .-space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.25rem * var(--space-x-reverse)) !important; margin-left: calc(-1.25rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.5rem * var(--space-y-reverse)) !important; } .-space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.5rem * var(--space-x-reverse)) !important; margin-left: calc(-1.5rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2rem * var(--space-y-reverse)) !important; } .-space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2rem * var(--space-x-reverse)) !important; margin-left: calc(-2rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2.5rem * var(--space-y-reverse)) !important; } .-space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2.5rem * var(--space-x-reverse)) !important; margin-left: calc(-2.5rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3rem * var(--space-y-reverse)) !important; } .-space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3rem * var(--space-x-reverse)) !important; margin-left: calc(-3rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3.5rem * var(--space-y-reverse)) !important; } .-space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3.5rem * var(--space-x-reverse)) !important; margin-left: calc(-3.5rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4rem * var(--space-y-reverse)) !important; } .-space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4rem * var(--space-x-reverse)) !important; margin-left: calc(-4rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4.5rem * var(--space-y-reverse)) !important; } .-space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4.5rem * var(--space-x-reverse)) !important; margin-left: calc(-4.5rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5rem * var(--space-y-reverse)) !important; } .-space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5rem * var(--space-x-reverse)) !important; margin-left: calc(-5rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5.5rem * var(--space-y-reverse)) !important; } .-space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5.5rem * var(--space-x-reverse)) !important; margin-left: calc(-5.5rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6rem * var(--space-y-reverse)) !important; } .-space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6rem * var(--space-x-reverse)) !important; margin-left: calc(-6rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6.5rem * var(--space-y-reverse)) !important; } .-space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6.5rem * var(--space-x-reverse)) !important; margin-left: calc(-6.5rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7rem * var(--space-y-reverse)) !important; } .-space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7rem * var(--space-x-reverse)) !important; margin-left: calc(-7rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7.5rem * var(--space-y-reverse)) !important; } .-space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7.5rem * var(--space-x-reverse)) !important; margin-left: calc(-7.5rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-8rem * var(--space-y-reverse)) !important; } .-space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-8rem * var(--space-x-reverse)) !important; margin-left: calc(-8rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-9rem * var(--space-y-reverse)) !important; } .-space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-9rem * var(--space-x-reverse)) !important; margin-left: calc(-9rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-10rem * var(--space-y-reverse)) !important; } .-space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-10rem * var(--space-x-reverse)) !important; margin-left: calc(-10rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-12rem * var(--space-y-reverse)) !important; } .-space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-12rem * var(--space-x-reverse)) !important; margin-left: calc(-12rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-14rem * var(--space-y-reverse)) !important; } .-space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-14rem * var(--space-x-reverse)) !important; margin-left: calc(-14rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-16rem * var(--space-y-reverse)) !important; } .-space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-16rem * var(--space-x-reverse)) !important; margin-left: calc(-16rem * calc(1 - var(--space-x-reverse))) !important; } .-space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1px * var(--space-y-reverse)) !important; } .-space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1px * var(--space-x-reverse)) !important; margin-left: calc(-1px * calc(1 - var(--space-x-reverse))) !important; } .-space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2px * var(--space-y-reverse)) !important; } .-space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2px * var(--space-x-reverse)) !important; margin-left: calc(-2px * calc(1 - var(--space-x-reverse))) !important; } .space-y-reverse > :not(template) ~ :not(template) { --space-y-reverse: 1 !important; } .space-x-reverse > :not(template) ~ :not(template) { --space-x-reverse: 1 !important; } .divide-y-0 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(0px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(0px * var(--divide-y-reverse)) !important; } .divide-x-0 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(0px * var(--divide-x-reverse)) !important; border-left-width: calc(0px * calc(1 - var(--divide-x-reverse))) !important; } .divide-y-2 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(2px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(2px * var(--divide-y-reverse)) !important; } .divide-x-2 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(2px * var(--divide-x-reverse)) !important; border-left-width: calc(2px * calc(1 - var(--divide-x-reverse))) !important; } .divide-y-4 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(4px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(4px * var(--divide-y-reverse)) !important; } .divide-x-4 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(4px * var(--divide-x-reverse)) !important; border-left-width: calc(4px * calc(1 - var(--divide-x-reverse))) !important; } .divide-y-8 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(8px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(8px * var(--divide-y-reverse)) !important; } .divide-x-8 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(8px * var(--divide-x-reverse)) !important; border-left-width: calc(8px * calc(1 - var(--divide-x-reverse))) !important; } .divide-y > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(1px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(1px * var(--divide-y-reverse)) !important; } .divide-x > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(1px * var(--divide-x-reverse)) !important; border-left-width: calc(1px * calc(1 - var(--divide-x-reverse))) !important; } .divide-y-reverse > :not(template) ~ :not(template) { --divide-y-reverse: 1 !important; } .divide-x-reverse > :not(template) ~ :not(template) { --divide-x-reverse: 1 !important; } .divide-current > :not(template) ~ :not(template) { border-color: currentColor !important; } .divide-transparent > :not(template) ~ :not(template) { border-color: transparent !important; } .divide-white > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFFFFF !important; border-color: rgba(255, 255, 255, var(--divide-opacity)) !important; } .divide-black > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #000000 !important; border-color: rgba(0, 0, 0, var(--divide-opacity)) !important; } .divide-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F9FAFB !important; border-color: rgba(249, 250, 251, var(--divide-opacity)) !important; } .divide-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F4F5F7 !important; border-color: rgba(244, 245, 247, var(--divide-opacity)) !important; } .divide-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5E7EB !important; border-color: rgba(229, 231, 235, var(--divide-opacity)) !important; } .divide-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D2D6DC !important; border-color: rgba(210, 214, 220, var(--divide-opacity)) !important; } .divide-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9FA6B2 !important; border-color: rgba(159, 166, 178, var(--divide-opacity)) !important; } .divide-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .divide-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4B5563 !important; border-color: rgba(75, 85, 99, var(--divide-opacity)) !important; } .divide-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #374151 !important; border-color: rgba(55, 65, 81, var(--divide-opacity)) !important; } .divide-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #252F3F !important; border-color: rgba(37, 47, 63, var(--divide-opacity)) !important; } .divide-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #161E2E !important; border-color: rgba(22, 30, 46, var(--divide-opacity)) !important; } .divide-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .divide-cool-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBFDFE !important; border-color: rgba(251, 253, 254, var(--divide-opacity)) !important; } .divide-cool-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F1F5F9 !important; border-color: rgba(241, 245, 249, var(--divide-opacity)) !important; } .divide-cool-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E2E8F0 !important; border-color: rgba(226, 232, 240, var(--divide-opacity)) !important; } .divide-cool-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CFD8E3 !important; border-color: rgba(207, 216, 227, var(--divide-opacity)) !important; } .divide-cool-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #97A6BA !important; border-color: rgba(151, 166, 186, var(--divide-opacity)) !important; } .divide-cool-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .divide-cool-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #475569 !important; border-color: rgba(71, 85, 105, var(--divide-opacity)) !important; } .divide-cool-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #364152 !important; border-color: rgba(54, 65, 82, var(--divide-opacity)) !important; } .divide-cool-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #27303F !important; border-color: rgba(39, 48, 63, var(--divide-opacity)) !important; } .divide-cool-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A202E !important; border-color: rgba(26, 32, 46, var(--divide-opacity)) !important; } .divide-cool-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .divide-red-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F2 !important; border-color: rgba(253, 242, 242, var(--divide-opacity)) !important; } .divide-red-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDE8E8 !important; border-color: rgba(253, 232, 232, var(--divide-opacity)) !important; } .divide-red-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBD5D5 !important; border-color: rgba(251, 213, 213, var(--divide-opacity)) !important; } .divide-red-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4B4 !important; border-color: rgba(248, 180, 180, var(--divide-opacity)) !important; } .divide-red-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F98080 !important; border-color: rgba(249, 128, 128, var(--divide-opacity)) !important; } .divide-red-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .divide-red-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E02424 !important; border-color: rgba(224, 36, 36, var(--divide-opacity)) !important; } .divide-red-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C81E1E !important; border-color: rgba(200, 30, 30, var(--divide-opacity)) !important; } .divide-red-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9B1C1C !important; border-color: rgba(155, 28, 28, var(--divide-opacity)) !important; } .divide-red-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .divide-red > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .divide-orange-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFF8F1 !important; border-color: rgba(255, 248, 241, var(--divide-opacity)) !important; } .divide-orange-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FEECDC !important; border-color: rgba(254, 236, 220, var(--divide-opacity)) !important; } .divide-orange-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCD9BD !important; border-color: rgba(252, 217, 189, var(--divide-opacity)) !important; } .divide-orange-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDBA8C !important; border-color: rgba(253, 186, 140, var(--divide-opacity)) !important; } .divide-orange-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF8A4C !important; border-color: rgba(255, 138, 76, var(--divide-opacity)) !important; } .divide-orange-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .divide-orange-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D03801 !important; border-color: rgba(208, 56, 1, var(--divide-opacity)) !important; } .divide-orange-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B43403 !important; border-color: rgba(180, 52, 3, var(--divide-opacity)) !important; } .divide-orange-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8A2C0D !important; border-color: rgba(138, 44, 13, var(--divide-opacity)) !important; } .divide-orange-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .divide-orange > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .divide-yellow-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDFDEA !important; border-color: rgba(253, 253, 234, var(--divide-opacity)) !important; } .divide-yellow-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF6B2 !important; border-color: rgba(253, 246, 178, var(--divide-opacity)) !important; } .divide-yellow-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE96A !important; border-color: rgba(252, 233, 106, var(--divide-opacity)) !important; } .divide-yellow-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FACA15 !important; border-color: rgba(250, 202, 21, var(--divide-opacity)) !important; } .divide-yellow-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E3A008 !important; border-color: rgba(227, 160, 8, var(--divide-opacity)) !important; } .divide-yellow-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .divide-yellow-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9F580A !important; border-color: rgba(159, 88, 10, var(--divide-opacity)) !important; } .divide-yellow-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8E4B10 !important; border-color: rgba(142, 75, 16, var(--divide-opacity)) !important; } .divide-yellow-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #723B13 !important; border-color: rgba(114, 59, 19, var(--divide-opacity)) !important; } .divide-yellow-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #633112 !important; border-color: rgba(99, 49, 18, var(--divide-opacity)) !important; } .divide-yellow > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .divide-green-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F3FAF7 !important; border-color: rgba(243, 250, 247, var(--divide-opacity)) !important; } .divide-green-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DEF7EC !important; border-color: rgba(222, 247, 236, var(--divide-opacity)) !important; } .divide-green-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BCF0DA !important; border-color: rgba(188, 240, 218, var(--divide-opacity)) !important; } .divide-green-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #84E1BC !important; border-color: rgba(132, 225, 188, var(--divide-opacity)) !important; } .divide-green-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #31C48D !important; border-color: rgba(49, 196, 141, var(--divide-opacity)) !important; } .divide-green-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .divide-green-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #057A55 !important; border-color: rgba(5, 122, 85, var(--divide-opacity)) !important; } .divide-green-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #046C4E !important; border-color: rgba(4, 108, 78, var(--divide-opacity)) !important; } .divide-green-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #03543F !important; border-color: rgba(3, 84, 63, var(--divide-opacity)) !important; } .divide-green-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014737 !important; border-color: rgba(1, 71, 55, var(--divide-opacity)) !important; } .divide-green > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .divide-teal-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDFAFA !important; border-color: rgba(237, 250, 250, var(--divide-opacity)) !important; } .divide-teal-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D5F5F6 !important; border-color: rgba(213, 245, 246, var(--divide-opacity)) !important; } .divide-teal-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AFECEF !important; border-color: rgba(175, 236, 239, var(--divide-opacity)) !important; } .divide-teal-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7EDCE2 !important; border-color: rgba(126, 220, 226, var(--divide-opacity)) !important; } .divide-teal-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #16BDCA !important; border-color: rgba(22, 189, 202, var(--divide-opacity)) !important; } .divide-teal-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .divide-teal-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #047481 !important; border-color: rgba(4, 116, 129, var(--divide-opacity)) !important; } .divide-teal-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #036672 !important; border-color: rgba(3, 102, 114, var(--divide-opacity)) !important; } .divide-teal-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #05505C !important; border-color: rgba(5, 80, 92, var(--divide-opacity)) !important; } .divide-teal-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014451 !important; border-color: rgba(1, 68, 81, var(--divide-opacity)) !important; } .divide-teal > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .divide-blue-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EBF5FF !important; border-color: rgba(235, 245, 255, var(--divide-opacity)) !important; } .divide-blue-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E1EFFE !important; border-color: rgba(225, 239, 254, var(--divide-opacity)) !important; } .divide-blue-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C3DDFD !important; border-color: rgba(195, 221, 253, var(--divide-opacity)) !important; } .divide-blue-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #A4CAFE !important; border-color: rgba(164, 202, 254, var(--divide-opacity)) !important; } .divide-blue-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #76A9FA !important; border-color: rgba(118, 169, 250, var(--divide-opacity)) !important; } .divide-blue-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .divide-blue-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1C64F2 !important; border-color: rgba(28, 100, 242, var(--divide-opacity)) !important; } .divide-blue-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A56DB !important; border-color: rgba(26, 86, 219, var(--divide-opacity)) !important; } .divide-blue-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1E429F !important; border-color: rgba(30, 66, 159, var(--divide-opacity)) !important; } .divide-blue-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #233876 !important; border-color: rgba(35, 56, 118, var(--divide-opacity)) !important; } .divide-blue > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .divide-indigo-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F0F5FF !important; border-color: rgba(240, 245, 255, var(--divide-opacity)) !important; } .divide-indigo-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5EDFF !important; border-color: rgba(229, 237, 255, var(--divide-opacity)) !important; } .divide-indigo-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CDDBFE !important; border-color: rgba(205, 219, 254, var(--divide-opacity)) !important; } .divide-indigo-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B4C6FC !important; border-color: rgba(180, 198, 252, var(--divide-opacity)) !important; } .divide-indigo-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8DA2FB !important; border-color: rgba(141, 162, 251, var(--divide-opacity)) !important; } .divide-indigo-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .divide-indigo-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5850EC !important; border-color: rgba(88, 80, 236, var(--divide-opacity)) !important; } .divide-indigo-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5145CD !important; border-color: rgba(81, 69, 205, var(--divide-opacity)) !important; } .divide-indigo-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #42389D !important; border-color: rgba(66, 56, 157, var(--divide-opacity)) !important; } .divide-indigo-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #362F78 !important; border-color: rgba(54, 47, 120, var(--divide-opacity)) !important; } .divide-indigo > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .divide-purple-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F6F5FF !important; border-color: rgba(246, 245, 255, var(--divide-opacity)) !important; } .divide-purple-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDEBFE !important; border-color: rgba(237, 235, 254, var(--divide-opacity)) !important; } .divide-purple-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DCD7FE !important; border-color: rgba(220, 215, 254, var(--divide-opacity)) !important; } .divide-purple-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CABFFD !important; border-color: rgba(202, 191, 253, var(--divide-opacity)) !important; } .divide-purple-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AC94FA !important; border-color: rgba(172, 148, 250, var(--divide-opacity)) !important; } .divide-purple-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .divide-purple-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7E3AF2 !important; border-color: rgba(126, 58, 242, var(--divide-opacity)) !important; } .divide-purple-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6C2BD9 !important; border-color: rgba(108, 43, 217, var(--divide-opacity)) !important; } .divide-purple-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5521B5 !important; border-color: rgba(85, 33, 181, var(--divide-opacity)) !important; } .divide-purple-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4A1D96 !important; border-color: rgba(74, 29, 150, var(--divide-opacity)) !important; } .divide-purple > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .divide-pink-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F8 !important; border-color: rgba(253, 242, 248, var(--divide-opacity)) !important; } .divide-pink-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE8F3 !important; border-color: rgba(252, 232, 243, var(--divide-opacity)) !important; } .divide-pink-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FAD1E8 !important; border-color: rgba(250, 209, 232, var(--divide-opacity)) !important; } .divide-pink-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4D9 !important; border-color: rgba(248, 180, 217, var(--divide-opacity)) !important; } .divide-pink-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F17EB8 !important; border-color: rgba(241, 126, 184, var(--divide-opacity)) !important; } .divide-pink-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .divide-pink-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D61F69 !important; border-color: rgba(214, 31, 105, var(--divide-opacity)) !important; } .divide-pink-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BF125D !important; border-color: rgba(191, 18, 93, var(--divide-opacity)) !important; } .divide-pink-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #99154B !important; border-color: rgba(153, 21, 75, var(--divide-opacity)) !important; } .divide-pink-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #751A3D !important; border-color: rgba(117, 26, 61, var(--divide-opacity)) !important; } .divide-pink > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .divide-opacity-0 > :not(template) ~ :not(template) { --divide-opacity: 0 !important; } .divide-opacity-12 > :not(template) ~ :not(template) { --divide-opacity: 0.12 !important; } .divide-opacity-25 > :not(template) ~ :not(template) { --divide-opacity: 0.25 !important; } .divide-opacity-38 > :not(template) ~ :not(template) { --divide-opacity: 0.38 !important; } .divide-opacity-50 > :not(template) ~ :not(template) { --divide-opacity: 0.5 !important; } .divide-opacity-54 > :not(template) ~ :not(template) { --divide-opacity: 0.54 !important; } .divide-opacity-70 > :not(template) ~ :not(template) { --divide-opacity: 0.70 !important; } .divide-opacity-75 > :not(template) ~ :not(template) { --divide-opacity: 0.75 !important; } .divide-opacity-84 > :not(template) ~ :not(template) { --divide-opacity: 0.84 !important; } .divide-opacity-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; } .sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .not-sr-only { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .focus\:sr-only:focus { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .focus\:not-sr-only:focus { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .appearance-none { -webkit-appearance: none !important; -moz-appearance: none !important; appearance: none !important; } .bg-fixed { background-attachment: fixed !important; } .bg-local { background-attachment: local !important; } .bg-scroll { background-attachment: scroll !important; } .bg-current { background-color: currentColor !important; } .bg-transparent { background-color: transparent !important; } .bg-white { --bg-opacity: 1 !important; background-color: #FFFFFF !important; background-color: rgba(255, 255, 255, var(--bg-opacity)) !important; } .bg-black { --bg-opacity: 1 !important; background-color: #000000 !important; background-color: rgba(0, 0, 0, var(--bg-opacity)) !important; } .bg-gray-50 { --bg-opacity: 1 !important; background-color: #F9FAFB !important; background-color: rgba(249, 250, 251, var(--bg-opacity)) !important; } .bg-gray-100 { --bg-opacity: 1 !important; background-color: #F4F5F7 !important; background-color: rgba(244, 245, 247, var(--bg-opacity)) !important; } .bg-gray-200 { --bg-opacity: 1 !important; background-color: #E5E7EB !important; background-color: rgba(229, 231, 235, var(--bg-opacity)) !important; } .bg-gray-300 { --bg-opacity: 1 !important; background-color: #D2D6DC !important; background-color: rgba(210, 214, 220, var(--bg-opacity)) !important; } .bg-gray-400 { --bg-opacity: 1 !important; background-color: #9FA6B2 !important; background-color: rgba(159, 166, 178, var(--bg-opacity)) !important; } .bg-gray-500 { --bg-opacity: 1 !important; background-color: #6B7280 !important; background-color: rgba(107, 114, 128, var(--bg-opacity)) !important; } .bg-gray-600 { --bg-opacity: 1 !important; background-color: #4B5563 !important; background-color: rgba(75, 85, 99, var(--bg-opacity)) !important; } .bg-gray-700 { --bg-opacity: 1 !important; background-color: #374151 !important; background-color: rgba(55, 65, 81, var(--bg-opacity)) !important; } .bg-gray-800 { --bg-opacity: 1 !important; background-color: #252F3F !important; background-color: rgba(37, 47, 63, var(--bg-opacity)) !important; } .bg-gray-900 { --bg-opacity: 1 !important; background-color: #161E2E !important; background-color: rgba(22, 30, 46, var(--bg-opacity)) !important; } .bg-gray { --bg-opacity: 1 !important; background-color: #6B7280 !important; background-color: rgba(107, 114, 128, var(--bg-opacity)) !important; } .bg-cool-gray-50 { --bg-opacity: 1 !important; background-color: #FBFDFE !important; background-color: rgba(251, 253, 254, var(--bg-opacity)) !important; } .bg-cool-gray-100 { --bg-opacity: 1 !important; background-color: #F1F5F9 !important; background-color: rgba(241, 245, 249, var(--bg-opacity)) !important; } .bg-cool-gray-200 { --bg-opacity: 1 !important; background-color: #E2E8F0 !important; background-color: rgba(226, 232, 240, var(--bg-opacity)) !important; } .bg-cool-gray-300 { --bg-opacity: 1 !important; background-color: #CFD8E3 !important; background-color: rgba(207, 216, 227, var(--bg-opacity)) !important; } .bg-cool-gray-400 { --bg-opacity: 1 !important; background-color: #97A6BA !important; background-color: rgba(151, 166, 186, var(--bg-opacity)) !important; } .bg-cool-gray-500 { --bg-opacity: 1 !important; background-color: #64748B !important; background-color: rgba(100, 116, 139, var(--bg-opacity)) !important; } .bg-cool-gray-600 { --bg-opacity: 1 !important; background-color: #475569 !important; background-color: rgba(71, 85, 105, var(--bg-opacity)) !important; } .bg-cool-gray-700 { --bg-opacity: 1 !important; background-color: #364152 !important; background-color: rgba(54, 65, 82, var(--bg-opacity)) !important; } .bg-cool-gray-800 { --bg-opacity: 1 !important; background-color: #27303F !important; background-color: rgba(39, 48, 63, var(--bg-opacity)) !important; } .bg-cool-gray-900 { --bg-opacity: 1 !important; background-color: #1A202E !important; background-color: rgba(26, 32, 46, var(--bg-opacity)) !important; } .bg-cool-gray { --bg-opacity: 1 !important; background-color: #64748B !important; background-color: rgba(100, 116, 139, var(--bg-opacity)) !important; } .bg-red-50 { --bg-opacity: 1 !important; background-color: #FDF2F2 !important; background-color: rgba(253, 242, 242, var(--bg-opacity)) !important; } .bg-red-100 { --bg-opacity: 1 !important; background-color: #FDE8E8 !important; background-color: rgba(253, 232, 232, var(--bg-opacity)) !important; } .bg-red-200 { --bg-opacity: 1 !important; background-color: #FBD5D5 !important; background-color: rgba(251, 213, 213, var(--bg-opacity)) !important; } .bg-red-300 { --bg-opacity: 1 !important; background-color: #F8B4B4 !important; background-color: rgba(248, 180, 180, var(--bg-opacity)) !important; } .bg-red-400 { --bg-opacity: 1 !important; background-color: #F98080 !important; background-color: rgba(249, 128, 128, var(--bg-opacity)) !important; } .bg-red-500 { --bg-opacity: 1 !important; background-color: #F05252 !important; background-color: rgba(240, 82, 82, var(--bg-opacity)) !important; } .bg-red-600 { --bg-opacity: 1 !important; background-color: #E02424 !important; background-color: rgba(224, 36, 36, var(--bg-opacity)) !important; } .bg-red-700 { --bg-opacity: 1 !important; background-color: #C81E1E !important; background-color: rgba(200, 30, 30, var(--bg-opacity)) !important; } .bg-red-800 { --bg-opacity: 1 !important; background-color: #9B1C1C !important; background-color: rgba(155, 28, 28, var(--bg-opacity)) !important; } .bg-red-900 { --bg-opacity: 1 !important; background-color: #771D1D !important; background-color: rgba(119, 29, 29, var(--bg-opacity)) !important; } .bg-red { --bg-opacity: 1 !important; background-color: #F05252 !important; background-color: rgba(240, 82, 82, var(--bg-opacity)) !important; } .bg-orange-50 { --bg-opacity: 1 !important; background-color: #FFF8F1 !important; background-color: rgba(255, 248, 241, var(--bg-opacity)) !important; } .bg-orange-100 { --bg-opacity: 1 !important; background-color: #FEECDC !important; background-color: rgba(254, 236, 220, var(--bg-opacity)) !important; } .bg-orange-200 { --bg-opacity: 1 !important; background-color: #FCD9BD !important; background-color: rgba(252, 217, 189, var(--bg-opacity)) !important; } .bg-orange-300 { --bg-opacity: 1 !important; background-color: #FDBA8C !important; background-color: rgba(253, 186, 140, var(--bg-opacity)) !important; } .bg-orange-400 { --bg-opacity: 1 !important; background-color: #FF8A4C !important; background-color: rgba(255, 138, 76, var(--bg-opacity)) !important; } .bg-orange-500 { --bg-opacity: 1 !important; background-color: #FF5A1F !important; background-color: rgba(255, 90, 31, var(--bg-opacity)) !important; } .bg-orange-600 { --bg-opacity: 1 !important; background-color: #D03801 !important; background-color: rgba(208, 56, 1, var(--bg-opacity)) !important; } .bg-orange-700 { --bg-opacity: 1 !important; background-color: #B43403 !important; background-color: rgba(180, 52, 3, var(--bg-opacity)) !important; } .bg-orange-800 { --bg-opacity: 1 !important; background-color: #8A2C0D !important; background-color: rgba(138, 44, 13, var(--bg-opacity)) !important; } .bg-orange-900 { --bg-opacity: 1 !important; background-color: #771D1D !important; background-color: rgba(119, 29, 29, var(--bg-opacity)) !important; } .bg-orange { --bg-opacity: 1 !important; background-color: #FF5A1F !important; background-color: rgba(255, 90, 31, var(--bg-opacity)) !important; } .bg-yellow-50 { --bg-opacity: 1 !important; background-color: #FDFDEA !important; background-color: rgba(253, 253, 234, var(--bg-opacity)) !important; } .bg-yellow-100 { --bg-opacity: 1 !important; background-color: #FDF6B2 !important; background-color: rgba(253, 246, 178, var(--bg-opacity)) !important; } .bg-yellow-200 { --bg-opacity: 1 !important; background-color: #FCE96A !important; background-color: rgba(252, 233, 106, var(--bg-opacity)) !important; } .bg-yellow-300 { --bg-opacity: 1 !important; background-color: #FACA15 !important; background-color: rgba(250, 202, 21, var(--bg-opacity)) !important; } .bg-yellow-400 { --bg-opacity: 1 !important; background-color: #E3A008 !important; background-color: rgba(227, 160, 8, var(--bg-opacity)) !important; } .bg-yellow-500 { --bg-opacity: 1 !important; background-color: #C27803 !important; background-color: rgba(194, 120, 3, var(--bg-opacity)) !important; } .bg-yellow-600 { --bg-opacity: 1 !important; background-color: #9F580A !important; background-color: rgba(159, 88, 10, var(--bg-opacity)) !important; } .bg-yellow-700 { --bg-opacity: 1 !important; background-color: #8E4B10 !important; background-color: rgba(142, 75, 16, var(--bg-opacity)) !important; } .bg-yellow-800 { --bg-opacity: 1 !important; background-color: #723B13 !important; background-color: rgba(114, 59, 19, var(--bg-opacity)) !important; } .bg-yellow-900 { --bg-opacity: 1 !important; background-color: #633112 !important; background-color: rgba(99, 49, 18, var(--bg-opacity)) !important; } .bg-yellow { --bg-opacity: 1 !important; background-color: #C27803 !important; background-color: rgba(194, 120, 3, var(--bg-opacity)) !important; } .bg-green-50 { --bg-opacity: 1 !important; background-color: #F3FAF7 !important; background-color: rgba(243, 250, 247, var(--bg-opacity)) !important; } .bg-green-100 { --bg-opacity: 1 !important; background-color: #DEF7EC !important; background-color: rgba(222, 247, 236, var(--bg-opacity)) !important; } .bg-green-200 { --bg-opacity: 1 !important; background-color: #BCF0DA !important; background-color: rgba(188, 240, 218, var(--bg-opacity)) !important; } .bg-green-300 { --bg-opacity: 1 !important; background-color: #84E1BC !important; background-color: rgba(132, 225, 188, var(--bg-opacity)) !important; } .bg-green-400 { --bg-opacity: 1 !important; background-color: #31C48D !important; background-color: rgba(49, 196, 141, var(--bg-opacity)) !important; } .bg-green-500 { --bg-opacity: 1 !important; background-color: #0E9F6E !important; background-color: rgba(14, 159, 110, var(--bg-opacity)) !important; } .bg-green-600 { --bg-opacity: 1 !important; background-color: #057A55 !important; background-color: rgba(5, 122, 85, var(--bg-opacity)) !important; } .bg-green-700 { --bg-opacity: 1 !important; background-color: #046C4E !important; background-color: rgba(4, 108, 78, var(--bg-opacity)) !important; } .bg-green-800 { --bg-opacity: 1 !important; background-color: #03543F !important; background-color: rgba(3, 84, 63, var(--bg-opacity)) !important; } .bg-green-900 { --bg-opacity: 1 !important; background-color: #014737 !important; background-color: rgba(1, 71, 55, var(--bg-opacity)) !important; } .bg-green { --bg-opacity: 1 !important; background-color: #0E9F6E !important; background-color: rgba(14, 159, 110, var(--bg-opacity)) !important; } .bg-teal-50 { --bg-opacity: 1 !important; background-color: #EDFAFA !important; background-color: rgba(237, 250, 250, var(--bg-opacity)) !important; } .bg-teal-100 { --bg-opacity: 1 !important; background-color: #D5F5F6 !important; background-color: rgba(213, 245, 246, var(--bg-opacity)) !important; } .bg-teal-200 { --bg-opacity: 1 !important; background-color: #AFECEF !important; background-color: rgba(175, 236, 239, var(--bg-opacity)) !important; } .bg-teal-300 { --bg-opacity: 1 !important; background-color: #7EDCE2 !important; background-color: rgba(126, 220, 226, var(--bg-opacity)) !important; } .bg-teal-400 { --bg-opacity: 1 !important; background-color: #16BDCA !important; background-color: rgba(22, 189, 202, var(--bg-opacity)) !important; } .bg-teal-500 { --bg-opacity: 1 !important; background-color: #0694A2 !important; background-color: rgba(6, 148, 162, var(--bg-opacity)) !important; } .bg-teal-600 { --bg-opacity: 1 !important; background-color: #047481 !important; background-color: rgba(4, 116, 129, var(--bg-opacity)) !important; } .bg-teal-700 { --bg-opacity: 1 !important; background-color: #036672 !important; background-color: rgba(3, 102, 114, var(--bg-opacity)) !important; } .bg-teal-800 { --bg-opacity: 1 !important; background-color: #05505C !important; background-color: rgba(5, 80, 92, var(--bg-opacity)) !important; } .bg-teal-900 { --bg-opacity: 1 !important; background-color: #014451 !important; background-color: rgba(1, 68, 81, var(--bg-opacity)) !important; } .bg-teal { --bg-opacity: 1 !important; background-color: #0694A2 !important; background-color: rgba(6, 148, 162, var(--bg-opacity)) !important; } .bg-blue-50 { --bg-opacity: 1 !important; background-color: #EBF5FF !important; background-color: rgba(235, 245, 255, var(--bg-opacity)) !important; } .bg-blue-100 { --bg-opacity: 1 !important; background-color: #E1EFFE !important; background-color: rgba(225, 239, 254, var(--bg-opacity)) !important; } .bg-blue-200 { --bg-opacity: 1 !important; background-color: #C3DDFD !important; background-color: rgba(195, 221, 253, var(--bg-opacity)) !important; } .bg-blue-300 { --bg-opacity: 1 !important; background-color: #A4CAFE !important; background-color: rgba(164, 202, 254, var(--bg-opacity)) !important; } .bg-blue-400 { --bg-opacity: 1 !important; background-color: #76A9FA !important; background-color: rgba(118, 169, 250, var(--bg-opacity)) !important; } .bg-blue-500 { --bg-opacity: 1 !important; background-color: #3F83F8 !important; background-color: rgba(63, 131, 248, var(--bg-opacity)) !important; } .bg-blue-600 { --bg-opacity: 1 !important; background-color: #1C64F2 !important; background-color: rgba(28, 100, 242, var(--bg-opacity)) !important; } .bg-blue-700 { --bg-opacity: 1 !important; background-color: #1A56DB !important; background-color: rgba(26, 86, 219, var(--bg-opacity)) !important; } .bg-blue-800 { --bg-opacity: 1 !important; background-color: #1E429F !important; background-color: rgba(30, 66, 159, var(--bg-opacity)) !important; } .bg-blue-900 { --bg-opacity: 1 !important; background-color: #233876 !important; background-color: rgba(35, 56, 118, var(--bg-opacity)) !important; } .bg-blue { --bg-opacity: 1 !important; background-color: #3F83F8 !important; background-color: rgba(63, 131, 248, var(--bg-opacity)) !important; } .bg-indigo-50 { --bg-opacity: 1 !important; background-color: #F0F5FF !important; background-color: rgba(240, 245, 255, var(--bg-opacity)) !important; } .bg-indigo-100 { --bg-opacity: 1 !important; background-color: #E5EDFF !important; background-color: rgba(229, 237, 255, var(--bg-opacity)) !important; } .bg-indigo-200 { --bg-opacity: 1 !important; background-color: #CDDBFE !important; background-color: rgba(205, 219, 254, var(--bg-opacity)) !important; } .bg-indigo-300 { --bg-opacity: 1 !important; background-color: #B4C6FC !important; background-color: rgba(180, 198, 252, var(--bg-opacity)) !important; } .bg-indigo-400 { --bg-opacity: 1 !important; background-color: #8DA2FB !important; background-color: rgba(141, 162, 251, var(--bg-opacity)) !important; } .bg-indigo-500 { --bg-opacity: 1 !important; background-color: #6875F5 !important; background-color: rgba(104, 117, 245, var(--bg-opacity)) !important; } .bg-indigo-600 { --bg-opacity: 1 !important; background-color: #5850EC !important; background-color: rgba(88, 80, 236, var(--bg-opacity)) !important; } .bg-indigo-700 { --bg-opacity: 1 !important; background-color: #5145CD !important; background-color: rgba(81, 69, 205, var(--bg-opacity)) !important; } .bg-indigo-800 { --bg-opacity: 1 !important; background-color: #42389D !important; background-color: rgba(66, 56, 157, var(--bg-opacity)) !important; } .bg-indigo-900 { --bg-opacity: 1 !important; background-color: #362F78 !important; background-color: rgba(54, 47, 120, var(--bg-opacity)) !important; } .bg-indigo { --bg-opacity: 1 !important; background-color: #6875F5 !important; background-color: rgba(104, 117, 245, var(--bg-opacity)) !important; } .bg-purple-50 { --bg-opacity: 1 !important; background-color: #F6F5FF !important; background-color: rgba(246, 245, 255, var(--bg-opacity)) !important; } .bg-purple-100 { --bg-opacity: 1 !important; background-color: #EDEBFE !important; background-color: rgba(237, 235, 254, var(--bg-opacity)) !important; } .bg-purple-200 { --bg-opacity: 1 !important; background-color: #DCD7FE !important; background-color: rgba(220, 215, 254, var(--bg-opacity)) !important; } .bg-purple-300 { --bg-opacity: 1 !important; background-color: #CABFFD !important; background-color: rgba(202, 191, 253, var(--bg-opacity)) !important; } .bg-purple-400 { --bg-opacity: 1 !important; background-color: #AC94FA !important; background-color: rgba(172, 148, 250, var(--bg-opacity)) !important; } .bg-purple-500 { --bg-opacity: 1 !important; background-color: #9061F9 !important; background-color: rgba(144, 97, 249, var(--bg-opacity)) !important; } .bg-purple-600 { --bg-opacity: 1 !important; background-color: #7E3AF2 !important; background-color: rgba(126, 58, 242, var(--bg-opacity)) !important; } .bg-purple-700 { --bg-opacity: 1 !important; background-color: #6C2BD9 !important; background-color: rgba(108, 43, 217, var(--bg-opacity)) !important; } .bg-purple-800 { --bg-opacity: 1 !important; background-color: #5521B5 !important; background-color: rgba(85, 33, 181, var(--bg-opacity)) !important; } .bg-purple-900 { --bg-opacity: 1 !important; background-color: #4A1D96 !important; background-color: rgba(74, 29, 150, var(--bg-opacity)) !important; } .bg-purple { --bg-opacity: 1 !important; background-color: #9061F9 !important; background-color: rgba(144, 97, 249, var(--bg-opacity)) !important; } .bg-pink-50 { --bg-opacity: 1 !important; background-color: #FDF2F8 !important; background-color: rgba(253, 242, 248, var(--bg-opacity)) !important; } .bg-pink-100 { --bg-opacity: 1 !important; background-color: #FCE8F3 !important; background-color: rgba(252, 232, 243, var(--bg-opacity)) !important; } .bg-pink-200 { --bg-opacity: 1 !important; background-color: #FAD1E8 !important; background-color: rgba(250, 209, 232, var(--bg-opacity)) !important; } .bg-pink-300 { --bg-opacity: 1 !important; background-color: #F8B4D9 !important; background-color: rgba(248, 180, 217, var(--bg-opacity)) !important; } .bg-pink-400 { --bg-opacity: 1 !important; background-color: #F17EB8 !important; background-color: rgba(241, 126, 184, var(--bg-opacity)) !important; } .bg-pink-500 { --bg-opacity: 1 !important; background-color: #E74694 !important; background-color: rgba(231, 70, 148, var(--bg-opacity)) !important; } .bg-pink-600 { --bg-opacity: 1 !important; background-color: #D61F69 !important; background-color: rgba(214, 31, 105, var(--bg-opacity)) !important; } .bg-pink-700 { --bg-opacity: 1 !important; background-color: #BF125D !important; background-color: rgba(191, 18, 93, var(--bg-opacity)) !important; } .bg-pink-800 { --bg-opacity: 1 !important; background-color: #99154B !important; background-color: rgba(153, 21, 75, var(--bg-opacity)) !important; } .bg-pink-900 { --bg-opacity: 1 !important; background-color: #751A3D !important; background-color: rgba(117, 26, 61, var(--bg-opacity)) !important; } .bg-pink { --bg-opacity: 1 !important; background-color: #E74694 !important; background-color: rgba(231, 70, 148, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-current, [class*="theme-dark"] .dark\:bg-current, [class*="theme-light"].light\:bg-current, [class*="theme-light"] .light\:bg-current { background-color: currentColor !important; } [class*="theme-dark"].dark\:bg-transparent, [class*="theme-dark"] .dark\:bg-transparent, [class*="theme-light"].light\:bg-transparent, [class*="theme-light"] .light\:bg-transparent { background-color: transparent !important; } [class*="theme-dark"].dark\:bg-white, [class*="theme-dark"] .dark\:bg-white, [class*="theme-light"].light\:bg-white, [class*="theme-light"] .light\:bg-white { --bg-opacity: 1 !important; background-color: #FFFFFF !important; background-color: rgba(255, 255, 255, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-black, [class*="theme-dark"] .dark\:bg-black, [class*="theme-light"].light\:bg-black, [class*="theme-light"] .light\:bg-black { --bg-opacity: 1 !important; background-color: #000000 !important; background-color: rgba(0, 0, 0, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-gray-50, [class*="theme-dark"] .dark\:bg-gray-50, [class*="theme-light"].light\:bg-gray-50, [class*="theme-light"] .light\:bg-gray-50 { --bg-opacity: 1 !important; background-color: #F9FAFB !important; background-color: rgba(249, 250, 251, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-gray-100, [class*="theme-dark"] .dark\:bg-gray-100, [class*="theme-light"].light\:bg-gray-100, [class*="theme-light"] .light\:bg-gray-100 { --bg-opacity: 1 !important; background-color: #F4F5F7 !important; background-color: rgba(244, 245, 247, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-gray-200, [class*="theme-dark"] .dark\:bg-gray-200, [class*="theme-light"].light\:bg-gray-200, [class*="theme-light"] .light\:bg-gray-200 { --bg-opacity: 1 !important; background-color: #E5E7EB !important; background-color: rgba(229, 231, 235, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-gray-300, [class*="theme-dark"] .dark\:bg-gray-300, [class*="theme-light"].light\:bg-gray-300, [class*="theme-light"] .light\:bg-gray-300 { --bg-opacity: 1 !important; background-color: #D2D6DC !important; background-color: rgba(210, 214, 220, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-gray-400, [class*="theme-dark"] .dark\:bg-gray-400, [class*="theme-light"].light\:bg-gray-400, [class*="theme-light"] .light\:bg-gray-400 { --bg-opacity: 1 !important; background-color: #9FA6B2 !important; background-color: rgba(159, 166, 178, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-gray-500, [class*="theme-dark"] .dark\:bg-gray-500, [class*="theme-light"].light\:bg-gray-500, [class*="theme-light"] .light\:bg-gray-500 { --bg-opacity: 1 !important; background-color: #6B7280 !important; background-color: rgba(107, 114, 128, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-gray-600, [class*="theme-dark"] .dark\:bg-gray-600, [class*="theme-light"].light\:bg-gray-600, [class*="theme-light"] .light\:bg-gray-600 { --bg-opacity: 1 !important; background-color: #4B5563 !important; background-color: rgba(75, 85, 99, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-gray-700, [class*="theme-dark"] .dark\:bg-gray-700, [class*="theme-light"].light\:bg-gray-700, [class*="theme-light"] .light\:bg-gray-700 { --bg-opacity: 1 !important; background-color: #374151 !important; background-color: rgba(55, 65, 81, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-gray-800, [class*="theme-dark"] .dark\:bg-gray-800, [class*="theme-light"].light\:bg-gray-800, [class*="theme-light"] .light\:bg-gray-800 { --bg-opacity: 1 !important; background-color: #252F3F !important; background-color: rgba(37, 47, 63, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-gray-900, [class*="theme-dark"] .dark\:bg-gray-900, [class*="theme-light"].light\:bg-gray-900, [class*="theme-light"] .light\:bg-gray-900 { --bg-opacity: 1 !important; background-color: #161E2E !important; background-color: rgba(22, 30, 46, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-gray, [class*="theme-dark"] .dark\:bg-gray, [class*="theme-light"].light\:bg-gray, [class*="theme-light"] .light\:bg-gray { --bg-opacity: 1 !important; background-color: #6B7280 !important; background-color: rgba(107, 114, 128, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-cool-gray-50, [class*="theme-dark"] .dark\:bg-cool-gray-50, [class*="theme-light"].light\:bg-cool-gray-50, [class*="theme-light"] .light\:bg-cool-gray-50 { --bg-opacity: 1 !important; background-color: #FBFDFE !important; background-color: rgba(251, 253, 254, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-cool-gray-100, [class*="theme-dark"] .dark\:bg-cool-gray-100, [class*="theme-light"].light\:bg-cool-gray-100, [class*="theme-light"] .light\:bg-cool-gray-100 { --bg-opacity: 1 !important; background-color: #F1F5F9 !important; background-color: rgba(241, 245, 249, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-cool-gray-200, [class*="theme-dark"] .dark\:bg-cool-gray-200, [class*="theme-light"].light\:bg-cool-gray-200, [class*="theme-light"] .light\:bg-cool-gray-200 { --bg-opacity: 1 !important; background-color: #E2E8F0 !important; background-color: rgba(226, 232, 240, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-cool-gray-300, [class*="theme-dark"] .dark\:bg-cool-gray-300, [class*="theme-light"].light\:bg-cool-gray-300, [class*="theme-light"] .light\:bg-cool-gray-300 { --bg-opacity: 1 !important; background-color: #CFD8E3 !important; background-color: rgba(207, 216, 227, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-cool-gray-400, [class*="theme-dark"] .dark\:bg-cool-gray-400, [class*="theme-light"].light\:bg-cool-gray-400, [class*="theme-light"] .light\:bg-cool-gray-400 { --bg-opacity: 1 !important; background-color: #97A6BA !important; background-color: rgba(151, 166, 186, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-cool-gray-500, [class*="theme-dark"] .dark\:bg-cool-gray-500, [class*="theme-light"].light\:bg-cool-gray-500, [class*="theme-light"] .light\:bg-cool-gray-500 { --bg-opacity: 1 !important; background-color: #64748B !important; background-color: rgba(100, 116, 139, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-cool-gray-600, [class*="theme-dark"] .dark\:bg-cool-gray-600, [class*="theme-light"].light\:bg-cool-gray-600, [class*="theme-light"] .light\:bg-cool-gray-600 { --bg-opacity: 1 !important; background-color: #475569 !important; background-color: rgba(71, 85, 105, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-cool-gray-700, [class*="theme-dark"] .dark\:bg-cool-gray-700, [class*="theme-light"].light\:bg-cool-gray-700, [class*="theme-light"] .light\:bg-cool-gray-700 { --bg-opacity: 1 !important; background-color: #364152 !important; background-color: rgba(54, 65, 82, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-cool-gray-800, [class*="theme-dark"] .dark\:bg-cool-gray-800, [class*="theme-light"].light\:bg-cool-gray-800, [class*="theme-light"] .light\:bg-cool-gray-800 { --bg-opacity: 1 !important; background-color: #27303F !important; background-color: rgba(39, 48, 63, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-cool-gray-900, [class*="theme-dark"] .dark\:bg-cool-gray-900, [class*="theme-light"].light\:bg-cool-gray-900, [class*="theme-light"] .light\:bg-cool-gray-900 { --bg-opacity: 1 !important; background-color: #1A202E !important; background-color: rgba(26, 32, 46, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-cool-gray, [class*="theme-dark"] .dark\:bg-cool-gray, [class*="theme-light"].light\:bg-cool-gray, [class*="theme-light"] .light\:bg-cool-gray { --bg-opacity: 1 !important; background-color: #64748B !important; background-color: rgba(100, 116, 139, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-red-50, [class*="theme-dark"] .dark\:bg-red-50, [class*="theme-light"].light\:bg-red-50, [class*="theme-light"] .light\:bg-red-50 { --bg-opacity: 1 !important; background-color: #FDF2F2 !important; background-color: rgba(253, 242, 242, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-red-100, [class*="theme-dark"] .dark\:bg-red-100, [class*="theme-light"].light\:bg-red-100, [class*="theme-light"] .light\:bg-red-100 { --bg-opacity: 1 !important; background-color: #FDE8E8 !important; background-color: rgba(253, 232, 232, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-red-200, [class*="theme-dark"] .dark\:bg-red-200, [class*="theme-light"].light\:bg-red-200, [class*="theme-light"] .light\:bg-red-200 { --bg-opacity: 1 !important; background-color: #FBD5D5 !important; background-color: rgba(251, 213, 213, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-red-300, [class*="theme-dark"] .dark\:bg-red-300, [class*="theme-light"].light\:bg-red-300, [class*="theme-light"] .light\:bg-red-300 { --bg-opacity: 1 !important; background-color: #F8B4B4 !important; background-color: rgba(248, 180, 180, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-red-400, [class*="theme-dark"] .dark\:bg-red-400, [class*="theme-light"].light\:bg-red-400, [class*="theme-light"] .light\:bg-red-400 { --bg-opacity: 1 !important; background-color: #F98080 !important; background-color: rgba(249, 128, 128, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-red-500, [class*="theme-dark"] .dark\:bg-red-500, [class*="theme-light"].light\:bg-red-500, [class*="theme-light"] .light\:bg-red-500 { --bg-opacity: 1 !important; background-color: #F05252 !important; background-color: rgba(240, 82, 82, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-red-600, [class*="theme-dark"] .dark\:bg-red-600, [class*="theme-light"].light\:bg-red-600, [class*="theme-light"] .light\:bg-red-600 { --bg-opacity: 1 !important; background-color: #E02424 !important; background-color: rgba(224, 36, 36, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-red-700, [class*="theme-dark"] .dark\:bg-red-700, [class*="theme-light"].light\:bg-red-700, [class*="theme-light"] .light\:bg-red-700 { --bg-opacity: 1 !important; background-color: #C81E1E !important; background-color: rgba(200, 30, 30, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-red-800, [class*="theme-dark"] .dark\:bg-red-800, [class*="theme-light"].light\:bg-red-800, [class*="theme-light"] .light\:bg-red-800 { --bg-opacity: 1 !important; background-color: #9B1C1C !important; background-color: rgba(155, 28, 28, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-red-900, [class*="theme-dark"] .dark\:bg-red-900, [class*="theme-light"].light\:bg-red-900, [class*="theme-light"] .light\:bg-red-900 { --bg-opacity: 1 !important; background-color: #771D1D !important; background-color: rgba(119, 29, 29, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-red, [class*="theme-dark"] .dark\:bg-red, [class*="theme-light"].light\:bg-red, [class*="theme-light"] .light\:bg-red { --bg-opacity: 1 !important; background-color: #F05252 !important; background-color: rgba(240, 82, 82, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-orange-50, [class*="theme-dark"] .dark\:bg-orange-50, [class*="theme-light"].light\:bg-orange-50, [class*="theme-light"] .light\:bg-orange-50 { --bg-opacity: 1 !important; background-color: #FFF8F1 !important; background-color: rgba(255, 248, 241, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-orange-100, [class*="theme-dark"] .dark\:bg-orange-100, [class*="theme-light"].light\:bg-orange-100, [class*="theme-light"] .light\:bg-orange-100 { --bg-opacity: 1 !important; background-color: #FEECDC !important; background-color: rgba(254, 236, 220, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-orange-200, [class*="theme-dark"] .dark\:bg-orange-200, [class*="theme-light"].light\:bg-orange-200, [class*="theme-light"] .light\:bg-orange-200 { --bg-opacity: 1 !important; background-color: #FCD9BD !important; background-color: rgba(252, 217, 189, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-orange-300, [class*="theme-dark"] .dark\:bg-orange-300, [class*="theme-light"].light\:bg-orange-300, [class*="theme-light"] .light\:bg-orange-300 { --bg-opacity: 1 !important; background-color: #FDBA8C !important; background-color: rgba(253, 186, 140, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-orange-400, [class*="theme-dark"] .dark\:bg-orange-400, [class*="theme-light"].light\:bg-orange-400, [class*="theme-light"] .light\:bg-orange-400 { --bg-opacity: 1 !important; background-color: #FF8A4C !important; background-color: rgba(255, 138, 76, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-orange-500, [class*="theme-dark"] .dark\:bg-orange-500, [class*="theme-light"].light\:bg-orange-500, [class*="theme-light"] .light\:bg-orange-500 { --bg-opacity: 1 !important; background-color: #FF5A1F !important; background-color: rgba(255, 90, 31, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-orange-600, [class*="theme-dark"] .dark\:bg-orange-600, [class*="theme-light"].light\:bg-orange-600, [class*="theme-light"] .light\:bg-orange-600 { --bg-opacity: 1 !important; background-color: #D03801 !important; background-color: rgba(208, 56, 1, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-orange-700, [class*="theme-dark"] .dark\:bg-orange-700, [class*="theme-light"].light\:bg-orange-700, [class*="theme-light"] .light\:bg-orange-700 { --bg-opacity: 1 !important; background-color: #B43403 !important; background-color: rgba(180, 52, 3, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-orange-800, [class*="theme-dark"] .dark\:bg-orange-800, [class*="theme-light"].light\:bg-orange-800, [class*="theme-light"] .light\:bg-orange-800 { --bg-opacity: 1 !important; background-color: #8A2C0D !important; background-color: rgba(138, 44, 13, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-orange-900, [class*="theme-dark"] .dark\:bg-orange-900, [class*="theme-light"].light\:bg-orange-900, [class*="theme-light"] .light\:bg-orange-900 { --bg-opacity: 1 !important; background-color: #771D1D !important; background-color: rgba(119, 29, 29, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-orange, [class*="theme-dark"] .dark\:bg-orange, [class*="theme-light"].light\:bg-orange, [class*="theme-light"] .light\:bg-orange { --bg-opacity: 1 !important; background-color: #FF5A1F !important; background-color: rgba(255, 90, 31, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-yellow-50, [class*="theme-dark"] .dark\:bg-yellow-50, [class*="theme-light"].light\:bg-yellow-50, [class*="theme-light"] .light\:bg-yellow-50 { --bg-opacity: 1 !important; background-color: #FDFDEA !important; background-color: rgba(253, 253, 234, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-yellow-100, [class*="theme-dark"] .dark\:bg-yellow-100, [class*="theme-light"].light\:bg-yellow-100, [class*="theme-light"] .light\:bg-yellow-100 { --bg-opacity: 1 !important; background-color: #FDF6B2 !important; background-color: rgba(253, 246, 178, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-yellow-200, [class*="theme-dark"] .dark\:bg-yellow-200, [class*="theme-light"].light\:bg-yellow-200, [class*="theme-light"] .light\:bg-yellow-200 { --bg-opacity: 1 !important; background-color: #FCE96A !important; background-color: rgba(252, 233, 106, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-yellow-300, [class*="theme-dark"] .dark\:bg-yellow-300, [class*="theme-light"].light\:bg-yellow-300, [class*="theme-light"] .light\:bg-yellow-300 { --bg-opacity: 1 !important; background-color: #FACA15 !important; background-color: rgba(250, 202, 21, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-yellow-400, [class*="theme-dark"] .dark\:bg-yellow-400, [class*="theme-light"].light\:bg-yellow-400, [class*="theme-light"] .light\:bg-yellow-400 { --bg-opacity: 1 !important; background-color: #E3A008 !important; background-color: rgba(227, 160, 8, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-yellow-500, [class*="theme-dark"] .dark\:bg-yellow-500, [class*="theme-light"].light\:bg-yellow-500, [class*="theme-light"] .light\:bg-yellow-500 { --bg-opacity: 1 !important; background-color: #C27803 !important; background-color: rgba(194, 120, 3, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-yellow-600, [class*="theme-dark"] .dark\:bg-yellow-600, [class*="theme-light"].light\:bg-yellow-600, [class*="theme-light"] .light\:bg-yellow-600 { --bg-opacity: 1 !important; background-color: #9F580A !important; background-color: rgba(159, 88, 10, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-yellow-700, [class*="theme-dark"] .dark\:bg-yellow-700, [class*="theme-light"].light\:bg-yellow-700, [class*="theme-light"] .light\:bg-yellow-700 { --bg-opacity: 1 !important; background-color: #8E4B10 !important; background-color: rgba(142, 75, 16, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-yellow-800, [class*="theme-dark"] .dark\:bg-yellow-800, [class*="theme-light"].light\:bg-yellow-800, [class*="theme-light"] .light\:bg-yellow-800 { --bg-opacity: 1 !important; background-color: #723B13 !important; background-color: rgba(114, 59, 19, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-yellow-900, [class*="theme-dark"] .dark\:bg-yellow-900, [class*="theme-light"].light\:bg-yellow-900, [class*="theme-light"] .light\:bg-yellow-900 { --bg-opacity: 1 !important; background-color: #633112 !important; background-color: rgba(99, 49, 18, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-yellow, [class*="theme-dark"] .dark\:bg-yellow, [class*="theme-light"].light\:bg-yellow, [class*="theme-light"] .light\:bg-yellow { --bg-opacity: 1 !important; background-color: #C27803 !important; background-color: rgba(194, 120, 3, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-green-50, [class*="theme-dark"] .dark\:bg-green-50, [class*="theme-light"].light\:bg-green-50, [class*="theme-light"] .light\:bg-green-50 { --bg-opacity: 1 !important; background-color: #F3FAF7 !important; background-color: rgba(243, 250, 247, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-green-100, [class*="theme-dark"] .dark\:bg-green-100, [class*="theme-light"].light\:bg-green-100, [class*="theme-light"] .light\:bg-green-100 { --bg-opacity: 1 !important; background-color: #DEF7EC !important; background-color: rgba(222, 247, 236, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-green-200, [class*="theme-dark"] .dark\:bg-green-200, [class*="theme-light"].light\:bg-green-200, [class*="theme-light"] .light\:bg-green-200 { --bg-opacity: 1 !important; background-color: #BCF0DA !important; background-color: rgba(188, 240, 218, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-green-300, [class*="theme-dark"] .dark\:bg-green-300, [class*="theme-light"].light\:bg-green-300, [class*="theme-light"] .light\:bg-green-300 { --bg-opacity: 1 !important; background-color: #84E1BC !important; background-color: rgba(132, 225, 188, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-green-400, [class*="theme-dark"] .dark\:bg-green-400, [class*="theme-light"].light\:bg-green-400, [class*="theme-light"] .light\:bg-green-400 { --bg-opacity: 1 !important; background-color: #31C48D !important; background-color: rgba(49, 196, 141, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-green-500, [class*="theme-dark"] .dark\:bg-green-500, [class*="theme-light"].light\:bg-green-500, [class*="theme-light"] .light\:bg-green-500 { --bg-opacity: 1 !important; background-color: #0E9F6E !important; background-color: rgba(14, 159, 110, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-green-600, [class*="theme-dark"] .dark\:bg-green-600, [class*="theme-light"].light\:bg-green-600, [class*="theme-light"] .light\:bg-green-600 { --bg-opacity: 1 !important; background-color: #057A55 !important; background-color: rgba(5, 122, 85, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-green-700, [class*="theme-dark"] .dark\:bg-green-700, [class*="theme-light"].light\:bg-green-700, [class*="theme-light"] .light\:bg-green-700 { --bg-opacity: 1 !important; background-color: #046C4E !important; background-color: rgba(4, 108, 78, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-green-800, [class*="theme-dark"] .dark\:bg-green-800, [class*="theme-light"].light\:bg-green-800, [class*="theme-light"] .light\:bg-green-800 { --bg-opacity: 1 !important; background-color: #03543F !important; background-color: rgba(3, 84, 63, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-green-900, [class*="theme-dark"] .dark\:bg-green-900, [class*="theme-light"].light\:bg-green-900, [class*="theme-light"] .light\:bg-green-900 { --bg-opacity: 1 !important; background-color: #014737 !important; background-color: rgba(1, 71, 55, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-green, [class*="theme-dark"] .dark\:bg-green, [class*="theme-light"].light\:bg-green, [class*="theme-light"] .light\:bg-green { --bg-opacity: 1 !important; background-color: #0E9F6E !important; background-color: rgba(14, 159, 110, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-teal-50, [class*="theme-dark"] .dark\:bg-teal-50, [class*="theme-light"].light\:bg-teal-50, [class*="theme-light"] .light\:bg-teal-50 { --bg-opacity: 1 !important; background-color: #EDFAFA !important; background-color: rgba(237, 250, 250, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-teal-100, [class*="theme-dark"] .dark\:bg-teal-100, [class*="theme-light"].light\:bg-teal-100, [class*="theme-light"] .light\:bg-teal-100 { --bg-opacity: 1 !important; background-color: #D5F5F6 !important; background-color: rgba(213, 245, 246, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-teal-200, [class*="theme-dark"] .dark\:bg-teal-200, [class*="theme-light"].light\:bg-teal-200, [class*="theme-light"] .light\:bg-teal-200 { --bg-opacity: 1 !important; background-color: #AFECEF !important; background-color: rgba(175, 236, 239, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-teal-300, [class*="theme-dark"] .dark\:bg-teal-300, [class*="theme-light"].light\:bg-teal-300, [class*="theme-light"] .light\:bg-teal-300 { --bg-opacity: 1 !important; background-color: #7EDCE2 !important; background-color: rgba(126, 220, 226, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-teal-400, [class*="theme-dark"] .dark\:bg-teal-400, [class*="theme-light"].light\:bg-teal-400, [class*="theme-light"] .light\:bg-teal-400 { --bg-opacity: 1 !important; background-color: #16BDCA !important; background-color: rgba(22, 189, 202, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-teal-500, [class*="theme-dark"] .dark\:bg-teal-500, [class*="theme-light"].light\:bg-teal-500, [class*="theme-light"] .light\:bg-teal-500 { --bg-opacity: 1 !important; background-color: #0694A2 !important; background-color: rgba(6, 148, 162, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-teal-600, [class*="theme-dark"] .dark\:bg-teal-600, [class*="theme-light"].light\:bg-teal-600, [class*="theme-light"] .light\:bg-teal-600 { --bg-opacity: 1 !important; background-color: #047481 !important; background-color: rgba(4, 116, 129, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-teal-700, [class*="theme-dark"] .dark\:bg-teal-700, [class*="theme-light"].light\:bg-teal-700, [class*="theme-light"] .light\:bg-teal-700 { --bg-opacity: 1 !important; background-color: #036672 !important; background-color: rgba(3, 102, 114, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-teal-800, [class*="theme-dark"] .dark\:bg-teal-800, [class*="theme-light"].light\:bg-teal-800, [class*="theme-light"] .light\:bg-teal-800 { --bg-opacity: 1 !important; background-color: #05505C !important; background-color: rgba(5, 80, 92, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-teal-900, [class*="theme-dark"] .dark\:bg-teal-900, [class*="theme-light"].light\:bg-teal-900, [class*="theme-light"] .light\:bg-teal-900 { --bg-opacity: 1 !important; background-color: #014451 !important; background-color: rgba(1, 68, 81, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-teal, [class*="theme-dark"] .dark\:bg-teal, [class*="theme-light"].light\:bg-teal, [class*="theme-light"] .light\:bg-teal { --bg-opacity: 1 !important; background-color: #0694A2 !important; background-color: rgba(6, 148, 162, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-blue-50, [class*="theme-dark"] .dark\:bg-blue-50, [class*="theme-light"].light\:bg-blue-50, [class*="theme-light"] .light\:bg-blue-50 { --bg-opacity: 1 !important; background-color: #EBF5FF !important; background-color: rgba(235, 245, 255, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-blue-100, [class*="theme-dark"] .dark\:bg-blue-100, [class*="theme-light"].light\:bg-blue-100, [class*="theme-light"] .light\:bg-blue-100 { --bg-opacity: 1 !important; background-color: #E1EFFE !important; background-color: rgba(225, 239, 254, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-blue-200, [class*="theme-dark"] .dark\:bg-blue-200, [class*="theme-light"].light\:bg-blue-200, [class*="theme-light"] .light\:bg-blue-200 { --bg-opacity: 1 !important; background-color: #C3DDFD !important; background-color: rgba(195, 221, 253, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-blue-300, [class*="theme-dark"] .dark\:bg-blue-300, [class*="theme-light"].light\:bg-blue-300, [class*="theme-light"] .light\:bg-blue-300 { --bg-opacity: 1 !important; background-color: #A4CAFE !important; background-color: rgba(164, 202, 254, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-blue-400, [class*="theme-dark"] .dark\:bg-blue-400, [class*="theme-light"].light\:bg-blue-400, [class*="theme-light"] .light\:bg-blue-400 { --bg-opacity: 1 !important; background-color: #76A9FA !important; background-color: rgba(118, 169, 250, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-blue-500, [class*="theme-dark"] .dark\:bg-blue-500, [class*="theme-light"].light\:bg-blue-500, [class*="theme-light"] .light\:bg-blue-500 { --bg-opacity: 1 !important; background-color: #3F83F8 !important; background-color: rgba(63, 131, 248, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-blue-600, [class*="theme-dark"] .dark\:bg-blue-600, [class*="theme-light"].light\:bg-blue-600, [class*="theme-light"] .light\:bg-blue-600 { --bg-opacity: 1 !important; background-color: #1C64F2 !important; background-color: rgba(28, 100, 242, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-blue-700, [class*="theme-dark"] .dark\:bg-blue-700, [class*="theme-light"].light\:bg-blue-700, [class*="theme-light"] .light\:bg-blue-700 { --bg-opacity: 1 !important; background-color: #1A56DB !important; background-color: rgba(26, 86, 219, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-blue-800, [class*="theme-dark"] .dark\:bg-blue-800, [class*="theme-light"].light\:bg-blue-800, [class*="theme-light"] .light\:bg-blue-800 { --bg-opacity: 1 !important; background-color: #1E429F !important; background-color: rgba(30, 66, 159, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-blue-900, [class*="theme-dark"] .dark\:bg-blue-900, [class*="theme-light"].light\:bg-blue-900, [class*="theme-light"] .light\:bg-blue-900 { --bg-opacity: 1 !important; background-color: #233876 !important; background-color: rgba(35, 56, 118, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-blue, [class*="theme-dark"] .dark\:bg-blue, [class*="theme-light"].light\:bg-blue, [class*="theme-light"] .light\:bg-blue { --bg-opacity: 1 !important; background-color: #3F83F8 !important; background-color: rgba(63, 131, 248, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-indigo-50, [class*="theme-dark"] .dark\:bg-indigo-50, [class*="theme-light"].light\:bg-indigo-50, [class*="theme-light"] .light\:bg-indigo-50 { --bg-opacity: 1 !important; background-color: #F0F5FF !important; background-color: rgba(240, 245, 255, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-indigo-100, [class*="theme-dark"] .dark\:bg-indigo-100, [class*="theme-light"].light\:bg-indigo-100, [class*="theme-light"] .light\:bg-indigo-100 { --bg-opacity: 1 !important; background-color: #E5EDFF !important; background-color: rgba(229, 237, 255, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-indigo-200, [class*="theme-dark"] .dark\:bg-indigo-200, [class*="theme-light"].light\:bg-indigo-200, [class*="theme-light"] .light\:bg-indigo-200 { --bg-opacity: 1 !important; background-color: #CDDBFE !important; background-color: rgba(205, 219, 254, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-indigo-300, [class*="theme-dark"] .dark\:bg-indigo-300, [class*="theme-light"].light\:bg-indigo-300, [class*="theme-light"] .light\:bg-indigo-300 { --bg-opacity: 1 !important; background-color: #B4C6FC !important; background-color: rgba(180, 198, 252, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-indigo-400, [class*="theme-dark"] .dark\:bg-indigo-400, [class*="theme-light"].light\:bg-indigo-400, [class*="theme-light"] .light\:bg-indigo-400 { --bg-opacity: 1 !important; background-color: #8DA2FB !important; background-color: rgba(141, 162, 251, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-indigo-500, [class*="theme-dark"] .dark\:bg-indigo-500, [class*="theme-light"].light\:bg-indigo-500, [class*="theme-light"] .light\:bg-indigo-500 { --bg-opacity: 1 !important; background-color: #6875F5 !important; background-color: rgba(104, 117, 245, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-indigo-600, [class*="theme-dark"] .dark\:bg-indigo-600, [class*="theme-light"].light\:bg-indigo-600, [class*="theme-light"] .light\:bg-indigo-600 { --bg-opacity: 1 !important; background-color: #5850EC !important; background-color: rgba(88, 80, 236, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-indigo-700, [class*="theme-dark"] .dark\:bg-indigo-700, [class*="theme-light"].light\:bg-indigo-700, [class*="theme-light"] .light\:bg-indigo-700 { --bg-opacity: 1 !important; background-color: #5145CD !important; background-color: rgba(81, 69, 205, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-indigo-800, [class*="theme-dark"] .dark\:bg-indigo-800, [class*="theme-light"].light\:bg-indigo-800, [class*="theme-light"] .light\:bg-indigo-800 { --bg-opacity: 1 !important; background-color: #42389D !important; background-color: rgba(66, 56, 157, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-indigo-900, [class*="theme-dark"] .dark\:bg-indigo-900, [class*="theme-light"].light\:bg-indigo-900, [class*="theme-light"] .light\:bg-indigo-900 { --bg-opacity: 1 !important; background-color: #362F78 !important; background-color: rgba(54, 47, 120, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-indigo, [class*="theme-dark"] .dark\:bg-indigo, [class*="theme-light"].light\:bg-indigo, [class*="theme-light"] .light\:bg-indigo { --bg-opacity: 1 !important; background-color: #6875F5 !important; background-color: rgba(104, 117, 245, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-purple-50, [class*="theme-dark"] .dark\:bg-purple-50, [class*="theme-light"].light\:bg-purple-50, [class*="theme-light"] .light\:bg-purple-50 { --bg-opacity: 1 !important; background-color: #F6F5FF !important; background-color: rgba(246, 245, 255, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-purple-100, [class*="theme-dark"] .dark\:bg-purple-100, [class*="theme-light"].light\:bg-purple-100, [class*="theme-light"] .light\:bg-purple-100 { --bg-opacity: 1 !important; background-color: #EDEBFE !important; background-color: rgba(237, 235, 254, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-purple-200, [class*="theme-dark"] .dark\:bg-purple-200, [class*="theme-light"].light\:bg-purple-200, [class*="theme-light"] .light\:bg-purple-200 { --bg-opacity: 1 !important; background-color: #DCD7FE !important; background-color: rgba(220, 215, 254, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-purple-300, [class*="theme-dark"] .dark\:bg-purple-300, [class*="theme-light"].light\:bg-purple-300, [class*="theme-light"] .light\:bg-purple-300 { --bg-opacity: 1 !important; background-color: #CABFFD !important; background-color: rgba(202, 191, 253, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-purple-400, [class*="theme-dark"] .dark\:bg-purple-400, [class*="theme-light"].light\:bg-purple-400, [class*="theme-light"] .light\:bg-purple-400 { --bg-opacity: 1 !important; background-color: #AC94FA !important; background-color: rgba(172, 148, 250, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-purple-500, [class*="theme-dark"] .dark\:bg-purple-500, [class*="theme-light"].light\:bg-purple-500, [class*="theme-light"] .light\:bg-purple-500 { --bg-opacity: 1 !important; background-color: #9061F9 !important; background-color: rgba(144, 97, 249, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-purple-600, [class*="theme-dark"] .dark\:bg-purple-600, [class*="theme-light"].light\:bg-purple-600, [class*="theme-light"] .light\:bg-purple-600 { --bg-opacity: 1 !important; background-color: #7E3AF2 !important; background-color: rgba(126, 58, 242, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-purple-700, [class*="theme-dark"] .dark\:bg-purple-700, [class*="theme-light"].light\:bg-purple-700, [class*="theme-light"] .light\:bg-purple-700 { --bg-opacity: 1 !important; background-color: #6C2BD9 !important; background-color: rgba(108, 43, 217, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-purple-800, [class*="theme-dark"] .dark\:bg-purple-800, [class*="theme-light"].light\:bg-purple-800, [class*="theme-light"] .light\:bg-purple-800 { --bg-opacity: 1 !important; background-color: #5521B5 !important; background-color: rgba(85, 33, 181, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-purple-900, [class*="theme-dark"] .dark\:bg-purple-900, [class*="theme-light"].light\:bg-purple-900, [class*="theme-light"] .light\:bg-purple-900 { --bg-opacity: 1 !important; background-color: #4A1D96 !important; background-color: rgba(74, 29, 150, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-purple, [class*="theme-dark"] .dark\:bg-purple, [class*="theme-light"].light\:bg-purple, [class*="theme-light"] .light\:bg-purple { --bg-opacity: 1 !important; background-color: #9061F9 !important; background-color: rgba(144, 97, 249, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-pink-50, [class*="theme-dark"] .dark\:bg-pink-50, [class*="theme-light"].light\:bg-pink-50, [class*="theme-light"] .light\:bg-pink-50 { --bg-opacity: 1 !important; background-color: #FDF2F8 !important; background-color: rgba(253, 242, 248, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-pink-100, [class*="theme-dark"] .dark\:bg-pink-100, [class*="theme-light"].light\:bg-pink-100, [class*="theme-light"] .light\:bg-pink-100 { --bg-opacity: 1 !important; background-color: #FCE8F3 !important; background-color: rgba(252, 232, 243, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-pink-200, [class*="theme-dark"] .dark\:bg-pink-200, [class*="theme-light"].light\:bg-pink-200, [class*="theme-light"] .light\:bg-pink-200 { --bg-opacity: 1 !important; background-color: #FAD1E8 !important; background-color: rgba(250, 209, 232, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-pink-300, [class*="theme-dark"] .dark\:bg-pink-300, [class*="theme-light"].light\:bg-pink-300, [class*="theme-light"] .light\:bg-pink-300 { --bg-opacity: 1 !important; background-color: #F8B4D9 !important; background-color: rgba(248, 180, 217, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-pink-400, [class*="theme-dark"] .dark\:bg-pink-400, [class*="theme-light"].light\:bg-pink-400, [class*="theme-light"] .light\:bg-pink-400 { --bg-opacity: 1 !important; background-color: #F17EB8 !important; background-color: rgba(241, 126, 184, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-pink-500, [class*="theme-dark"] .dark\:bg-pink-500, [class*="theme-light"].light\:bg-pink-500, [class*="theme-light"] .light\:bg-pink-500 { --bg-opacity: 1 !important; background-color: #E74694 !important; background-color: rgba(231, 70, 148, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-pink-600, [class*="theme-dark"] .dark\:bg-pink-600, [class*="theme-light"].light\:bg-pink-600, [class*="theme-light"] .light\:bg-pink-600 { --bg-opacity: 1 !important; background-color: #D61F69 !important; background-color: rgba(214, 31, 105, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-pink-700, [class*="theme-dark"] .dark\:bg-pink-700, [class*="theme-light"].light\:bg-pink-700, [class*="theme-light"] .light\:bg-pink-700 { --bg-opacity: 1 !important; background-color: #BF125D !important; background-color: rgba(191, 18, 93, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-pink-800, [class*="theme-dark"] .dark\:bg-pink-800, [class*="theme-light"].light\:bg-pink-800, [class*="theme-light"] .light\:bg-pink-800 { --bg-opacity: 1 !important; background-color: #99154B !important; background-color: rgba(153, 21, 75, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-pink-900, [class*="theme-dark"] .dark\:bg-pink-900, [class*="theme-light"].light\:bg-pink-900, [class*="theme-light"] .light\:bg-pink-900 { --bg-opacity: 1 !important; background-color: #751A3D !important; background-color: rgba(117, 26, 61, var(--bg-opacity)) !important; } [class*="theme-dark"].dark\:bg-pink, [class*="theme-dark"] .dark\:bg-pink, [class*="theme-light"].light\:bg-pink, [class*="theme-light"] .light\:bg-pink { --bg-opacity: 1 !important; background-color: #E74694 !important; background-color: rgba(231, 70, 148, var(--bg-opacity)) !important; } .bg-opacity-0 { --bg-opacity: 0 !important; } .bg-opacity-12 { --bg-opacity: 0.12 !important; } .bg-opacity-25 { --bg-opacity: 0.25 !important; } .bg-opacity-38 { --bg-opacity: 0.38 !important; } .bg-opacity-50 { --bg-opacity: 0.5 !important; } .bg-opacity-54 { --bg-opacity: 0.54 !important; } .bg-opacity-70 { --bg-opacity: 0.70 !important; } .bg-opacity-75 { --bg-opacity: 0.75 !important; } .bg-opacity-84 { --bg-opacity: 0.84 !important; } .bg-opacity-100 { --bg-opacity: 1 !important; } .hover\:bg-opacity-0:hover { --bg-opacity: 0 !important; } .hover\:bg-opacity-12:hover { --bg-opacity: 0.12 !important; } .hover\:bg-opacity-25:hover { --bg-opacity: 0.25 !important; } .hover\:bg-opacity-38:hover { --bg-opacity: 0.38 !important; } .hover\:bg-opacity-50:hover { --bg-opacity: 0.5 !important; } .hover\:bg-opacity-54:hover { --bg-opacity: 0.54 !important; } .hover\:bg-opacity-70:hover { --bg-opacity: 0.70 !important; } .hover\:bg-opacity-75:hover { --bg-opacity: 0.75 !important; } .hover\:bg-opacity-84:hover { --bg-opacity: 0.84 !important; } .hover\:bg-opacity-100:hover { --bg-opacity: 1 !important; } .focus\:bg-opacity-0:focus { --bg-opacity: 0 !important; } .focus\:bg-opacity-12:focus { --bg-opacity: 0.12 !important; } .focus\:bg-opacity-25:focus { --bg-opacity: 0.25 !important; } .focus\:bg-opacity-38:focus { --bg-opacity: 0.38 !important; } .focus\:bg-opacity-50:focus { --bg-opacity: 0.5 !important; } .focus\:bg-opacity-54:focus { --bg-opacity: 0.54 !important; } .focus\:bg-opacity-70:focus { --bg-opacity: 0.70 !important; } .focus\:bg-opacity-75:focus { --bg-opacity: 0.75 !important; } .focus\:bg-opacity-84:focus { --bg-opacity: 0.84 !important; } .focus\:bg-opacity-100:focus { --bg-opacity: 1 !important; } .bg-bottom { background-position: bottom !important; } .bg-center { background-position: center !important; } .bg-left { background-position: left !important; } .bg-left-bottom { background-position: left bottom !important; } .bg-left-top { background-position: left top !important; } .bg-right { background-position: right !important; } .bg-right-bottom { background-position: right bottom !important; } .bg-right-top { background-position: right top !important; } .bg-top { background-position: top !important; } .bg-repeat { background-repeat: repeat !important; } .bg-no-repeat { background-repeat: no-repeat !important; } .bg-repeat-x { background-repeat: repeat-x !important; } .bg-repeat-y { background-repeat: repeat-y !important; } .bg-repeat-round { background-repeat: round !important; } .bg-repeat-space { background-repeat: space !important; } .bg-auto { background-size: auto !important; } .bg-cover { background-size: cover !important; } .bg-contain { background-size: contain !important; } .border-collapse { border-collapse: collapse !important; } .border-separate { border-collapse: separate !important; } .border-current { border-color: currentColor !important; } .border-transparent { border-color: transparent !important; } .border-white { --border-opacity: 1 !important; border-color: #FFFFFF !important; border-color: rgba(255, 255, 255, var(--border-opacity)) !important; } .border-black { --border-opacity: 1 !important; border-color: #000000 !important; border-color: rgba(0, 0, 0, var(--border-opacity)) !important; } .border-gray-50 { --border-opacity: 1 !important; border-color: #F9FAFB !important; border-color: rgba(249, 250, 251, var(--border-opacity)) !important; } .border-gray-100 { --border-opacity: 1 !important; border-color: #F4F5F7 !important; border-color: rgba(244, 245, 247, var(--border-opacity)) !important; } .border-gray-200 { --border-opacity: 1 !important; border-color: #E5E7EB !important; border-color: rgba(229, 231, 235, var(--border-opacity)) !important; } .border-gray-300 { --border-opacity: 1 !important; border-color: #D2D6DC !important; border-color: rgba(210, 214, 220, var(--border-opacity)) !important; } .border-gray-400 { --border-opacity: 1 !important; border-color: #9FA6B2 !important; border-color: rgba(159, 166, 178, var(--border-opacity)) !important; } .border-gray-500 { --border-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--border-opacity)) !important; } .border-gray-600 { --border-opacity: 1 !important; border-color: #4B5563 !important; border-color: rgba(75, 85, 99, var(--border-opacity)) !important; } .border-gray-700 { --border-opacity: 1 !important; border-color: #374151 !important; border-color: rgba(55, 65, 81, var(--border-opacity)) !important; } .border-gray-800 { --border-opacity: 1 !important; border-color: #252F3F !important; border-color: rgba(37, 47, 63, var(--border-opacity)) !important; } .border-gray-900 { --border-opacity: 1 !important; border-color: #161E2E !important; border-color: rgba(22, 30, 46, var(--border-opacity)) !important; } .border-gray { --border-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--border-opacity)) !important; } .border-cool-gray-50 { --border-opacity: 1 !important; border-color: #FBFDFE !important; border-color: rgba(251, 253, 254, var(--border-opacity)) !important; } .border-cool-gray-100 { --border-opacity: 1 !important; border-color: #F1F5F9 !important; border-color: rgba(241, 245, 249, var(--border-opacity)) !important; } .border-cool-gray-200 { --border-opacity: 1 !important; border-color: #E2E8F0 !important; border-color: rgba(226, 232, 240, var(--border-opacity)) !important; } .border-cool-gray-300 { --border-opacity: 1 !important; border-color: #CFD8E3 !important; border-color: rgba(207, 216, 227, var(--border-opacity)) !important; } .border-cool-gray-400 { --border-opacity: 1 !important; border-color: #97A6BA !important; border-color: rgba(151, 166, 186, var(--border-opacity)) !important; } .border-cool-gray-500 { --border-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--border-opacity)) !important; } .border-cool-gray-600 { --border-opacity: 1 !important; border-color: #475569 !important; border-color: rgba(71, 85, 105, var(--border-opacity)) !important; } .border-cool-gray-700 { --border-opacity: 1 !important; border-color: #364152 !important; border-color: rgba(54, 65, 82, var(--border-opacity)) !important; } .border-cool-gray-800 { --border-opacity: 1 !important; border-color: #27303F !important; border-color: rgba(39, 48, 63, var(--border-opacity)) !important; } .border-cool-gray-900 { --border-opacity: 1 !important; border-color: #1A202E !important; border-color: rgba(26, 32, 46, var(--border-opacity)) !important; } .border-cool-gray { --border-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--border-opacity)) !important; } .border-red-50 { --border-opacity: 1 !important; border-color: #FDF2F2 !important; border-color: rgba(253, 242, 242, var(--border-opacity)) !important; } .border-red-100 { --border-opacity: 1 !important; border-color: #FDE8E8 !important; border-color: rgba(253, 232, 232, var(--border-opacity)) !important; } .border-red-200 { --border-opacity: 1 !important; border-color: #FBD5D5 !important; border-color: rgba(251, 213, 213, var(--border-opacity)) !important; } .border-red-300 { --border-opacity: 1 !important; border-color: #F8B4B4 !important; border-color: rgba(248, 180, 180, var(--border-opacity)) !important; } .border-red-400 { --border-opacity: 1 !important; border-color: #F98080 !important; border-color: rgba(249, 128, 128, var(--border-opacity)) !important; } .border-red-500 { --border-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--border-opacity)) !important; } .border-red-600 { --border-opacity: 1 !important; border-color: #E02424 !important; border-color: rgba(224, 36, 36, var(--border-opacity)) !important; } .border-red-700 { --border-opacity: 1 !important; border-color: #C81E1E !important; border-color: rgba(200, 30, 30, var(--border-opacity)) !important; } .border-red-800 { --border-opacity: 1 !important; border-color: #9B1C1C !important; border-color: rgba(155, 28, 28, var(--border-opacity)) !important; } .border-red-900 { --border-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--border-opacity)) !important; } .border-red { --border-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--border-opacity)) !important; } .border-orange-50 { --border-opacity: 1 !important; border-color: #FFF8F1 !important; border-color: rgba(255, 248, 241, var(--border-opacity)) !important; } .border-orange-100 { --border-opacity: 1 !important; border-color: #FEECDC !important; border-color: rgba(254, 236, 220, var(--border-opacity)) !important; } .border-orange-200 { --border-opacity: 1 !important; border-color: #FCD9BD !important; border-color: rgba(252, 217, 189, var(--border-opacity)) !important; } .border-orange-300 { --border-opacity: 1 !important; border-color: #FDBA8C !important; border-color: rgba(253, 186, 140, var(--border-opacity)) !important; } .border-orange-400 { --border-opacity: 1 !important; border-color: #FF8A4C !important; border-color: rgba(255, 138, 76, var(--border-opacity)) !important; } .border-orange-500 { --border-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--border-opacity)) !important; } .border-orange-600 { --border-opacity: 1 !important; border-color: #D03801 !important; border-color: rgba(208, 56, 1, var(--border-opacity)) !important; } .border-orange-700 { --border-opacity: 1 !important; border-color: #B43403 !important; border-color: rgba(180, 52, 3, var(--border-opacity)) !important; } .border-orange-800 { --border-opacity: 1 !important; border-color: #8A2C0D !important; border-color: rgba(138, 44, 13, var(--border-opacity)) !important; } .border-orange-900 { --border-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--border-opacity)) !important; } .border-orange { --border-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--border-opacity)) !important; } .border-yellow-50 { --border-opacity: 1 !important; border-color: #FDFDEA !important; border-color: rgba(253, 253, 234, var(--border-opacity)) !important; } .border-yellow-100 { --border-opacity: 1 !important; border-color: #FDF6B2 !important; border-color: rgba(253, 246, 178, var(--border-opacity)) !important; } .border-yellow-200 { --border-opacity: 1 !important; border-color: #FCE96A !important; border-color: rgba(252, 233, 106, var(--border-opacity)) !important; } .border-yellow-300 { --border-opacity: 1 !important; border-color: #FACA15 !important; border-color: rgba(250, 202, 21, var(--border-opacity)) !important; } .border-yellow-400 { --border-opacity: 1 !important; border-color: #E3A008 !important; border-color: rgba(227, 160, 8, var(--border-opacity)) !important; } .border-yellow-500 { --border-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--border-opacity)) !important; } .border-yellow-600 { --border-opacity: 1 !important; border-color: #9F580A !important; border-color: rgba(159, 88, 10, var(--border-opacity)) !important; } .border-yellow-700 { --border-opacity: 1 !important; border-color: #8E4B10 !important; border-color: rgba(142, 75, 16, var(--border-opacity)) !important; } .border-yellow-800 { --border-opacity: 1 !important; border-color: #723B13 !important; border-color: rgba(114, 59, 19, var(--border-opacity)) !important; } .border-yellow-900 { --border-opacity: 1 !important; border-color: #633112 !important; border-color: rgba(99, 49, 18, var(--border-opacity)) !important; } .border-yellow { --border-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--border-opacity)) !important; } .border-green-50 { --border-opacity: 1 !important; border-color: #F3FAF7 !important; border-color: rgba(243, 250, 247, var(--border-opacity)) !important; } .border-green-100 { --border-opacity: 1 !important; border-color: #DEF7EC !important; border-color: rgba(222, 247, 236, var(--border-opacity)) !important; } .border-green-200 { --border-opacity: 1 !important; border-color: #BCF0DA !important; border-color: rgba(188, 240, 218, var(--border-opacity)) !important; } .border-green-300 { --border-opacity: 1 !important; border-color: #84E1BC !important; border-color: rgba(132, 225, 188, var(--border-opacity)) !important; } .border-green-400 { --border-opacity: 1 !important; border-color: #31C48D !important; border-color: rgba(49, 196, 141, var(--border-opacity)) !important; } .border-green-500 { --border-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--border-opacity)) !important; } .border-green-600 { --border-opacity: 1 !important; border-color: #057A55 !important; border-color: rgba(5, 122, 85, var(--border-opacity)) !important; } .border-green-700 { --border-opacity: 1 !important; border-color: #046C4E !important; border-color: rgba(4, 108, 78, var(--border-opacity)) !important; } .border-green-800 { --border-opacity: 1 !important; border-color: #03543F !important; border-color: rgba(3, 84, 63, var(--border-opacity)) !important; } .border-green-900 { --border-opacity: 1 !important; border-color: #014737 !important; border-color: rgba(1, 71, 55, var(--border-opacity)) !important; } .border-green { --border-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--border-opacity)) !important; } .border-teal-50 { --border-opacity: 1 !important; border-color: #EDFAFA !important; border-color: rgba(237, 250, 250, var(--border-opacity)) !important; } .border-teal-100 { --border-opacity: 1 !important; border-color: #D5F5F6 !important; border-color: rgba(213, 245, 246, var(--border-opacity)) !important; } .border-teal-200 { --border-opacity: 1 !important; border-color: #AFECEF !important; border-color: rgba(175, 236, 239, var(--border-opacity)) !important; } .border-teal-300 { --border-opacity: 1 !important; border-color: #7EDCE2 !important; border-color: rgba(126, 220, 226, var(--border-opacity)) !important; } .border-teal-400 { --border-opacity: 1 !important; border-color: #16BDCA !important; border-color: rgba(22, 189, 202, var(--border-opacity)) !important; } .border-teal-500 { --border-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--border-opacity)) !important; } .border-teal-600 { --border-opacity: 1 !important; border-color: #047481 !important; border-color: rgba(4, 116, 129, var(--border-opacity)) !important; } .border-teal-700 { --border-opacity: 1 !important; border-color: #036672 !important; border-color: rgba(3, 102, 114, var(--border-opacity)) !important; } .border-teal-800 { --border-opacity: 1 !important; border-color: #05505C !important; border-color: rgba(5, 80, 92, var(--border-opacity)) !important; } .border-teal-900 { --border-opacity: 1 !important; border-color: #014451 !important; border-color: rgba(1, 68, 81, var(--border-opacity)) !important; } .border-teal { --border-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--border-opacity)) !important; } .border-blue-50 { --border-opacity: 1 !important; border-color: #EBF5FF !important; border-color: rgba(235, 245, 255, var(--border-opacity)) !important; } .border-blue-100 { --border-opacity: 1 !important; border-color: #E1EFFE !important; border-color: rgba(225, 239, 254, var(--border-opacity)) !important; } .border-blue-200 { --border-opacity: 1 !important; border-color: #C3DDFD !important; border-color: rgba(195, 221, 253, var(--border-opacity)) !important; } .border-blue-300 { --border-opacity: 1 !important; border-color: #A4CAFE !important; border-color: rgba(164, 202, 254, var(--border-opacity)) !important; } .border-blue-400 { --border-opacity: 1 !important; border-color: #76A9FA !important; border-color: rgba(118, 169, 250, var(--border-opacity)) !important; } .border-blue-500 { --border-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--border-opacity)) !important; } .border-blue-600 { --border-opacity: 1 !important; border-color: #1C64F2 !important; border-color: rgba(28, 100, 242, var(--border-opacity)) !important; } .border-blue-700 { --border-opacity: 1 !important; border-color: #1A56DB !important; border-color: rgba(26, 86, 219, var(--border-opacity)) !important; } .border-blue-800 { --border-opacity: 1 !important; border-color: #1E429F !important; border-color: rgba(30, 66, 159, var(--border-opacity)) !important; } .border-blue-900 { --border-opacity: 1 !important; border-color: #233876 !important; border-color: rgba(35, 56, 118, var(--border-opacity)) !important; } .border-blue { --border-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--border-opacity)) !important; } .border-indigo-50 { --border-opacity: 1 !important; border-color: #F0F5FF !important; border-color: rgba(240, 245, 255, var(--border-opacity)) !important; } .border-indigo-100 { --border-opacity: 1 !important; border-color: #E5EDFF !important; border-color: rgba(229, 237, 255, var(--border-opacity)) !important; } .border-indigo-200 { --border-opacity: 1 !important; border-color: #CDDBFE !important; border-color: rgba(205, 219, 254, var(--border-opacity)) !important; } .border-indigo-300 { --border-opacity: 1 !important; border-color: #B4C6FC !important; border-color: rgba(180, 198, 252, var(--border-opacity)) !important; } .border-indigo-400 { --border-opacity: 1 !important; border-color: #8DA2FB !important; border-color: rgba(141, 162, 251, var(--border-opacity)) !important; } .border-indigo-500 { --border-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--border-opacity)) !important; } .border-indigo-600 { --border-opacity: 1 !important; border-color: #5850EC !important; border-color: rgba(88, 80, 236, var(--border-opacity)) !important; } .border-indigo-700 { --border-opacity: 1 !important; border-color: #5145CD !important; border-color: rgba(81, 69, 205, var(--border-opacity)) !important; } .border-indigo-800 { --border-opacity: 1 !important; border-color: #42389D !important; border-color: rgba(66, 56, 157, var(--border-opacity)) !important; } .border-indigo-900 { --border-opacity: 1 !important; border-color: #362F78 !important; border-color: rgba(54, 47, 120, var(--border-opacity)) !important; } .border-indigo { --border-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--border-opacity)) !important; } .border-purple-50 { --border-opacity: 1 !important; border-color: #F6F5FF !important; border-color: rgba(246, 245, 255, var(--border-opacity)) !important; } .border-purple-100 { --border-opacity: 1 !important; border-color: #EDEBFE !important; border-color: rgba(237, 235, 254, var(--border-opacity)) !important; } .border-purple-200 { --border-opacity: 1 !important; border-color: #DCD7FE !important; border-color: rgba(220, 215, 254, var(--border-opacity)) !important; } .border-purple-300 { --border-opacity: 1 !important; border-color: #CABFFD !important; border-color: rgba(202, 191, 253, var(--border-opacity)) !important; } .border-purple-400 { --border-opacity: 1 !important; border-color: #AC94FA !important; border-color: rgba(172, 148, 250, var(--border-opacity)) !important; } .border-purple-500 { --border-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--border-opacity)) !important; } .border-purple-600 { --border-opacity: 1 !important; border-color: #7E3AF2 !important; border-color: rgba(126, 58, 242, var(--border-opacity)) !important; } .border-purple-700 { --border-opacity: 1 !important; border-color: #6C2BD9 !important; border-color: rgba(108, 43, 217, var(--border-opacity)) !important; } .border-purple-800 { --border-opacity: 1 !important; border-color: #5521B5 !important; border-color: rgba(85, 33, 181, var(--border-opacity)) !important; } .border-purple-900 { --border-opacity: 1 !important; border-color: #4A1D96 !important; border-color: rgba(74, 29, 150, var(--border-opacity)) !important; } .border-purple { --border-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--border-opacity)) !important; } .border-pink-50 { --border-opacity: 1 !important; border-color: #FDF2F8 !important; border-color: rgba(253, 242, 248, var(--border-opacity)) !important; } .border-pink-100 { --border-opacity: 1 !important; border-color: #FCE8F3 !important; border-color: rgba(252, 232, 243, var(--border-opacity)) !important; } .border-pink-200 { --border-opacity: 1 !important; border-color: #FAD1E8 !important; border-color: rgba(250, 209, 232, var(--border-opacity)) !important; } .border-pink-300 { --border-opacity: 1 !important; border-color: #F8B4D9 !important; border-color: rgba(248, 180, 217, var(--border-opacity)) !important; } .border-pink-400 { --border-opacity: 1 !important; border-color: #F17EB8 !important; border-color: rgba(241, 126, 184, var(--border-opacity)) !important; } .border-pink-500 { --border-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--border-opacity)) !important; } .border-pink-600 { --border-opacity: 1 !important; border-color: #D61F69 !important; border-color: rgba(214, 31, 105, var(--border-opacity)) !important; } .border-pink-700 { --border-opacity: 1 !important; border-color: #BF125D !important; border-color: rgba(191, 18, 93, var(--border-opacity)) !important; } .border-pink-800 { --border-opacity: 1 !important; border-color: #99154B !important; border-color: rgba(153, 21, 75, var(--border-opacity)) !important; } .border-pink-900 { --border-opacity: 1 !important; border-color: #751A3D !important; border-color: rgba(117, 26, 61, var(--border-opacity)) !important; } .border-pink { --border-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-current, [class*="theme-dark"] .dark\:border-current, [class*="theme-light"].light\:border-current, [class*="theme-light"] .light\:border-current { border-color: currentColor !important; } [class*="theme-dark"].dark\:border-transparent, [class*="theme-dark"] .dark\:border-transparent, [class*="theme-light"].light\:border-transparent, [class*="theme-light"] .light\:border-transparent { border-color: transparent !important; } [class*="theme-dark"].dark\:border-white, [class*="theme-dark"] .dark\:border-white, [class*="theme-light"].light\:border-white, [class*="theme-light"] .light\:border-white { --border-opacity: 1 !important; border-color: #FFFFFF !important; border-color: rgba(255, 255, 255, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-black, [class*="theme-dark"] .dark\:border-black, [class*="theme-light"].light\:border-black, [class*="theme-light"] .light\:border-black { --border-opacity: 1 !important; border-color: #000000 !important; border-color: rgba(0, 0, 0, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-gray-50, [class*="theme-dark"] .dark\:border-gray-50, [class*="theme-light"].light\:border-gray-50, [class*="theme-light"] .light\:border-gray-50 { --border-opacity: 1 !important; border-color: #F9FAFB !important; border-color: rgba(249, 250, 251, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-gray-100, [class*="theme-dark"] .dark\:border-gray-100, [class*="theme-light"].light\:border-gray-100, [class*="theme-light"] .light\:border-gray-100 { --border-opacity: 1 !important; border-color: #F4F5F7 !important; border-color: rgba(244, 245, 247, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-gray-200, [class*="theme-dark"] .dark\:border-gray-200, [class*="theme-light"].light\:border-gray-200, [class*="theme-light"] .light\:border-gray-200 { --border-opacity: 1 !important; border-color: #E5E7EB !important; border-color: rgba(229, 231, 235, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-gray-300, [class*="theme-dark"] .dark\:border-gray-300, [class*="theme-light"].light\:border-gray-300, [class*="theme-light"] .light\:border-gray-300 { --border-opacity: 1 !important; border-color: #D2D6DC !important; border-color: rgba(210, 214, 220, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-gray-400, [class*="theme-dark"] .dark\:border-gray-400, [class*="theme-light"].light\:border-gray-400, [class*="theme-light"] .light\:border-gray-400 { --border-opacity: 1 !important; border-color: #9FA6B2 !important; border-color: rgba(159, 166, 178, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-gray-500, [class*="theme-dark"] .dark\:border-gray-500, [class*="theme-light"].light\:border-gray-500, [class*="theme-light"] .light\:border-gray-500 { --border-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-gray-600, [class*="theme-dark"] .dark\:border-gray-600, [class*="theme-light"].light\:border-gray-600, [class*="theme-light"] .light\:border-gray-600 { --border-opacity: 1 !important; border-color: #4B5563 !important; border-color: rgba(75, 85, 99, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-gray-700, [class*="theme-dark"] .dark\:border-gray-700, [class*="theme-light"].light\:border-gray-700, [class*="theme-light"] .light\:border-gray-700 { --border-opacity: 1 !important; border-color: #374151 !important; border-color: rgba(55, 65, 81, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-gray-800, [class*="theme-dark"] .dark\:border-gray-800, [class*="theme-light"].light\:border-gray-800, [class*="theme-light"] .light\:border-gray-800 { --border-opacity: 1 !important; border-color: #252F3F !important; border-color: rgba(37, 47, 63, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-gray-900, [class*="theme-dark"] .dark\:border-gray-900, [class*="theme-light"].light\:border-gray-900, [class*="theme-light"] .light\:border-gray-900 { --border-opacity: 1 !important; border-color: #161E2E !important; border-color: rgba(22, 30, 46, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-gray, [class*="theme-dark"] .dark\:border-gray, [class*="theme-light"].light\:border-gray, [class*="theme-light"] .light\:border-gray { --border-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-cool-gray-50, [class*="theme-dark"] .dark\:border-cool-gray-50, [class*="theme-light"].light\:border-cool-gray-50, [class*="theme-light"] .light\:border-cool-gray-50 { --border-opacity: 1 !important; border-color: #FBFDFE !important; border-color: rgba(251, 253, 254, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-cool-gray-100, [class*="theme-dark"] .dark\:border-cool-gray-100, [class*="theme-light"].light\:border-cool-gray-100, [class*="theme-light"] .light\:border-cool-gray-100 { --border-opacity: 1 !important; border-color: #F1F5F9 !important; border-color: rgba(241, 245, 249, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-cool-gray-200, [class*="theme-dark"] .dark\:border-cool-gray-200, [class*="theme-light"].light\:border-cool-gray-200, [class*="theme-light"] .light\:border-cool-gray-200 { --border-opacity: 1 !important; border-color: #E2E8F0 !important; border-color: rgba(226, 232, 240, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-cool-gray-300, [class*="theme-dark"] .dark\:border-cool-gray-300, [class*="theme-light"].light\:border-cool-gray-300, [class*="theme-light"] .light\:border-cool-gray-300 { --border-opacity: 1 !important; border-color: #CFD8E3 !important; border-color: rgba(207, 216, 227, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-cool-gray-400, [class*="theme-dark"] .dark\:border-cool-gray-400, [class*="theme-light"].light\:border-cool-gray-400, [class*="theme-light"] .light\:border-cool-gray-400 { --border-opacity: 1 !important; border-color: #97A6BA !important; border-color: rgba(151, 166, 186, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-cool-gray-500, [class*="theme-dark"] .dark\:border-cool-gray-500, [class*="theme-light"].light\:border-cool-gray-500, [class*="theme-light"] .light\:border-cool-gray-500 { --border-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-cool-gray-600, [class*="theme-dark"] .dark\:border-cool-gray-600, [class*="theme-light"].light\:border-cool-gray-600, [class*="theme-light"] .light\:border-cool-gray-600 { --border-opacity: 1 !important; border-color: #475569 !important; border-color: rgba(71, 85, 105, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-cool-gray-700, [class*="theme-dark"] .dark\:border-cool-gray-700, [class*="theme-light"].light\:border-cool-gray-700, [class*="theme-light"] .light\:border-cool-gray-700 { --border-opacity: 1 !important; border-color: #364152 !important; border-color: rgba(54, 65, 82, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-cool-gray-800, [class*="theme-dark"] .dark\:border-cool-gray-800, [class*="theme-light"].light\:border-cool-gray-800, [class*="theme-light"] .light\:border-cool-gray-800 { --border-opacity: 1 !important; border-color: #27303F !important; border-color: rgba(39, 48, 63, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-cool-gray-900, [class*="theme-dark"] .dark\:border-cool-gray-900, [class*="theme-light"].light\:border-cool-gray-900, [class*="theme-light"] .light\:border-cool-gray-900 { --border-opacity: 1 !important; border-color: #1A202E !important; border-color: rgba(26, 32, 46, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-cool-gray, [class*="theme-dark"] .dark\:border-cool-gray, [class*="theme-light"].light\:border-cool-gray, [class*="theme-light"] .light\:border-cool-gray { --border-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-red-50, [class*="theme-dark"] .dark\:border-red-50, [class*="theme-light"].light\:border-red-50, [class*="theme-light"] .light\:border-red-50 { --border-opacity: 1 !important; border-color: #FDF2F2 !important; border-color: rgba(253, 242, 242, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-red-100, [class*="theme-dark"] .dark\:border-red-100, [class*="theme-light"].light\:border-red-100, [class*="theme-light"] .light\:border-red-100 { --border-opacity: 1 !important; border-color: #FDE8E8 !important; border-color: rgba(253, 232, 232, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-red-200, [class*="theme-dark"] .dark\:border-red-200, [class*="theme-light"].light\:border-red-200, [class*="theme-light"] .light\:border-red-200 { --border-opacity: 1 !important; border-color: #FBD5D5 !important; border-color: rgba(251, 213, 213, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-red-300, [class*="theme-dark"] .dark\:border-red-300, [class*="theme-light"].light\:border-red-300, [class*="theme-light"] .light\:border-red-300 { --border-opacity: 1 !important; border-color: #F8B4B4 !important; border-color: rgba(248, 180, 180, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-red-400, [class*="theme-dark"] .dark\:border-red-400, [class*="theme-light"].light\:border-red-400, [class*="theme-light"] .light\:border-red-400 { --border-opacity: 1 !important; border-color: #F98080 !important; border-color: rgba(249, 128, 128, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-red-500, [class*="theme-dark"] .dark\:border-red-500, [class*="theme-light"].light\:border-red-500, [class*="theme-light"] .light\:border-red-500 { --border-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-red-600, [class*="theme-dark"] .dark\:border-red-600, [class*="theme-light"].light\:border-red-600, [class*="theme-light"] .light\:border-red-600 { --border-opacity: 1 !important; border-color: #E02424 !important; border-color: rgba(224, 36, 36, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-red-700, [class*="theme-dark"] .dark\:border-red-700, [class*="theme-light"].light\:border-red-700, [class*="theme-light"] .light\:border-red-700 { --border-opacity: 1 !important; border-color: #C81E1E !important; border-color: rgba(200, 30, 30, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-red-800, [class*="theme-dark"] .dark\:border-red-800, [class*="theme-light"].light\:border-red-800, [class*="theme-light"] .light\:border-red-800 { --border-opacity: 1 !important; border-color: #9B1C1C !important; border-color: rgba(155, 28, 28, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-red-900, [class*="theme-dark"] .dark\:border-red-900, [class*="theme-light"].light\:border-red-900, [class*="theme-light"] .light\:border-red-900 { --border-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-red, [class*="theme-dark"] .dark\:border-red, [class*="theme-light"].light\:border-red, [class*="theme-light"] .light\:border-red { --border-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-orange-50, [class*="theme-dark"] .dark\:border-orange-50, [class*="theme-light"].light\:border-orange-50, [class*="theme-light"] .light\:border-orange-50 { --border-opacity: 1 !important; border-color: #FFF8F1 !important; border-color: rgba(255, 248, 241, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-orange-100, [class*="theme-dark"] .dark\:border-orange-100, [class*="theme-light"].light\:border-orange-100, [class*="theme-light"] .light\:border-orange-100 { --border-opacity: 1 !important; border-color: #FEECDC !important; border-color: rgba(254, 236, 220, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-orange-200, [class*="theme-dark"] .dark\:border-orange-200, [class*="theme-light"].light\:border-orange-200, [class*="theme-light"] .light\:border-orange-200 { --border-opacity: 1 !important; border-color: #FCD9BD !important; border-color: rgba(252, 217, 189, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-orange-300, [class*="theme-dark"] .dark\:border-orange-300, [class*="theme-light"].light\:border-orange-300, [class*="theme-light"] .light\:border-orange-300 { --border-opacity: 1 !important; border-color: #FDBA8C !important; border-color: rgba(253, 186, 140, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-orange-400, [class*="theme-dark"] .dark\:border-orange-400, [class*="theme-light"].light\:border-orange-400, [class*="theme-light"] .light\:border-orange-400 { --border-opacity: 1 !important; border-color: #FF8A4C !important; border-color: rgba(255, 138, 76, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-orange-500, [class*="theme-dark"] .dark\:border-orange-500, [class*="theme-light"].light\:border-orange-500, [class*="theme-light"] .light\:border-orange-500 { --border-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-orange-600, [class*="theme-dark"] .dark\:border-orange-600, [class*="theme-light"].light\:border-orange-600, [class*="theme-light"] .light\:border-orange-600 { --border-opacity: 1 !important; border-color: #D03801 !important; border-color: rgba(208, 56, 1, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-orange-700, [class*="theme-dark"] .dark\:border-orange-700, [class*="theme-light"].light\:border-orange-700, [class*="theme-light"] .light\:border-orange-700 { --border-opacity: 1 !important; border-color: #B43403 !important; border-color: rgba(180, 52, 3, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-orange-800, [class*="theme-dark"] .dark\:border-orange-800, [class*="theme-light"].light\:border-orange-800, [class*="theme-light"] .light\:border-orange-800 { --border-opacity: 1 !important; border-color: #8A2C0D !important; border-color: rgba(138, 44, 13, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-orange-900, [class*="theme-dark"] .dark\:border-orange-900, [class*="theme-light"].light\:border-orange-900, [class*="theme-light"] .light\:border-orange-900 { --border-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-orange, [class*="theme-dark"] .dark\:border-orange, [class*="theme-light"].light\:border-orange, [class*="theme-light"] .light\:border-orange { --border-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-yellow-50, [class*="theme-dark"] .dark\:border-yellow-50, [class*="theme-light"].light\:border-yellow-50, [class*="theme-light"] .light\:border-yellow-50 { --border-opacity: 1 !important; border-color: #FDFDEA !important; border-color: rgba(253, 253, 234, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-yellow-100, [class*="theme-dark"] .dark\:border-yellow-100, [class*="theme-light"].light\:border-yellow-100, [class*="theme-light"] .light\:border-yellow-100 { --border-opacity: 1 !important; border-color: #FDF6B2 !important; border-color: rgba(253, 246, 178, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-yellow-200, [class*="theme-dark"] .dark\:border-yellow-200, [class*="theme-light"].light\:border-yellow-200, [class*="theme-light"] .light\:border-yellow-200 { --border-opacity: 1 !important; border-color: #FCE96A !important; border-color: rgba(252, 233, 106, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-yellow-300, [class*="theme-dark"] .dark\:border-yellow-300, [class*="theme-light"].light\:border-yellow-300, [class*="theme-light"] .light\:border-yellow-300 { --border-opacity: 1 !important; border-color: #FACA15 !important; border-color: rgba(250, 202, 21, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-yellow-400, [class*="theme-dark"] .dark\:border-yellow-400, [class*="theme-light"].light\:border-yellow-400, [class*="theme-light"] .light\:border-yellow-400 { --border-opacity: 1 !important; border-color: #E3A008 !important; border-color: rgba(227, 160, 8, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-yellow-500, [class*="theme-dark"] .dark\:border-yellow-500, [class*="theme-light"].light\:border-yellow-500, [class*="theme-light"] .light\:border-yellow-500 { --border-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-yellow-600, [class*="theme-dark"] .dark\:border-yellow-600, [class*="theme-light"].light\:border-yellow-600, [class*="theme-light"] .light\:border-yellow-600 { --border-opacity: 1 !important; border-color: #9F580A !important; border-color: rgba(159, 88, 10, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-yellow-700, [class*="theme-dark"] .dark\:border-yellow-700, [class*="theme-light"].light\:border-yellow-700, [class*="theme-light"] .light\:border-yellow-700 { --border-opacity: 1 !important; border-color: #8E4B10 !important; border-color: rgba(142, 75, 16, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-yellow-800, [class*="theme-dark"] .dark\:border-yellow-800, [class*="theme-light"].light\:border-yellow-800, [class*="theme-light"] .light\:border-yellow-800 { --border-opacity: 1 !important; border-color: #723B13 !important; border-color: rgba(114, 59, 19, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-yellow-900, [class*="theme-dark"] .dark\:border-yellow-900, [class*="theme-light"].light\:border-yellow-900, [class*="theme-light"] .light\:border-yellow-900 { --border-opacity: 1 !important; border-color: #633112 !important; border-color: rgba(99, 49, 18, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-yellow, [class*="theme-dark"] .dark\:border-yellow, [class*="theme-light"].light\:border-yellow, [class*="theme-light"] .light\:border-yellow { --border-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-green-50, [class*="theme-dark"] .dark\:border-green-50, [class*="theme-light"].light\:border-green-50, [class*="theme-light"] .light\:border-green-50 { --border-opacity: 1 !important; border-color: #F3FAF7 !important; border-color: rgba(243, 250, 247, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-green-100, [class*="theme-dark"] .dark\:border-green-100, [class*="theme-light"].light\:border-green-100, [class*="theme-light"] .light\:border-green-100 { --border-opacity: 1 !important; border-color: #DEF7EC !important; border-color: rgba(222, 247, 236, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-green-200, [class*="theme-dark"] .dark\:border-green-200, [class*="theme-light"].light\:border-green-200, [class*="theme-light"] .light\:border-green-200 { --border-opacity: 1 !important; border-color: #BCF0DA !important; border-color: rgba(188, 240, 218, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-green-300, [class*="theme-dark"] .dark\:border-green-300, [class*="theme-light"].light\:border-green-300, [class*="theme-light"] .light\:border-green-300 { --border-opacity: 1 !important; border-color: #84E1BC !important; border-color: rgba(132, 225, 188, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-green-400, [class*="theme-dark"] .dark\:border-green-400, [class*="theme-light"].light\:border-green-400, [class*="theme-light"] .light\:border-green-400 { --border-opacity: 1 !important; border-color: #31C48D !important; border-color: rgba(49, 196, 141, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-green-500, [class*="theme-dark"] .dark\:border-green-500, [class*="theme-light"].light\:border-green-500, [class*="theme-light"] .light\:border-green-500 { --border-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-green-600, [class*="theme-dark"] .dark\:border-green-600, [class*="theme-light"].light\:border-green-600, [class*="theme-light"] .light\:border-green-600 { --border-opacity: 1 !important; border-color: #057A55 !important; border-color: rgba(5, 122, 85, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-green-700, [class*="theme-dark"] .dark\:border-green-700, [class*="theme-light"].light\:border-green-700, [class*="theme-light"] .light\:border-green-700 { --border-opacity: 1 !important; border-color: #046C4E !important; border-color: rgba(4, 108, 78, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-green-800, [class*="theme-dark"] .dark\:border-green-800, [class*="theme-light"].light\:border-green-800, [class*="theme-light"] .light\:border-green-800 { --border-opacity: 1 !important; border-color: #03543F !important; border-color: rgba(3, 84, 63, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-green-900, [class*="theme-dark"] .dark\:border-green-900, [class*="theme-light"].light\:border-green-900, [class*="theme-light"] .light\:border-green-900 { --border-opacity: 1 !important; border-color: #014737 !important; border-color: rgba(1, 71, 55, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-green, [class*="theme-dark"] .dark\:border-green, [class*="theme-light"].light\:border-green, [class*="theme-light"] .light\:border-green { --border-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-teal-50, [class*="theme-dark"] .dark\:border-teal-50, [class*="theme-light"].light\:border-teal-50, [class*="theme-light"] .light\:border-teal-50 { --border-opacity: 1 !important; border-color: #EDFAFA !important; border-color: rgba(237, 250, 250, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-teal-100, [class*="theme-dark"] .dark\:border-teal-100, [class*="theme-light"].light\:border-teal-100, [class*="theme-light"] .light\:border-teal-100 { --border-opacity: 1 !important; border-color: #D5F5F6 !important; border-color: rgba(213, 245, 246, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-teal-200, [class*="theme-dark"] .dark\:border-teal-200, [class*="theme-light"].light\:border-teal-200, [class*="theme-light"] .light\:border-teal-200 { --border-opacity: 1 !important; border-color: #AFECEF !important; border-color: rgba(175, 236, 239, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-teal-300, [class*="theme-dark"] .dark\:border-teal-300, [class*="theme-light"].light\:border-teal-300, [class*="theme-light"] .light\:border-teal-300 { --border-opacity: 1 !important; border-color: #7EDCE2 !important; border-color: rgba(126, 220, 226, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-teal-400, [class*="theme-dark"] .dark\:border-teal-400, [class*="theme-light"].light\:border-teal-400, [class*="theme-light"] .light\:border-teal-400 { --border-opacity: 1 !important; border-color: #16BDCA !important; border-color: rgba(22, 189, 202, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-teal-500, [class*="theme-dark"] .dark\:border-teal-500, [class*="theme-light"].light\:border-teal-500, [class*="theme-light"] .light\:border-teal-500 { --border-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-teal-600, [class*="theme-dark"] .dark\:border-teal-600, [class*="theme-light"].light\:border-teal-600, [class*="theme-light"] .light\:border-teal-600 { --border-opacity: 1 !important; border-color: #047481 !important; border-color: rgba(4, 116, 129, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-teal-700, [class*="theme-dark"] .dark\:border-teal-700, [class*="theme-light"].light\:border-teal-700, [class*="theme-light"] .light\:border-teal-700 { --border-opacity: 1 !important; border-color: #036672 !important; border-color: rgba(3, 102, 114, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-teal-800, [class*="theme-dark"] .dark\:border-teal-800, [class*="theme-light"].light\:border-teal-800, [class*="theme-light"] .light\:border-teal-800 { --border-opacity: 1 !important; border-color: #05505C !important; border-color: rgba(5, 80, 92, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-teal-900, [class*="theme-dark"] .dark\:border-teal-900, [class*="theme-light"].light\:border-teal-900, [class*="theme-light"] .light\:border-teal-900 { --border-opacity: 1 !important; border-color: #014451 !important; border-color: rgba(1, 68, 81, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-teal, [class*="theme-dark"] .dark\:border-teal, [class*="theme-light"].light\:border-teal, [class*="theme-light"] .light\:border-teal { --border-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-blue-50, [class*="theme-dark"] .dark\:border-blue-50, [class*="theme-light"].light\:border-blue-50, [class*="theme-light"] .light\:border-blue-50 { --border-opacity: 1 !important; border-color: #EBF5FF !important; border-color: rgba(235, 245, 255, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-blue-100, [class*="theme-dark"] .dark\:border-blue-100, [class*="theme-light"].light\:border-blue-100, [class*="theme-light"] .light\:border-blue-100 { --border-opacity: 1 !important; border-color: #E1EFFE !important; border-color: rgba(225, 239, 254, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-blue-200, [class*="theme-dark"] .dark\:border-blue-200, [class*="theme-light"].light\:border-blue-200, [class*="theme-light"] .light\:border-blue-200 { --border-opacity: 1 !important; border-color: #C3DDFD !important; border-color: rgba(195, 221, 253, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-blue-300, [class*="theme-dark"] .dark\:border-blue-300, [class*="theme-light"].light\:border-blue-300, [class*="theme-light"] .light\:border-blue-300 { --border-opacity: 1 !important; border-color: #A4CAFE !important; border-color: rgba(164, 202, 254, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-blue-400, [class*="theme-dark"] .dark\:border-blue-400, [class*="theme-light"].light\:border-blue-400, [class*="theme-light"] .light\:border-blue-400 { --border-opacity: 1 !important; border-color: #76A9FA !important; border-color: rgba(118, 169, 250, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-blue-500, [class*="theme-dark"] .dark\:border-blue-500, [class*="theme-light"].light\:border-blue-500, [class*="theme-light"] .light\:border-blue-500 { --border-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-blue-600, [class*="theme-dark"] .dark\:border-blue-600, [class*="theme-light"].light\:border-blue-600, [class*="theme-light"] .light\:border-blue-600 { --border-opacity: 1 !important; border-color: #1C64F2 !important; border-color: rgba(28, 100, 242, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-blue-700, [class*="theme-dark"] .dark\:border-blue-700, [class*="theme-light"].light\:border-blue-700, [class*="theme-light"] .light\:border-blue-700 { --border-opacity: 1 !important; border-color: #1A56DB !important; border-color: rgba(26, 86, 219, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-blue-800, [class*="theme-dark"] .dark\:border-blue-800, [class*="theme-light"].light\:border-blue-800, [class*="theme-light"] .light\:border-blue-800 { --border-opacity: 1 !important; border-color: #1E429F !important; border-color: rgba(30, 66, 159, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-blue-900, [class*="theme-dark"] .dark\:border-blue-900, [class*="theme-light"].light\:border-blue-900, [class*="theme-light"] .light\:border-blue-900 { --border-opacity: 1 !important; border-color: #233876 !important; border-color: rgba(35, 56, 118, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-blue, [class*="theme-dark"] .dark\:border-blue, [class*="theme-light"].light\:border-blue, [class*="theme-light"] .light\:border-blue { --border-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-indigo-50, [class*="theme-dark"] .dark\:border-indigo-50, [class*="theme-light"].light\:border-indigo-50, [class*="theme-light"] .light\:border-indigo-50 { --border-opacity: 1 !important; border-color: #F0F5FF !important; border-color: rgba(240, 245, 255, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-indigo-100, [class*="theme-dark"] .dark\:border-indigo-100, [class*="theme-light"].light\:border-indigo-100, [class*="theme-light"] .light\:border-indigo-100 { --border-opacity: 1 !important; border-color: #E5EDFF !important; border-color: rgba(229, 237, 255, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-indigo-200, [class*="theme-dark"] .dark\:border-indigo-200, [class*="theme-light"].light\:border-indigo-200, [class*="theme-light"] .light\:border-indigo-200 { --border-opacity: 1 !important; border-color: #CDDBFE !important; border-color: rgba(205, 219, 254, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-indigo-300, [class*="theme-dark"] .dark\:border-indigo-300, [class*="theme-light"].light\:border-indigo-300, [class*="theme-light"] .light\:border-indigo-300 { --border-opacity: 1 !important; border-color: #B4C6FC !important; border-color: rgba(180, 198, 252, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-indigo-400, [class*="theme-dark"] .dark\:border-indigo-400, [class*="theme-light"].light\:border-indigo-400, [class*="theme-light"] .light\:border-indigo-400 { --border-opacity: 1 !important; border-color: #8DA2FB !important; border-color: rgba(141, 162, 251, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-indigo-500, [class*="theme-dark"] .dark\:border-indigo-500, [class*="theme-light"].light\:border-indigo-500, [class*="theme-light"] .light\:border-indigo-500 { --border-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-indigo-600, [class*="theme-dark"] .dark\:border-indigo-600, [class*="theme-light"].light\:border-indigo-600, [class*="theme-light"] .light\:border-indigo-600 { --border-opacity: 1 !important; border-color: #5850EC !important; border-color: rgba(88, 80, 236, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-indigo-700, [class*="theme-dark"] .dark\:border-indigo-700, [class*="theme-light"].light\:border-indigo-700, [class*="theme-light"] .light\:border-indigo-700 { --border-opacity: 1 !important; border-color: #5145CD !important; border-color: rgba(81, 69, 205, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-indigo-800, [class*="theme-dark"] .dark\:border-indigo-800, [class*="theme-light"].light\:border-indigo-800, [class*="theme-light"] .light\:border-indigo-800 { --border-opacity: 1 !important; border-color: #42389D !important; border-color: rgba(66, 56, 157, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-indigo-900, [class*="theme-dark"] .dark\:border-indigo-900, [class*="theme-light"].light\:border-indigo-900, [class*="theme-light"] .light\:border-indigo-900 { --border-opacity: 1 !important; border-color: #362F78 !important; border-color: rgba(54, 47, 120, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-indigo, [class*="theme-dark"] .dark\:border-indigo, [class*="theme-light"].light\:border-indigo, [class*="theme-light"] .light\:border-indigo { --border-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-purple-50, [class*="theme-dark"] .dark\:border-purple-50, [class*="theme-light"].light\:border-purple-50, [class*="theme-light"] .light\:border-purple-50 { --border-opacity: 1 !important; border-color: #F6F5FF !important; border-color: rgba(246, 245, 255, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-purple-100, [class*="theme-dark"] .dark\:border-purple-100, [class*="theme-light"].light\:border-purple-100, [class*="theme-light"] .light\:border-purple-100 { --border-opacity: 1 !important; border-color: #EDEBFE !important; border-color: rgba(237, 235, 254, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-purple-200, [class*="theme-dark"] .dark\:border-purple-200, [class*="theme-light"].light\:border-purple-200, [class*="theme-light"] .light\:border-purple-200 { --border-opacity: 1 !important; border-color: #DCD7FE !important; border-color: rgba(220, 215, 254, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-purple-300, [class*="theme-dark"] .dark\:border-purple-300, [class*="theme-light"].light\:border-purple-300, [class*="theme-light"] .light\:border-purple-300 { --border-opacity: 1 !important; border-color: #CABFFD !important; border-color: rgba(202, 191, 253, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-purple-400, [class*="theme-dark"] .dark\:border-purple-400, [class*="theme-light"].light\:border-purple-400, [class*="theme-light"] .light\:border-purple-400 { --border-opacity: 1 !important; border-color: #AC94FA !important; border-color: rgba(172, 148, 250, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-purple-500, [class*="theme-dark"] .dark\:border-purple-500, [class*="theme-light"].light\:border-purple-500, [class*="theme-light"] .light\:border-purple-500 { --border-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-purple-600, [class*="theme-dark"] .dark\:border-purple-600, [class*="theme-light"].light\:border-purple-600, [class*="theme-light"] .light\:border-purple-600 { --border-opacity: 1 !important; border-color: #7E3AF2 !important; border-color: rgba(126, 58, 242, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-purple-700, [class*="theme-dark"] .dark\:border-purple-700, [class*="theme-light"].light\:border-purple-700, [class*="theme-light"] .light\:border-purple-700 { --border-opacity: 1 !important; border-color: #6C2BD9 !important; border-color: rgba(108, 43, 217, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-purple-800, [class*="theme-dark"] .dark\:border-purple-800, [class*="theme-light"].light\:border-purple-800, [class*="theme-light"] .light\:border-purple-800 { --border-opacity: 1 !important; border-color: #5521B5 !important; border-color: rgba(85, 33, 181, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-purple-900, [class*="theme-dark"] .dark\:border-purple-900, [class*="theme-light"].light\:border-purple-900, [class*="theme-light"] .light\:border-purple-900 { --border-opacity: 1 !important; border-color: #4A1D96 !important; border-color: rgba(74, 29, 150, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-purple, [class*="theme-dark"] .dark\:border-purple, [class*="theme-light"].light\:border-purple, [class*="theme-light"] .light\:border-purple { --border-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-pink-50, [class*="theme-dark"] .dark\:border-pink-50, [class*="theme-light"].light\:border-pink-50, [class*="theme-light"] .light\:border-pink-50 { --border-opacity: 1 !important; border-color: #FDF2F8 !important; border-color: rgba(253, 242, 248, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-pink-100, [class*="theme-dark"] .dark\:border-pink-100, [class*="theme-light"].light\:border-pink-100, [class*="theme-light"] .light\:border-pink-100 { --border-opacity: 1 !important; border-color: #FCE8F3 !important; border-color: rgba(252, 232, 243, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-pink-200, [class*="theme-dark"] .dark\:border-pink-200, [class*="theme-light"].light\:border-pink-200, [class*="theme-light"] .light\:border-pink-200 { --border-opacity: 1 !important; border-color: #FAD1E8 !important; border-color: rgba(250, 209, 232, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-pink-300, [class*="theme-dark"] .dark\:border-pink-300, [class*="theme-light"].light\:border-pink-300, [class*="theme-light"] .light\:border-pink-300 { --border-opacity: 1 !important; border-color: #F8B4D9 !important; border-color: rgba(248, 180, 217, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-pink-400, [class*="theme-dark"] .dark\:border-pink-400, [class*="theme-light"].light\:border-pink-400, [class*="theme-light"] .light\:border-pink-400 { --border-opacity: 1 !important; border-color: #F17EB8 !important; border-color: rgba(241, 126, 184, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-pink-500, [class*="theme-dark"] .dark\:border-pink-500, [class*="theme-light"].light\:border-pink-500, [class*="theme-light"] .light\:border-pink-500 { --border-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-pink-600, [class*="theme-dark"] .dark\:border-pink-600, [class*="theme-light"].light\:border-pink-600, [class*="theme-light"] .light\:border-pink-600 { --border-opacity: 1 !important; border-color: #D61F69 !important; border-color: rgba(214, 31, 105, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-pink-700, [class*="theme-dark"] .dark\:border-pink-700, [class*="theme-light"].light\:border-pink-700, [class*="theme-light"] .light\:border-pink-700 { --border-opacity: 1 !important; border-color: #BF125D !important; border-color: rgba(191, 18, 93, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-pink-800, [class*="theme-dark"] .dark\:border-pink-800, [class*="theme-light"].light\:border-pink-800, [class*="theme-light"] .light\:border-pink-800 { --border-opacity: 1 !important; border-color: #99154B !important; border-color: rgba(153, 21, 75, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-pink-900, [class*="theme-dark"] .dark\:border-pink-900, [class*="theme-light"].light\:border-pink-900, [class*="theme-light"] .light\:border-pink-900 { --border-opacity: 1 !important; border-color: #751A3D !important; border-color: rgba(117, 26, 61, var(--border-opacity)) !important; } [class*="theme-dark"].dark\:border-pink, [class*="theme-dark"] .dark\:border-pink, [class*="theme-light"].light\:border-pink, [class*="theme-light"] .light\:border-pink { --border-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--border-opacity)) !important; } .border-opacity-0 { --border-opacity: 0 !important; } .border-opacity-12 { --border-opacity: 0.12 !important; } .border-opacity-25 { --border-opacity: 0.25 !important; } .border-opacity-38 { --border-opacity: 0.38 !important; } .border-opacity-50 { --border-opacity: 0.5 !important; } .border-opacity-54 { --border-opacity: 0.54 !important; } .border-opacity-70 { --border-opacity: 0.70 !important; } .border-opacity-75 { --border-opacity: 0.75 !important; } .border-opacity-84 { --border-opacity: 0.84 !important; } .border-opacity-100 { --border-opacity: 1 !important; } .hover\:border-opacity-0:hover { --border-opacity: 0 !important; } .hover\:border-opacity-12:hover { --border-opacity: 0.12 !important; } .hover\:border-opacity-25:hover { --border-opacity: 0.25 !important; } .hover\:border-opacity-38:hover { --border-opacity: 0.38 !important; } .hover\:border-opacity-50:hover { --border-opacity: 0.5 !important; } .hover\:border-opacity-54:hover { --border-opacity: 0.54 !important; } .hover\:border-opacity-70:hover { --border-opacity: 0.70 !important; } .hover\:border-opacity-75:hover { --border-opacity: 0.75 !important; } .hover\:border-opacity-84:hover { --border-opacity: 0.84 !important; } .hover\:border-opacity-100:hover { --border-opacity: 1 !important; } .focus\:border-opacity-0:focus { --border-opacity: 0 !important; } .focus\:border-opacity-12:focus { --border-opacity: 0.12 !important; } .focus\:border-opacity-25:focus { --border-opacity: 0.25 !important; } .focus\:border-opacity-38:focus { --border-opacity: 0.38 !important; } .focus\:border-opacity-50:focus { --border-opacity: 0.5 !important; } .focus\:border-opacity-54:focus { --border-opacity: 0.54 !important; } .focus\:border-opacity-70:focus { --border-opacity: 0.70 !important; } .focus\:border-opacity-75:focus { --border-opacity: 0.75 !important; } .focus\:border-opacity-84:focus { --border-opacity: 0.84 !important; } .focus\:border-opacity-100:focus { --border-opacity: 1 !important; } .rounded-none { border-radius: 0 !important; } .rounded-sm { border-radius: 0.125rem !important; } .rounded { border-radius: 0.25rem !important; } .rounded-md { border-radius: 0.375rem !important; } .rounded-lg { border-radius: 0.5rem !important; } .rounded-full { border-radius: 9999px !important; } .rounded-t-none { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } .rounded-r-none { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } .rounded-b-none { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } .rounded-l-none { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; } .rounded-t-sm { border-top-left-radius: 0.125rem !important; border-top-right-radius: 0.125rem !important; } .rounded-r-sm { border-top-right-radius: 0.125rem !important; border-bottom-right-radius: 0.125rem !important; } .rounded-b-sm { border-bottom-right-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .rounded-l-sm { border-top-left-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .rounded-t { border-top-left-radius: 0.25rem !important; border-top-right-radius: 0.25rem !important; } .rounded-r { border-top-right-radius: 0.25rem !important; border-bottom-right-radius: 0.25rem !important; } .rounded-b { border-bottom-right-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .rounded-l { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .rounded-t-md { border-top-left-radius: 0.375rem !important; border-top-right-radius: 0.375rem !important; } .rounded-r-md { border-top-right-radius: 0.375rem !important; border-bottom-right-radius: 0.375rem !important; } .rounded-b-md { border-bottom-right-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .rounded-l-md { border-top-left-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .rounded-t-lg { border-top-left-radius: 0.5rem !important; border-top-right-radius: 0.5rem !important; } .rounded-r-lg { border-top-right-radius: 0.5rem !important; border-bottom-right-radius: 0.5rem !important; } .rounded-b-lg { border-bottom-right-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .rounded-l-lg { border-top-left-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .rounded-t-full { border-top-left-radius: 9999px !important; border-top-right-radius: 9999px !important; } .rounded-r-full { border-top-right-radius: 9999px !important; border-bottom-right-radius: 9999px !important; } .rounded-b-full { border-bottom-right-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .rounded-l-full { border-top-left-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .rounded-tl-none { border-top-left-radius: 0 !important; } .rounded-tr-none { border-top-right-radius: 0 !important; } .rounded-br-none { border-bottom-right-radius: 0 !important; } .rounded-bl-none { border-bottom-left-radius: 0 !important; } .rounded-tl-sm { border-top-left-radius: 0.125rem !important; } .rounded-tr-sm { border-top-right-radius: 0.125rem !important; } .rounded-br-sm { border-bottom-right-radius: 0.125rem !important; } .rounded-bl-sm { border-bottom-left-radius: 0.125rem !important; } .rounded-tl { border-top-left-radius: 0.25rem !important; } .rounded-tr { border-top-right-radius: 0.25rem !important; } .rounded-br { border-bottom-right-radius: 0.25rem !important; } .rounded-bl { border-bottom-left-radius: 0.25rem !important; } .rounded-tl-md { border-top-left-radius: 0.375rem !important; } .rounded-tr-md { border-top-right-radius: 0.375rem !important; } .rounded-br-md { border-bottom-right-radius: 0.375rem !important; } .rounded-bl-md { border-bottom-left-radius: 0.375rem !important; } .rounded-tl-lg { border-top-left-radius: 0.5rem !important; } .rounded-tr-lg { border-top-right-radius: 0.5rem !important; } .rounded-br-lg { border-bottom-right-radius: 0.5rem !important; } .rounded-bl-lg { border-bottom-left-radius: 0.5rem !important; } .rounded-tl-full { border-top-left-radius: 9999px !important; } .rounded-tr-full { border-top-right-radius: 9999px !important; } .rounded-br-full { border-bottom-right-radius: 9999px !important; } .rounded-bl-full { border-bottom-left-radius: 9999px !important; } .border-solid { border-style: solid !important; } .border-dashed { border-style: dashed !important; } .border-dotted { border-style: dotted !important; } .border-double { border-style: double !important; } .border-none { border-style: none !important; } .border-0 { border-width: 0 !important; } .border-2 { border-width: 2px !important; } .border-4 { border-width: 4px !important; } .border-8 { border-width: 8px !important; } .border { border-width: 1px !important; } .border-t-0 { border-top-width: 0 !important; } .border-r-0 { border-right-width: 0 !important; } .border-b-0 { border-bottom-width: 0 !important; } .border-l-0 { border-left-width: 0 !important; } .border-t-2 { border-top-width: 2px !important; } .border-r-2 { border-right-width: 2px !important; } .border-b-2 { border-bottom-width: 2px !important; } .border-l-2 { border-left-width: 2px !important; } .border-t-4 { border-top-width: 4px !important; } .border-r-4 { border-right-width: 4px !important; } .border-b-4 { border-bottom-width: 4px !important; } .border-l-4 { border-left-width: 4px !important; } .border-t-8 { border-top-width: 8px !important; } .border-r-8 { border-right-width: 8px !important; } .border-b-8 { border-bottom-width: 8px !important; } .border-l-8 { border-left-width: 8px !important; } .border-t { border-top-width: 1px !important; } .border-r { border-right-width: 1px !important; } .border-b { border-bottom-width: 1px !important; } .border-l { border-left-width: 1px !important; } .first\:border-0:first-child { border-width: 0 !important; } .first\:border-2:first-child { border-width: 2px !important; } .first\:border-4:first-child { border-width: 4px !important; } .first\:border-8:first-child { border-width: 8px !important; } .first\:border:first-child { border-width: 1px !important; } .first\:border-t-0:first-child { border-top-width: 0 !important; } .first\:border-r-0:first-child { border-right-width: 0 !important; } .first\:border-b-0:first-child { border-bottom-width: 0 !important; } .first\:border-l-0:first-child { border-left-width: 0 !important; } .first\:border-t-2:first-child { border-top-width: 2px !important; } .first\:border-r-2:first-child { border-right-width: 2px !important; } .first\:border-b-2:first-child { border-bottom-width: 2px !important; } .first\:border-l-2:first-child { border-left-width: 2px !important; } .first\:border-t-4:first-child { border-top-width: 4px !important; } .first\:border-r-4:first-child { border-right-width: 4px !important; } .first\:border-b-4:first-child { border-bottom-width: 4px !important; } .first\:border-l-4:first-child { border-left-width: 4px !important; } .first\:border-t-8:first-child { border-top-width: 8px !important; } .first\:border-r-8:first-child { border-right-width: 8px !important; } .first\:border-b-8:first-child { border-bottom-width: 8px !important; } .first\:border-l-8:first-child { border-left-width: 8px !important; } .first\:border-t:first-child { border-top-width: 1px !important; } .first\:border-r:first-child { border-right-width: 1px !important; } .first\:border-b:first-child { border-bottom-width: 1px !important; } .first\:border-l:first-child { border-left-width: 1px !important; } .last\:border-0:last-child { border-width: 0 !important; } .last\:border-2:last-child { border-width: 2px !important; } .last\:border-4:last-child { border-width: 4px !important; } .last\:border-8:last-child { border-width: 8px !important; } .last\:border:last-child { border-width: 1px !important; } .last\:border-t-0:last-child { border-top-width: 0 !important; } .last\:border-r-0:last-child { border-right-width: 0 !important; } .last\:border-b-0:last-child { border-bottom-width: 0 !important; } .last\:border-l-0:last-child { border-left-width: 0 !important; } .last\:border-t-2:last-child { border-top-width: 2px !important; } .last\:border-r-2:last-child { border-right-width: 2px !important; } .last\:border-b-2:last-child { border-bottom-width: 2px !important; } .last\:border-l-2:last-child { border-left-width: 2px !important; } .last\:border-t-4:last-child { border-top-width: 4px !important; } .last\:border-r-4:last-child { border-right-width: 4px !important; } .last\:border-b-4:last-child { border-bottom-width: 4px !important; } .last\:border-l-4:last-child { border-left-width: 4px !important; } .last\:border-t-8:last-child { border-top-width: 8px !important; } .last\:border-r-8:last-child { border-right-width: 8px !important; } .last\:border-b-8:last-child { border-bottom-width: 8px !important; } .last\:border-l-8:last-child { border-left-width: 8px !important; } .last\:border-t:last-child { border-top-width: 1px !important; } .last\:border-r:last-child { border-right-width: 1px !important; } .last\:border-b:last-child { border-bottom-width: 1px !important; } .last\:border-l:last-child { border-left-width: 1px !important; } .box-border { box-sizing: border-box !important; } .box-content { box-sizing: content-box !important; } .cursor-auto { cursor: auto !important; } .cursor-default { cursor: default !important; } .cursor-pointer { cursor: pointer !important; } .cursor-wait { cursor: wait !important; } .cursor-text { cursor: text !important; } .cursor-move { cursor: move !important; } .cursor-not-allowed { cursor: not-allowed !important; } .block { display: block !important; } .inline-block { display: inline-block !important; } .inline { display: inline !important; } .flex { display: flex !important; } .inline-flex { display: inline-flex !important; } .table { display: table !important; } .table-caption { display: table-caption !important; } .table-cell { display: table-cell !important; } .table-column { display: table-column !important; } .table-column-group { display: table-column-group !important; } .table-footer-group { display: table-footer-group !important; } .table-header-group { display: table-header-group !important; } .table-row-group { display: table-row-group !important; } .table-row { display: table-row !important; } .flow-root { display: flow-root !important; } .grid { display: grid !important; } .inline-grid { display: inline-grid !important; } .hidden { display: none !important; } .flex-row { flex-direction: row !important; } .flex-row-reverse { flex-direction: row-reverse !important; } .flex-col { flex-direction: column !important; } .flex-col-reverse { flex-direction: column-reverse !important; } .flex-wrap { flex-wrap: wrap !important; } .flex-wrap-reverse { flex-wrap: wrap-reverse !important; } .flex-no-wrap { flex-wrap: nowrap !important; } .items-start { align-items: flex-start !important; } .items-end { align-items: flex-end !important; } .items-center { align-items: center !important; } .items-baseline { align-items: baseline !important; } .items-stretch { align-items: stretch !important; } .self-auto { align-self: auto !important; } .self-start { align-self: flex-start !important; } .self-end { align-self: flex-end !important; } .self-center { align-self: center !important; } .self-stretch { align-self: stretch !important; } .justify-start { justify-content: flex-start !important; } .justify-end { justify-content: flex-end !important; } .justify-center { justify-content: center !important; } .justify-between { justify-content: space-between !important; } .justify-around { justify-content: space-around !important; } .justify-evenly { justify-content: space-evenly !important; } .content-center { align-content: center !important; } .content-start { align-content: flex-start !important; } .content-end { align-content: flex-end !important; } .content-between { align-content: space-between !important; } .content-around { align-content: space-around !important; } .flex-0 { flex: 0 0 auto !important; } .flex-1 { flex: 1 1 0% !important; } .flex-auto { flex: 1 1 auto !important; } .flex-initial { flex: 0 1 auto !important; } .flex-none { flex: none !important; } .flex-grow-0 { flex-grow: 0 !important; } .flex-grow { flex-grow: 1 !important; } .flex-shrink-0 { flex-shrink: 0 !important; } .flex-shrink { flex-shrink: 1 !important; } .order-1 { order: 1 !important; } .order-2 { order: 2 !important; } .order-3 { order: 3 !important; } .order-4 { order: 4 !important; } .order-5 { order: 5 !important; } .order-6 { order: 6 !important; } .order-7 { order: 7 !important; } .order-8 { order: 8 !important; } .order-9 { order: 9 !important; } .order-10 { order: 10 !important; } .order-11 { order: 11 !important; } .order-12 { order: 12 !important; } .order-first { order: -9999 !important; } .order-last { order: 9999 !important; } .order-none { order: 0 !important; } .font-sans { font-family: Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !important; } .font-serif { font-family: Georgia, Cambria, "Times New Roman", Times, serif !important; } .font-mono { font-family: "IBM Plex Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; } .font-hairline { font-weight: 100 !important; } .font-thin { font-weight: 200 !important; } .font-light { font-weight: 300 !important; } .font-normal { font-weight: 400 !important; } .font-medium { font-weight: 500 !important; } .font-semibold { font-weight: 600 !important; } .font-bold { font-weight: 700 !important; } .font-extrabold { font-weight: 800 !important; } .font-black { font-weight: 900 !important; } .h-0 { height: 0 !important; } .h-1 { height: 0.25rem !important; } .h-2 { height: 0.5rem !important; } .h-3 { height: 0.75rem !important; } .h-4 { height: 1rem !important; } .h-5 { height: 1.25rem !important; } .h-6 { height: 1.5rem !important; } .h-8 { height: 2rem !important; } .h-10 { height: 2.5rem !important; } .h-12 { height: 3rem !important; } .h-14 { height: 3.5rem !important; } .h-16 { height: 4rem !important; } .h-18 { height: 4.5rem !important; } .h-20 { height: 5rem !important; } .h-22 { height: 5.5rem !important; } .h-24 { height: 6rem !important; } .h-26 { height: 6.5rem !important; } .h-28 { height: 7rem !important; } .h-30 { height: 7.5rem !important; } .h-32 { height: 8rem !important; } .h-36 { height: 9rem !important; } .h-40 { height: 10rem !important; } .h-48 { height: 12rem !important; } .h-50 { height: 12.5rem !important; } .h-56 { height: 14rem !important; } .h-60 { height: 15rem !important; } .h-64 { height: 16rem !important; } .h-80 { height: 20rem !important; } .h-90 { height: 24rem !important; } .h-100 { height: 25rem !important; } .h-120 { height: 30rem !important; } .h-128 { height: 32rem !important; } .h-140 { height: 35rem !important; } .h-160 { height: 40rem !important; } .h-180 { height: 45rem !important; } .h-192 { height: 48rem !important; } .h-200 { height: 50rem !important; } .h-240 { height: 60rem !important; } .h-256 { height: 64rem !important; } .h-280 { height: 70rem !important; } .h-320 { height: 80rem !important; } .h-360 { height: 90rem !important; } .h-400 { height: 100rem !important; } .h-480 { height: 120rem !important; } .h-auto { height: auto !important; } .h-px { height: 1px !important; } .h-2px { height: 2px !important; } .h-full { height: 100% !important; } .h-screen { height: 100vh !important; } .h-1\/2 { height: 50% !important; } .h-1\/3 { height: 33.33333% !important; } .h-2\/3 { height: 66.66667% !important; } .h-1\/4 { height: 25% !important; } .h-2\/4 { height: 50% !important; } .h-3\/4 { height: 75% !important; } .h-1\/5 { height: 20% !important; } .h-2\/5 { height: 40% !important; } .h-3\/5 { height: 60% !important; } .h-4\/5 { height: 80% !important; } .h-1\/12 { height: 8.33333% !important; } .h-2\/12 { height: 16.66667% !important; } .h-3\/12 { height: 25% !important; } .h-4\/12 { height: 33.33333% !important; } .h-5\/12 { height: 41.66667% !important; } .h-6\/12 { height: 50% !important; } .h-7\/12 { height: 58.33333% !important; } .h-8\/12 { height: 66.66667% !important; } .h-9\/12 { height: 75% !important; } .h-10\/12 { height: 83.33333% !important; } .h-11\/12 { height: 91.66667% !important; } .text-xs { font-size: 0.625rem !important; } .text-sm { font-size: 0.75rem !important; } .text-md { font-size: 0.8125rem !important; } .text-base { font-size: 0.875rem !important; } .text-lg { font-size: 1rem !important; } .text-xl { font-size: 1.125rem !important; } .text-2xl { font-size: 1.25rem !important; } .text-3xl { font-size: 1.5rem !important; } .text-4xl { font-size: 2rem !important; } .text-5xl { font-size: 2.25rem !important; } .text-6xl { font-size: 2.5rem !important; } .text-7xl { font-size: 3rem !important; } .text-8xl { font-size: 4rem !important; } .text-9xl { font-size: 6rem !important; } .text-10xl { font-size: 8rem !important; } .leading-3 { line-height: .75rem !important; } .leading-4 { line-height: 1rem !important; } .leading-5 { line-height: 1.25rem !important; } .leading-6 { line-height: 1.5rem !important; } .leading-7 { line-height: 1.75rem !important; } .leading-8 { line-height: 2rem !important; } .leading-9 { line-height: 2.25rem !important; } .leading-10 { line-height: 2.5rem !important; } .leading-none { line-height: 1 !important; } .leading-tight { line-height: 1.25 !important; } .leading-snug { line-height: 1.375 !important; } .leading-normal { line-height: 1.5 !important; } .leading-relaxed { line-height: 1.625 !important; } .leading-loose { line-height: 2 !important; } .list-inside { list-style-position: inside !important; } .list-outside { list-style-position: outside !important; } .list-none { list-style-type: none !important; } .list-disc { list-style-type: disc !important; } .list-decimal { list-style-type: decimal !important; } .m-0 { margin: 0 !important; } .m-1 { margin: 0.25rem !important; } .m-2 { margin: 0.5rem !important; } .m-3 { margin: 0.75rem !important; } .m-4 { margin: 1rem !important; } .m-5 { margin: 1.25rem !important; } .m-6 { margin: 1.5rem !important; } .m-8 { margin: 2rem !important; } .m-10 { margin: 2.5rem !important; } .m-12 { margin: 3rem !important; } .m-14 { margin: 3.5rem !important; } .m-16 { margin: 4rem !important; } .m-18 { margin: 4.5rem !important; } .m-20 { margin: 5rem !important; } .m-22 { margin: 5.5rem !important; } .m-24 { margin: 6rem !important; } .m-26 { margin: 6.5rem !important; } .m-28 { margin: 7rem !important; } .m-30 { margin: 7.5rem !important; } .m-32 { margin: 8rem !important; } .m-36 { margin: 9rem !important; } .m-40 { margin: 10rem !important; } .m-48 { margin: 12rem !important; } .m-56 { margin: 14rem !important; } .m-64 { margin: 16rem !important; } .m-auto { margin: auto !important; } .m-px { margin: 1px !important; } .m-2px { margin: 2px !important; } .-m-1 { margin: -0.25rem !important; } .-m-2 { margin: -0.5rem !important; } .-m-3 { margin: -0.75rem !important; } .-m-4 { margin: -1rem !important; } .-m-5 { margin: -1.25rem !important; } .-m-6 { margin: -1.5rem !important; } .-m-8 { margin: -2rem !important; } .-m-10 { margin: -2.5rem !important; } .-m-12 { margin: -3rem !important; } .-m-14 { margin: -3.5rem !important; } .-m-16 { margin: -4rem !important; } .-m-18 { margin: -4.5rem !important; } .-m-20 { margin: -5rem !important; } .-m-22 { margin: -5.5rem !important; } .-m-24 { margin: -6rem !important; } .-m-26 { margin: -6.5rem !important; } .-m-28 { margin: -7rem !important; } .-m-30 { margin: -7.5rem !important; } .-m-32 { margin: -8rem !important; } .-m-36 { margin: -9rem !important; } .-m-40 { margin: -10rem !important; } .-m-48 { margin: -12rem !important; } .-m-56 { margin: -14rem !important; } .-m-64 { margin: -16rem !important; } .-m-px { margin: -1px !important; } .-m-2px { margin: -2px !important; } .my-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .mx-0 { margin-left: 0 !important; margin-right: 0 !important; } .my-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .mx-1 { margin-left: 0.25rem !important; margin-right: 0.25rem !important; } .my-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .mx-2 { margin-left: 0.5rem !important; margin-right: 0.5rem !important; } .my-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .mx-3 { margin-left: 0.75rem !important; margin-right: 0.75rem !important; } .my-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .mx-4 { margin-left: 1rem !important; margin-right: 1rem !important; } .my-5 { margin-top: 1.25rem !important; margin-bottom: 1.25rem !important; } .mx-5 { margin-left: 1.25rem !important; margin-right: 1.25rem !important; } .my-6 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .mx-6 { margin-left: 1.5rem !important; margin-right: 1.5rem !important; } .my-8 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .mx-8 { margin-left: 2rem !important; margin-right: 2rem !important; } .my-10 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .mx-10 { margin-left: 2.5rem !important; margin-right: 2.5rem !important; } .my-12 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .mx-12 { margin-left: 3rem !important; margin-right: 3rem !important; } .my-14 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .mx-14 { margin-left: 3.5rem !important; margin-right: 3.5rem !important; } .my-16 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .mx-16 { margin-left: 4rem !important; margin-right: 4rem !important; } .my-18 { margin-top: 4.5rem !important; margin-bottom: 4.5rem !important; } .mx-18 { margin-left: 4.5rem !important; margin-right: 4.5rem !important; } .my-20 { margin-top: 5rem !important; margin-bottom: 5rem !important; } .mx-20 { margin-left: 5rem !important; margin-right: 5rem !important; } .my-22 { margin-top: 5.5rem !important; margin-bottom: 5.5rem !important; } .mx-22 { margin-left: 5.5rem !important; margin-right: 5.5rem !important; } .my-24 { margin-top: 6rem !important; margin-bottom: 6rem !important; } .mx-24 { margin-left: 6rem !important; margin-right: 6rem !important; } .my-26 { margin-top: 6.5rem !important; margin-bottom: 6.5rem !important; } .mx-26 { margin-left: 6.5rem !important; margin-right: 6.5rem !important; } .my-28 { margin-top: 7rem !important; margin-bottom: 7rem !important; } .mx-28 { margin-left: 7rem !important; margin-right: 7rem !important; } .my-30 { margin-top: 7.5rem !important; margin-bottom: 7.5rem !important; } .mx-30 { margin-left: 7.5rem !important; margin-right: 7.5rem !important; } .my-32 { margin-top: 8rem !important; margin-bottom: 8rem !important; } .mx-32 { margin-left: 8rem !important; margin-right: 8rem !important; } .my-36 { margin-top: 9rem !important; margin-bottom: 9rem !important; } .mx-36 { margin-left: 9rem !important; margin-right: 9rem !important; } .my-40 { margin-top: 10rem !important; margin-bottom: 10rem !important; } .mx-40 { margin-left: 10rem !important; margin-right: 10rem !important; } .my-48 { margin-top: 12rem !important; margin-bottom: 12rem !important; } .mx-48 { margin-left: 12rem !important; margin-right: 12rem !important; } .my-56 { margin-top: 14rem !important; margin-bottom: 14rem !important; } .mx-56 { margin-left: 14rem !important; margin-right: 14rem !important; } .my-64 { margin-top: 16rem !important; margin-bottom: 16rem !important; } .mx-64 { margin-left: 16rem !important; margin-right: 16rem !important; } .my-auto { margin-top: auto !important; margin-bottom: auto !important; } .mx-auto { margin-left: auto !important; margin-right: auto !important; } .my-px { margin-top: 1px !important; margin-bottom: 1px !important; } .mx-px { margin-left: 1px !important; margin-right: 1px !important; } .my-2px { margin-top: 2px !important; margin-bottom: 2px !important; } .mx-2px { margin-left: 2px !important; margin-right: 2px !important; } .-my-1 { margin-top: -0.25rem !important; margin-bottom: -0.25rem !important; } .-mx-1 { margin-left: -0.25rem !important; margin-right: -0.25rem !important; } .-my-2 { margin-top: -0.5rem !important; margin-bottom: -0.5rem !important; } .-mx-2 { margin-left: -0.5rem !important; margin-right: -0.5rem !important; } .-my-3 { margin-top: -0.75rem !important; margin-bottom: -0.75rem !important; } .-mx-3 { margin-left: -0.75rem !important; margin-right: -0.75rem !important; } .-my-4 { margin-top: -1rem !important; margin-bottom: -1rem !important; } .-mx-4 { margin-left: -1rem !important; margin-right: -1rem !important; } .-my-5 { margin-top: -1.25rem !important; margin-bottom: -1.25rem !important; } .-mx-5 { margin-left: -1.25rem !important; margin-right: -1.25rem !important; } .-my-6 { margin-top: -1.5rem !important; margin-bottom: -1.5rem !important; } .-mx-6 { margin-left: -1.5rem !important; margin-right: -1.5rem !important; } .-my-8 { margin-top: -2rem !important; margin-bottom: -2rem !important; } .-mx-8 { margin-left: -2rem !important; margin-right: -2rem !important; } .-my-10 { margin-top: -2.5rem !important; margin-bottom: -2.5rem !important; } .-mx-10 { margin-left: -2.5rem !important; margin-right: -2.5rem !important; } .-my-12 { margin-top: -3rem !important; margin-bottom: -3rem !important; } .-mx-12 { margin-left: -3rem !important; margin-right: -3rem !important; } .-my-14 { margin-top: -3.5rem !important; margin-bottom: -3.5rem !important; } .-mx-14 { margin-left: -3.5rem !important; margin-right: -3.5rem !important; } .-my-16 { margin-top: -4rem !important; margin-bottom: -4rem !important; } .-mx-16 { margin-left: -4rem !important; margin-right: -4rem !important; } .-my-18 { margin-top: -4.5rem !important; margin-bottom: -4.5rem !important; } .-mx-18 { margin-left: -4.5rem !important; margin-right: -4.5rem !important; } .-my-20 { margin-top: -5rem !important; margin-bottom: -5rem !important; } .-mx-20 { margin-left: -5rem !important; margin-right: -5rem !important; } .-my-22 { margin-top: -5.5rem !important; margin-bottom: -5.5rem !important; } .-mx-22 { margin-left: -5.5rem !important; margin-right: -5.5rem !important; } .-my-24 { margin-top: -6rem !important; margin-bottom: -6rem !important; } .-mx-24 { margin-left: -6rem !important; margin-right: -6rem !important; } .-my-26 { margin-top: -6.5rem !important; margin-bottom: -6.5rem !important; } .-mx-26 { margin-left: -6.5rem !important; margin-right: -6.5rem !important; } .-my-28 { margin-top: -7rem !important; margin-bottom: -7rem !important; } .-mx-28 { margin-left: -7rem !important; margin-right: -7rem !important; } .-my-30 { margin-top: -7.5rem !important; margin-bottom: -7.5rem !important; } .-mx-30 { margin-left: -7.5rem !important; margin-right: -7.5rem !important; } .-my-32 { margin-top: -8rem !important; margin-bottom: -8rem !important; } .-mx-32 { margin-left: -8rem !important; margin-right: -8rem !important; } .-my-36 { margin-top: -9rem !important; margin-bottom: -9rem !important; } .-mx-36 { margin-left: -9rem !important; margin-right: -9rem !important; } .-my-40 { margin-top: -10rem !important; margin-bottom: -10rem !important; } .-mx-40 { margin-left: -10rem !important; margin-right: -10rem !important; } .-my-48 { margin-top: -12rem !important; margin-bottom: -12rem !important; } .-mx-48 { margin-left: -12rem !important; margin-right: -12rem !important; } .-my-56 { margin-top: -14rem !important; margin-bottom: -14rem !important; } .-mx-56 { margin-left: -14rem !important; margin-right: -14rem !important; } .-my-64 { margin-top: -16rem !important; margin-bottom: -16rem !important; } .-mx-64 { margin-left: -16rem !important; margin-right: -16rem !important; } .-my-px { margin-top: -1px !important; margin-bottom: -1px !important; } .-mx-px { margin-left: -1px !important; margin-right: -1px !important; } .-my-2px { margin-top: -2px !important; margin-bottom: -2px !important; } .-mx-2px { margin-left: -2px !important; margin-right: -2px !important; } .mt-0 { margin-top: 0 !important; } .mr-0 { margin-right: 0 !important; } .mb-0 { margin-bottom: 0 !important; } .ml-0 { margin-left: 0 !important; } .mt-1 { margin-top: 0.25rem !important; } .mr-1 { margin-right: 0.25rem !important; } .mb-1 { margin-bottom: 0.25rem !important; } .ml-1 { margin-left: 0.25rem !important; } .mt-2 { margin-top: 0.5rem !important; } .mr-2 { margin-right: 0.5rem !important; } .mb-2 { margin-bottom: 0.5rem !important; } .ml-2 { margin-left: 0.5rem !important; } .mt-3 { margin-top: 0.75rem !important; } .mr-3 { margin-right: 0.75rem !important; } .mb-3 { margin-bottom: 0.75rem !important; } .ml-3 { margin-left: 0.75rem !important; } .mt-4 { margin-top: 1rem !important; } .mr-4 { margin-right: 1rem !important; } .mb-4 { margin-bottom: 1rem !important; } .ml-4 { margin-left: 1rem !important; } .mt-5 { margin-top: 1.25rem !important; } .mr-5 { margin-right: 1.25rem !important; } .mb-5 { margin-bottom: 1.25rem !important; } .ml-5 { margin-left: 1.25rem !important; } .mt-6 { margin-top: 1.5rem !important; } .mr-6 { margin-right: 1.5rem !important; } .mb-6 { margin-bottom: 1.5rem !important; } .ml-6 { margin-left: 1.5rem !important; } .mt-8 { margin-top: 2rem !important; } .mr-8 { margin-right: 2rem !important; } .mb-8 { margin-bottom: 2rem !important; } .ml-8 { margin-left: 2rem !important; } .mt-10 { margin-top: 2.5rem !important; } .mr-10 { margin-right: 2.5rem !important; } .mb-10 { margin-bottom: 2.5rem !important; } .ml-10 { margin-left: 2.5rem !important; } .mt-12 { margin-top: 3rem !important; } .mr-12 { margin-right: 3rem !important; } .mb-12 { margin-bottom: 3rem !important; } .ml-12 { margin-left: 3rem !important; } .mt-14 { margin-top: 3.5rem !important; } .mr-14 { margin-right: 3.5rem !important; } .mb-14 { margin-bottom: 3.5rem !important; } .ml-14 { margin-left: 3.5rem !important; } .mt-16 { margin-top: 4rem !important; } .mr-16 { margin-right: 4rem !important; } .mb-16 { margin-bottom: 4rem !important; } .ml-16 { margin-left: 4rem !important; } .mt-18 { margin-top: 4.5rem !important; } .mr-18 { margin-right: 4.5rem !important; } .mb-18 { margin-bottom: 4.5rem !important; } .ml-18 { margin-left: 4.5rem !important; } .mt-20 { margin-top: 5rem !important; } .mr-20 { margin-right: 5rem !important; } .mb-20 { margin-bottom: 5rem !important; } .ml-20 { margin-left: 5rem !important; } .mt-22 { margin-top: 5.5rem !important; } .mr-22 { margin-right: 5.5rem !important; } .mb-22 { margin-bottom: 5.5rem !important; } .ml-22 { margin-left: 5.5rem !important; } .mt-24 { margin-top: 6rem !important; } .mr-24 { margin-right: 6rem !important; } .mb-24 { margin-bottom: 6rem !important; } .ml-24 { margin-left: 6rem !important; } .mt-26 { margin-top: 6.5rem !important; } .mr-26 { margin-right: 6.5rem !important; } .mb-26 { margin-bottom: 6.5rem !important; } .ml-26 { margin-left: 6.5rem !important; } .mt-28 { margin-top: 7rem !important; } .mr-28 { margin-right: 7rem !important; } .mb-28 { margin-bottom: 7rem !important; } .ml-28 { margin-left: 7rem !important; } .mt-30 { margin-top: 7.5rem !important; } .mr-30 { margin-right: 7.5rem !important; } .mb-30 { margin-bottom: 7.5rem !important; } .ml-30 { margin-left: 7.5rem !important; } .mt-32 { margin-top: 8rem !important; } .mr-32 { margin-right: 8rem !important; } .mb-32 { margin-bottom: 8rem !important; } .ml-32 { margin-left: 8rem !important; } .mt-36 { margin-top: 9rem !important; } .mr-36 { margin-right: 9rem !important; } .mb-36 { margin-bottom: 9rem !important; } .ml-36 { margin-left: 9rem !important; } .mt-40 { margin-top: 10rem !important; } .mr-40 { margin-right: 10rem !important; } .mb-40 { margin-bottom: 10rem !important; } .ml-40 { margin-left: 10rem !important; } .mt-48 { margin-top: 12rem !important; } .mr-48 { margin-right: 12rem !important; } .mb-48 { margin-bottom: 12rem !important; } .ml-48 { margin-left: 12rem !important; } .mt-56 { margin-top: 14rem !important; } .mr-56 { margin-right: 14rem !important; } .mb-56 { margin-bottom: 14rem !important; } .ml-56 { margin-left: 14rem !important; } .mt-64 { margin-top: 16rem !important; } .mr-64 { margin-right: 16rem !important; } .mb-64 { margin-bottom: 16rem !important; } .ml-64 { margin-left: 16rem !important; } .mt-auto { margin-top: auto !important; } .mr-auto { margin-right: auto !important; } .mb-auto { margin-bottom: auto !important; } .ml-auto { margin-left: auto !important; } .mt-px { margin-top: 1px !important; } .mr-px { margin-right: 1px !important; } .mb-px { margin-bottom: 1px !important; } .ml-px { margin-left: 1px !important; } .mt-2px { margin-top: 2px !important; } .mr-2px { margin-right: 2px !important; } .mb-2px { margin-bottom: 2px !important; } .ml-2px { margin-left: 2px !important; } .-mt-1 { margin-top: -0.25rem !important; } .-mr-1 { margin-right: -0.25rem !important; } .-mb-1 { margin-bottom: -0.25rem !important; } .-ml-1 { margin-left: -0.25rem !important; } .-mt-2 { margin-top: -0.5rem !important; } .-mr-2 { margin-right: -0.5rem !important; } .-mb-2 { margin-bottom: -0.5rem !important; } .-ml-2 { margin-left: -0.5rem !important; } .-mt-3 { margin-top: -0.75rem !important; } .-mr-3 { margin-right: -0.75rem !important; } .-mb-3 { margin-bottom: -0.75rem !important; } .-ml-3 { margin-left: -0.75rem !important; } .-mt-4 { margin-top: -1rem !important; } .-mr-4 { margin-right: -1rem !important; } .-mb-4 { margin-bottom: -1rem !important; } .-ml-4 { margin-left: -1rem !important; } .-mt-5 { margin-top: -1.25rem !important; } .-mr-5 { margin-right: -1.25rem !important; } .-mb-5 { margin-bottom: -1.25rem !important; } .-ml-5 { margin-left: -1.25rem !important; } .-mt-6 { margin-top: -1.5rem !important; } .-mr-6 { margin-right: -1.5rem !important; } .-mb-6 { margin-bottom: -1.5rem !important; } .-ml-6 { margin-left: -1.5rem !important; } .-mt-8 { margin-top: -2rem !important; } .-mr-8 { margin-right: -2rem !important; } .-mb-8 { margin-bottom: -2rem !important; } .-ml-8 { margin-left: -2rem !important; } .-mt-10 { margin-top: -2.5rem !important; } .-mr-10 { margin-right: -2.5rem !important; } .-mb-10 { margin-bottom: -2.5rem !important; } .-ml-10 { margin-left: -2.5rem !important; } .-mt-12 { margin-top: -3rem !important; } .-mr-12 { margin-right: -3rem !important; } .-mb-12 { margin-bottom: -3rem !important; } .-ml-12 { margin-left: -3rem !important; } .-mt-14 { margin-top: -3.5rem !important; } .-mr-14 { margin-right: -3.5rem !important; } .-mb-14 { margin-bottom: -3.5rem !important; } .-ml-14 { margin-left: -3.5rem !important; } .-mt-16 { margin-top: -4rem !important; } .-mr-16 { margin-right: -4rem !important; } .-mb-16 { margin-bottom: -4rem !important; } .-ml-16 { margin-left: -4rem !important; } .-mt-18 { margin-top: -4.5rem !important; } .-mr-18 { margin-right: -4.5rem !important; } .-mb-18 { margin-bottom: -4.5rem !important; } .-ml-18 { margin-left: -4.5rem !important; } .-mt-20 { margin-top: -5rem !important; } .-mr-20 { margin-right: -5rem !important; } .-mb-20 { margin-bottom: -5rem !important; } .-ml-20 { margin-left: -5rem !important; } .-mt-22 { margin-top: -5.5rem !important; } .-mr-22 { margin-right: -5.5rem !important; } .-mb-22 { margin-bottom: -5.5rem !important; } .-ml-22 { margin-left: -5.5rem !important; } .-mt-24 { margin-top: -6rem !important; } .-mr-24 { margin-right: -6rem !important; } .-mb-24 { margin-bottom: -6rem !important; } .-ml-24 { margin-left: -6rem !important; } .-mt-26 { margin-top: -6.5rem !important; } .-mr-26 { margin-right: -6.5rem !important; } .-mb-26 { margin-bottom: -6.5rem !important; } .-ml-26 { margin-left: -6.5rem !important; } .-mt-28 { margin-top: -7rem !important; } .-mr-28 { margin-right: -7rem !important; } .-mb-28 { margin-bottom: -7rem !important; } .-ml-28 { margin-left: -7rem !important; } .-mt-30 { margin-top: -7.5rem !important; } .-mr-30 { margin-right: -7.5rem !important; } .-mb-30 { margin-bottom: -7.5rem !important; } .-ml-30 { margin-left: -7.5rem !important; } .-mt-32 { margin-top: -8rem !important; } .-mr-32 { margin-right: -8rem !important; } .-mb-32 { margin-bottom: -8rem !important; } .-ml-32 { margin-left: -8rem !important; } .-mt-36 { margin-top: -9rem !important; } .-mr-36 { margin-right: -9rem !important; } .-mb-36 { margin-bottom: -9rem !important; } .-ml-36 { margin-left: -9rem !important; } .-mt-40 { margin-top: -10rem !important; } .-mr-40 { margin-right: -10rem !important; } .-mb-40 { margin-bottom: -10rem !important; } .-ml-40 { margin-left: -10rem !important; } .-mt-48 { margin-top: -12rem !important; } .-mr-48 { margin-right: -12rem !important; } .-mb-48 { margin-bottom: -12rem !important; } .-ml-48 { margin-left: -12rem !important; } .-mt-56 { margin-top: -14rem !important; } .-mr-56 { margin-right: -14rem !important; } .-mb-56 { margin-bottom: -14rem !important; } .-ml-56 { margin-left: -14rem !important; } .-mt-64 { margin-top: -16rem !important; } .-mr-64 { margin-right: -16rem !important; } .-mb-64 { margin-bottom: -16rem !important; } .-ml-64 { margin-left: -16rem !important; } .-mt-px { margin-top: -1px !important; } .-mr-px { margin-right: -1px !important; } .-mb-px { margin-bottom: -1px !important; } .-ml-px { margin-left: -1px !important; } .-mt-2px { margin-top: -2px !important; } .-mr-2px { margin-right: -2px !important; } .-mb-2px { margin-bottom: -2px !important; } .-ml-2px { margin-left: -2px !important; } .max-h-0 { max-height: 0 !important; } .max-h-1 { max-height: 0.25rem !important; } .max-h-2 { max-height: 0.5rem !important; } .max-h-3 { max-height: 0.75rem !important; } .max-h-4 { max-height: 1rem !important; } .max-h-5 { max-height: 1.25rem !important; } .max-h-6 { max-height: 1.5rem !important; } .max-h-8 { max-height: 2rem !important; } .max-h-10 { max-height: 2.5rem !important; } .max-h-12 { max-height: 3rem !important; } .max-h-14 { max-height: 3.5rem !important; } .max-h-16 { max-height: 4rem !important; } .max-h-18 { max-height: 4.5rem !important; } .max-h-20 { max-height: 5rem !important; } .max-h-22 { max-height: 5.5rem !important; } .max-h-24 { max-height: 6rem !important; } .max-h-26 { max-height: 6.5rem !important; } .max-h-28 { max-height: 7rem !important; } .max-h-30 { max-height: 7.5rem !important; } .max-h-32 { max-height: 8rem !important; } .max-h-36 { max-height: 9rem !important; } .max-h-40 { max-height: 10rem !important; } .max-h-48 { max-height: 12rem !important; } .max-h-50 { max-height: 12.5rem !important; } .max-h-56 { max-height: 14rem !important; } .max-h-60 { max-height: 15rem !important; } .max-h-64 { max-height: 16rem !important; } .max-h-80 { max-height: 20rem !important; } .max-h-90 { max-height: 24rem !important; } .max-h-100 { max-height: 25rem !important; } .max-h-120 { max-height: 30rem !important; } .max-h-128 { max-height: 32rem !important; } .max-h-140 { max-height: 35rem !important; } .max-h-160 { max-height: 40rem !important; } .max-h-180 { max-height: 45rem !important; } .max-h-192 { max-height: 48rem !important; } .max-h-200 { max-height: 50rem !important; } .max-h-240 { max-height: 60rem !important; } .max-h-256 { max-height: 64rem !important; } .max-h-280 { max-height: 70rem !important; } .max-h-320 { max-height: 80rem !important; } .max-h-360 { max-height: 90rem !important; } .max-h-400 { max-height: 100rem !important; } .max-h-480 { max-height: 120rem !important; } .max-h-full { max-height: 100% !important; } .max-h-screen { max-height: 100vh !important; } .max-h-none { max-height: none !important; } .max-h-px { max-height: 1px !important; } .max-h-2px { max-height: 2px !important; } .max-h-1\/2 { max-height: 50% !important; } .max-h-1\/3 { max-height: 33.33333% !important; } .max-h-2\/3 { max-height: 66.66667% !important; } .max-h-1\/4 { max-height: 25% !important; } .max-h-2\/4 { max-height: 50% !important; } .max-h-3\/4 { max-height: 75% !important; } .max-h-1\/5 { max-height: 20% !important; } .max-h-2\/5 { max-height: 40% !important; } .max-h-3\/5 { max-height: 60% !important; } .max-h-4\/5 { max-height: 80% !important; } .max-h-1\/12 { max-height: 8.33333% !important; } .max-h-2\/12 { max-height: 16.66667% !important; } .max-h-3\/12 { max-height: 25% !important; } .max-h-4\/12 { max-height: 33.33333% !important; } .max-h-5\/12 { max-height: 41.66667% !important; } .max-h-6\/12 { max-height: 50% !important; } .max-h-7\/12 { max-height: 58.33333% !important; } .max-h-8\/12 { max-height: 66.66667% !important; } .max-h-9\/12 { max-height: 75% !important; } .max-h-10\/12 { max-height: 83.33333% !important; } .max-h-11\/12 { max-height: 91.66667% !important; } .max-w-0 { max-width: 0 !important; } .max-w-1 { max-width: 0.25rem !important; } .max-w-2 { max-width: 0.5rem !important; } .max-w-3 { max-width: 0.75rem !important; } .max-w-4 { max-width: 1rem !important; } .max-w-5 { max-width: 1.25rem !important; } .max-w-6 { max-width: 1.5rem !important; } .max-w-8 { max-width: 2rem !important; } .max-w-10 { max-width: 2.5rem !important; } .max-w-12 { max-width: 3rem !important; } .max-w-14 { max-width: 3.5rem !important; } .max-w-16 { max-width: 4rem !important; } .max-w-18 { max-width: 4.5rem !important; } .max-w-20 { max-width: 5rem !important; } .max-w-22 { max-width: 5.5rem !important; } .max-w-24 { max-width: 6rem !important; } .max-w-26 { max-width: 6.5rem !important; } .max-w-28 { max-width: 7rem !important; } .max-w-30 { max-width: 7.5rem !important; } .max-w-32 { max-width: 8rem !important; } .max-w-36 { max-width: 9rem !important; } .max-w-40 { max-width: 10rem !important; } .max-w-48 { max-width: 12rem !important; } .max-w-50 { max-width: 12.5rem !important; } .max-w-56 { max-width: 14rem !important; } .max-w-60 { max-width: 15rem !important; } .max-w-64 { max-width: 16rem !important; } .max-w-80 { max-width: 20rem !important; } .max-w-90 { max-width: 24rem !important; } .max-w-100 { max-width: 25rem !important; } .max-w-120 { max-width: 30rem !important; } .max-w-128 { max-width: 32rem !important; } .max-w-140 { max-width: 35rem !important; } .max-w-160 { max-width: 40rem !important; } .max-w-180 { max-width: 45rem !important; } .max-w-192 { max-width: 48rem !important; } .max-w-200 { max-width: 50rem !important; } .max-w-240 { max-width: 60rem !important; } .max-w-256 { max-width: 64rem !important; } .max-w-280 { max-width: 70rem !important; } .max-w-320 { max-width: 80rem !important; } .max-w-360 { max-width: 90rem !important; } .max-w-400 { max-width: 100rem !important; } .max-w-480 { max-width: 120rem !important; } .max-w-none { max-width: none !important; } .max-w-xs { max-width: 20rem !important; } .max-w-sm { max-width: 24rem !important; } .max-w-md { max-width: 28rem !important; } .max-w-lg { max-width: 32rem !important; } .max-w-xl { max-width: 36rem !important; } .max-w-2xl { max-width: 42rem !important; } .max-w-3xl { max-width: 48rem !important; } .max-w-4xl { max-width: 56rem !important; } .max-w-5xl { max-width: 64rem !important; } .max-w-6xl { max-width: 72rem !important; } .max-w-full { max-width: 100% !important; } .max-w-screen { max-width: 100vw !important; } .max-w-px { max-width: 1px !important; } .max-w-2px { max-width: 2px !important; } .max-w-1\/2 { max-width: 50% !important; } .max-w-1\/3 { max-width: 33.33333% !important; } .max-w-2\/3 { max-width: 66.66667% !important; } .max-w-1\/4 { max-width: 25% !important; } .max-w-2\/4 { max-width: 50% !important; } .max-w-3\/4 { max-width: 75% !important; } .max-w-1\/5 { max-width: 20% !important; } .max-w-2\/5 { max-width: 40% !important; } .max-w-3\/5 { max-width: 60% !important; } .max-w-4\/5 { max-width: 80% !important; } .max-w-1\/12 { max-width: 8.33333% !important; } .max-w-2\/12 { max-width: 16.66667% !important; } .max-w-3\/12 { max-width: 25% !important; } .max-w-4\/12 { max-width: 33.33333% !important; } .max-w-5\/12 { max-width: 41.66667% !important; } .max-w-6\/12 { max-width: 50% !important; } .max-w-7\/12 { max-width: 58.33333% !important; } .max-w-8\/12 { max-width: 66.66667% !important; } .max-w-9\/12 { max-width: 75% !important; } .max-w-10\/12 { max-width: 83.33333% !important; } .max-w-11\/12 { max-width: 91.66667% !important; } .min-h-0 { min-height: 0 !important; } .min-h-1 { min-height: 0.25rem !important; } .min-h-2 { min-height: 0.5rem !important; } .min-h-3 { min-height: 0.75rem !important; } .min-h-4 { min-height: 1rem !important; } .min-h-5 { min-height: 1.25rem !important; } .min-h-6 { min-height: 1.5rem !important; } .min-h-8 { min-height: 2rem !important; } .min-h-10 { min-height: 2.5rem !important; } .min-h-12 { min-height: 3rem !important; } .min-h-14 { min-height: 3.5rem !important; } .min-h-16 { min-height: 4rem !important; } .min-h-18 { min-height: 4.5rem !important; } .min-h-20 { min-height: 5rem !important; } .min-h-22 { min-height: 5.5rem !important; } .min-h-24 { min-height: 6rem !important; } .min-h-26 { min-height: 6.5rem !important; } .min-h-28 { min-height: 7rem !important; } .min-h-30 { min-height: 7.5rem !important; } .min-h-32 { min-height: 8rem !important; } .min-h-36 { min-height: 9rem !important; } .min-h-40 { min-height: 10rem !important; } .min-h-48 { min-height: 12rem !important; } .min-h-50 { min-height: 12.5rem !important; } .min-h-56 { min-height: 14rem !important; } .min-h-60 { min-height: 15rem !important; } .min-h-64 { min-height: 16rem !important; } .min-h-80 { min-height: 20rem !important; } .min-h-90 { min-height: 24rem !important; } .min-h-100 { min-height: 25rem !important; } .min-h-120 { min-height: 30rem !important; } .min-h-128 { min-height: 32rem !important; } .min-h-140 { min-height: 35rem !important; } .min-h-160 { min-height: 40rem !important; } .min-h-180 { min-height: 45rem !important; } .min-h-192 { min-height: 48rem !important; } .min-h-200 { min-height: 50rem !important; } .min-h-240 { min-height: 60rem !important; } .min-h-256 { min-height: 64rem !important; } .min-h-280 { min-height: 70rem !important; } .min-h-320 { min-height: 80rem !important; } .min-h-360 { min-height: 90rem !important; } .min-h-400 { min-height: 100rem !important; } .min-h-480 { min-height: 120rem !important; } .min-h-full { min-height: 100% !important; } .min-h-screen { min-height: 100vh !important; } .min-h-px { min-height: 1px !important; } .min-h-2px { min-height: 2px !important; } .min-h-1\/2 { min-height: 50% !important; } .min-h-1\/3 { min-height: 33.33333% !important; } .min-h-2\/3 { min-height: 66.66667% !important; } .min-h-1\/4 { min-height: 25% !important; } .min-h-2\/4 { min-height: 50% !important; } .min-h-3\/4 { min-height: 75% !important; } .min-h-1\/5 { min-height: 20% !important; } .min-h-2\/5 { min-height: 40% !important; } .min-h-3\/5 { min-height: 60% !important; } .min-h-4\/5 { min-height: 80% !important; } .min-h-1\/12 { min-height: 8.33333% !important; } .min-h-2\/12 { min-height: 16.66667% !important; } .min-h-3\/12 { min-height: 25% !important; } .min-h-4\/12 { min-height: 33.33333% !important; } .min-h-5\/12 { min-height: 41.66667% !important; } .min-h-6\/12 { min-height: 50% !important; } .min-h-7\/12 { min-height: 58.33333% !important; } .min-h-8\/12 { min-height: 66.66667% !important; } .min-h-9\/12 { min-height: 75% !important; } .min-h-10\/12 { min-height: 83.33333% !important; } .min-h-11\/12 { min-height: 91.66667% !important; } .min-w-0 { min-width: 0 !important; } .min-w-1 { min-width: 0.25rem !important; } .min-w-2 { min-width: 0.5rem !important; } .min-w-3 { min-width: 0.75rem !important; } .min-w-4 { min-width: 1rem !important; } .min-w-5 { min-width: 1.25rem !important; } .min-w-6 { min-width: 1.5rem !important; } .min-w-8 { min-width: 2rem !important; } .min-w-10 { min-width: 2.5rem !important; } .min-w-12 { min-width: 3rem !important; } .min-w-14 { min-width: 3.5rem !important; } .min-w-16 { min-width: 4rem !important; } .min-w-18 { min-width: 4.5rem !important; } .min-w-20 { min-width: 5rem !important; } .min-w-22 { min-width: 5.5rem !important; } .min-w-24 { min-width: 6rem !important; } .min-w-26 { min-width: 6.5rem !important; } .min-w-28 { min-width: 7rem !important; } .min-w-30 { min-width: 7.5rem !important; } .min-w-32 { min-width: 8rem !important; } .min-w-36 { min-width: 9rem !important; } .min-w-40 { min-width: 10rem !important; } .min-w-48 { min-width: 12rem !important; } .min-w-50 { min-width: 12.5rem !important; } .min-w-56 { min-width: 14rem !important; } .min-w-60 { min-width: 15rem !important; } .min-w-64 { min-width: 16rem !important; } .min-w-80 { min-width: 20rem !important; } .min-w-90 { min-width: 24rem !important; } .min-w-100 { min-width: 25rem !important; } .min-w-120 { min-width: 30rem !important; } .min-w-128 { min-width: 32rem !important; } .min-w-140 { min-width: 35rem !important; } .min-w-160 { min-width: 40rem !important; } .min-w-180 { min-width: 45rem !important; } .min-w-192 { min-width: 48rem !important; } .min-w-200 { min-width: 50rem !important; } .min-w-240 { min-width: 60rem !important; } .min-w-256 { min-width: 64rem !important; } .min-w-280 { min-width: 70rem !important; } .min-w-320 { min-width: 80rem !important; } .min-w-360 { min-width: 90rem !important; } .min-w-400 { min-width: 100rem !important; } .min-w-480 { min-width: 120rem !important; } .min-w-full { min-width: 100% !important; } .min-w-screen { min-width: 100vw !important; } .min-w-px { min-width: 1px !important; } .min-w-2px { min-width: 2px !important; } .min-w-1\/2 { min-width: 50% !important; } .min-w-1\/3 { min-width: 33.33333% !important; } .min-w-2\/3 { min-width: 66.66667% !important; } .min-w-1\/4 { min-width: 25% !important; } .min-w-2\/4 { min-width: 50% !important; } .min-w-3\/4 { min-width: 75% !important; } .min-w-1\/5 { min-width: 20% !important; } .min-w-2\/5 { min-width: 40% !important; } .min-w-3\/5 { min-width: 60% !important; } .min-w-4\/5 { min-width: 80% !important; } .min-w-1\/12 { min-width: 8.33333% !important; } .min-w-2\/12 { min-width: 16.66667% !important; } .min-w-3\/12 { min-width: 25% !important; } .min-w-4\/12 { min-width: 33.33333% !important; } .min-w-5\/12 { min-width: 41.66667% !important; } .min-w-6\/12 { min-width: 50% !important; } .min-w-7\/12 { min-width: 58.33333% !important; } .min-w-8\/12 { min-width: 66.66667% !important; } .min-w-9\/12 { min-width: 75% !important; } .min-w-10\/12 { min-width: 83.33333% !important; } .min-w-11\/12 { min-width: 91.66667% !important; } .object-contain { -o-object-fit: contain !important; object-fit: contain !important; } .object-cover { -o-object-fit: cover !important; object-fit: cover !important; } .object-fill { -o-object-fit: fill !important; object-fit: fill !important; } .object-none { -o-object-fit: none !important; object-fit: none !important; } .object-scale-down { -o-object-fit: scale-down !important; object-fit: scale-down !important; } .object-bottom { -o-object-position: bottom !important; object-position: bottom !important; } .object-center { -o-object-position: center !important; object-position: center !important; } .object-left { -o-object-position: left !important; object-position: left !important; } .object-left-bottom { -o-object-position: left bottom !important; object-position: left bottom !important; } .object-left-top { -o-object-position: left top !important; object-position: left top !important; } .object-right { -o-object-position: right !important; object-position: right !important; } .object-right-bottom { -o-object-position: right bottom !important; object-position: right bottom !important; } .object-right-top { -o-object-position: right top !important; object-position: right top !important; } .object-top { -o-object-position: top !important; object-position: top !important; } .opacity-0 { opacity: 0 !important; } .opacity-12 { opacity: 0.12 !important; } .opacity-25 { opacity: 0.25 !important; } .opacity-38 { opacity: 0.38 !important; } .opacity-50 { opacity: 0.5 !important; } .opacity-54 { opacity: 0.54 !important; } .opacity-70 { opacity: 0.70 !important; } .opacity-75 { opacity: 0.75 !important; } .opacity-84 { opacity: 0.84 !important; } .opacity-100 { opacity: 1 !important; } .hover\:opacity-0:hover { opacity: 0 !important; } .hover\:opacity-12:hover { opacity: 0.12 !important; } .hover\:opacity-25:hover { opacity: 0.25 !important; } .hover\:opacity-38:hover { opacity: 0.38 !important; } .hover\:opacity-50:hover { opacity: 0.5 !important; } .hover\:opacity-54:hover { opacity: 0.54 !important; } .hover\:opacity-70:hover { opacity: 0.70 !important; } .hover\:opacity-75:hover { opacity: 0.75 !important; } .hover\:opacity-84:hover { opacity: 0.84 !important; } .hover\:opacity-100:hover { opacity: 1 !important; } .focus\:opacity-0:focus { opacity: 0 !important; } .focus\:opacity-12:focus { opacity: 0.12 !important; } .focus\:opacity-25:focus { opacity: 0.25 !important; } .focus\:opacity-38:focus { opacity: 0.38 !important; } .focus\:opacity-50:focus { opacity: 0.5 !important; } .focus\:opacity-54:focus { opacity: 0.54 !important; } .focus\:opacity-70:focus { opacity: 0.70 !important; } .focus\:opacity-75:focus { opacity: 0.75 !important; } .focus\:opacity-84:focus { opacity: 0.84 !important; } .focus\:opacity-100:focus { opacity: 1 !important; } .outline-none { outline: 0 !important; } .focus\:outline-none:focus { outline: 0 !important; } .overflow-auto { overflow: auto !important; } .overflow-hidden { overflow: hidden !important; } .overflow-visible { overflow: visible !important; } .overflow-scroll { overflow: scroll !important; } .overflow-x-auto { overflow-x: auto !important; } .overflow-y-auto { overflow-y: auto !important; } .overflow-x-hidden { overflow-x: hidden !important; } .overflow-y-hidden { overflow-y: hidden !important; } .overflow-x-visible { overflow-x: visible !important; } .overflow-y-visible { overflow-y: visible !important; } .overflow-x-scroll { overflow-x: scroll !important; } .overflow-y-scroll { overflow-y: scroll !important; } .scrolling-touch { -webkit-overflow-scrolling: touch !important; } .scrolling-auto { -webkit-overflow-scrolling: auto !important; } .p-0 { padding: 0 !important; } .p-1 { padding: 0.25rem !important; } .p-2 { padding: 0.5rem !important; } .p-3 { padding: 0.75rem !important; } .p-4 { padding: 1rem !important; } .p-5 { padding: 1.25rem !important; } .p-6 { padding: 1.5rem !important; } .p-8 { padding: 2rem !important; } .p-10 { padding: 2.5rem !important; } .p-12 { padding: 3rem !important; } .p-14 { padding: 3.5rem !important; } .p-16 { padding: 4rem !important; } .p-18 { padding: 4.5rem !important; } .p-20 { padding: 5rem !important; } .p-22 { padding: 5.5rem !important; } .p-24 { padding: 6rem !important; } .p-26 { padding: 6.5rem !important; } .p-28 { padding: 7rem !important; } .p-30 { padding: 7.5rem !important; } .p-32 { padding: 8rem !important; } .p-36 { padding: 9rem !important; } .p-40 { padding: 10rem !important; } .p-48 { padding: 12rem !important; } .p-56 { padding: 14rem !important; } .p-64 { padding: 16rem !important; } .p-px { padding: 1px !important; } .p-2px { padding: 2px !important; } .py-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .px-0 { padding-left: 0 !important; padding-right: 0 !important; } .py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .px-1 { padding-left: 0.25rem !important; padding-right: 0.25rem !important; } .py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .px-2 { padding-left: 0.5rem !important; padding-right: 0.5rem !important; } .py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .px-3 { padding-left: 0.75rem !important; padding-right: 0.75rem !important; } .py-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .px-4 { padding-left: 1rem !important; padding-right: 1rem !important; } .py-5 { padding-top: 1.25rem !important; padding-bottom: 1.25rem !important; } .px-5 { padding-left: 1.25rem !important; padding-right: 1.25rem !important; } .py-6 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .px-6 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } .py-8 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .px-8 { padding-left: 2rem !important; padding-right: 2rem !important; } .py-10 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .px-10 { padding-left: 2.5rem !important; padding-right: 2.5rem !important; } .py-12 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .px-12 { padding-left: 3rem !important; padding-right: 3rem !important; } .py-14 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .px-14 { padding-left: 3.5rem !important; padding-right: 3.5rem !important; } .py-16 { padding-top: 4rem !important; padding-bottom: 4rem !important; } .px-16 { padding-left: 4rem !important; padding-right: 4rem !important; } .py-18 { padding-top: 4.5rem !important; padding-bottom: 4.5rem !important; } .px-18 { padding-left: 4.5rem !important; padding-right: 4.5rem !important; } .py-20 { padding-top: 5rem !important; padding-bottom: 5rem !important; } .px-20 { padding-left: 5rem !important; padding-right: 5rem !important; } .py-22 { padding-top: 5.5rem !important; padding-bottom: 5.5rem !important; } .px-22 { padding-left: 5.5rem !important; padding-right: 5.5rem !important; } .py-24 { padding-top: 6rem !important; padding-bottom: 6rem !important; } .px-24 { padding-left: 6rem !important; padding-right: 6rem !important; } .py-26 { padding-top: 6.5rem !important; padding-bottom: 6.5rem !important; } .px-26 { padding-left: 6.5rem !important; padding-right: 6.5rem !important; } .py-28 { padding-top: 7rem !important; padding-bottom: 7rem !important; } .px-28 { padding-left: 7rem !important; padding-right: 7rem !important; } .py-30 { padding-top: 7.5rem !important; padding-bottom: 7.5rem !important; } .px-30 { padding-left: 7.5rem !important; padding-right: 7.5rem !important; } .py-32 { padding-top: 8rem !important; padding-bottom: 8rem !important; } .px-32 { padding-left: 8rem !important; padding-right: 8rem !important; } .py-36 { padding-top: 9rem !important; padding-bottom: 9rem !important; } .px-36 { padding-left: 9rem !important; padding-right: 9rem !important; } .py-40 { padding-top: 10rem !important; padding-bottom: 10rem !important; } .px-40 { padding-left: 10rem !important; padding-right: 10rem !important; } .py-48 { padding-top: 12rem !important; padding-bottom: 12rem !important; } .px-48 { padding-left: 12rem !important; padding-right: 12rem !important; } .py-56 { padding-top: 14rem !important; padding-bottom: 14rem !important; } .px-56 { padding-left: 14rem !important; padding-right: 14rem !important; } .py-64 { padding-top: 16rem !important; padding-bottom: 16rem !important; } .px-64 { padding-left: 16rem !important; padding-right: 16rem !important; } .py-px { padding-top: 1px !important; padding-bottom: 1px !important; } .px-px { padding-left: 1px !important; padding-right: 1px !important; } .py-2px { padding-top: 2px !important; padding-bottom: 2px !important; } .px-2px { padding-left: 2px !important; padding-right: 2px !important; } .pt-0 { padding-top: 0 !important; } .pr-0 { padding-right: 0 !important; } .pb-0 { padding-bottom: 0 !important; } .pl-0 { padding-left: 0 !important; } .pt-1 { padding-top: 0.25rem !important; } .pr-1 { padding-right: 0.25rem !important; } .pb-1 { padding-bottom: 0.25rem !important; } .pl-1 { padding-left: 0.25rem !important; } .pt-2 { padding-top: 0.5rem !important; } .pr-2 { padding-right: 0.5rem !important; } .pb-2 { padding-bottom: 0.5rem !important; } .pl-2 { padding-left: 0.5rem !important; } .pt-3 { padding-top: 0.75rem !important; } .pr-3 { padding-right: 0.75rem !important; } .pb-3 { padding-bottom: 0.75rem !important; } .pl-3 { padding-left: 0.75rem !important; } .pt-4 { padding-top: 1rem !important; } .pr-4 { padding-right: 1rem !important; } .pb-4 { padding-bottom: 1rem !important; } .pl-4 { padding-left: 1rem !important; } .pt-5 { padding-top: 1.25rem !important; } .pr-5 { padding-right: 1.25rem !important; } .pb-5 { padding-bottom: 1.25rem !important; } .pl-5 { padding-left: 1.25rem !important; } .pt-6 { padding-top: 1.5rem !important; } .pr-6 { padding-right: 1.5rem !important; } .pb-6 { padding-bottom: 1.5rem !important; } .pl-6 { padding-left: 1.5rem !important; } .pt-8 { padding-top: 2rem !important; } .pr-8 { padding-right: 2rem !important; } .pb-8 { padding-bottom: 2rem !important; } .pl-8 { padding-left: 2rem !important; } .pt-10 { padding-top: 2.5rem !important; } .pr-10 { padding-right: 2.5rem !important; } .pb-10 { padding-bottom: 2.5rem !important; } .pl-10 { padding-left: 2.5rem !important; } .pt-12 { padding-top: 3rem !important; } .pr-12 { padding-right: 3rem !important; } .pb-12 { padding-bottom: 3rem !important; } .pl-12 { padding-left: 3rem !important; } .pt-14 { padding-top: 3.5rem !important; } .pr-14 { padding-right: 3.5rem !important; } .pb-14 { padding-bottom: 3.5rem !important; } .pl-14 { padding-left: 3.5rem !important; } .pt-16 { padding-top: 4rem !important; } .pr-16 { padding-right: 4rem !important; } .pb-16 { padding-bottom: 4rem !important; } .pl-16 { padding-left: 4rem !important; } .pt-18 { padding-top: 4.5rem !important; } .pr-18 { padding-right: 4.5rem !important; } .pb-18 { padding-bottom: 4.5rem !important; } .pl-18 { padding-left: 4.5rem !important; } .pt-20 { padding-top: 5rem !important; } .pr-20 { padding-right: 5rem !important; } .pb-20 { padding-bottom: 5rem !important; } .pl-20 { padding-left: 5rem !important; } .pt-22 { padding-top: 5.5rem !important; } .pr-22 { padding-right: 5.5rem !important; } .pb-22 { padding-bottom: 5.5rem !important; } .pl-22 { padding-left: 5.5rem !important; } .pt-24 { padding-top: 6rem !important; } .pr-24 { padding-right: 6rem !important; } .pb-24 { padding-bottom: 6rem !important; } .pl-24 { padding-left: 6rem !important; } .pt-26 { padding-top: 6.5rem !important; } .pr-26 { padding-right: 6.5rem !important; } .pb-26 { padding-bottom: 6.5rem !important; } .pl-26 { padding-left: 6.5rem !important; } .pt-28 { padding-top: 7rem !important; } .pr-28 { padding-right: 7rem !important; } .pb-28 { padding-bottom: 7rem !important; } .pl-28 { padding-left: 7rem !important; } .pt-30 { padding-top: 7.5rem !important; } .pr-30 { padding-right: 7.5rem !important; } .pb-30 { padding-bottom: 7.5rem !important; } .pl-30 { padding-left: 7.5rem !important; } .pt-32 { padding-top: 8rem !important; } .pr-32 { padding-right: 8rem !important; } .pb-32 { padding-bottom: 8rem !important; } .pl-32 { padding-left: 8rem !important; } .pt-36 { padding-top: 9rem !important; } .pr-36 { padding-right: 9rem !important; } .pb-36 { padding-bottom: 9rem !important; } .pl-36 { padding-left: 9rem !important; } .pt-40 { padding-top: 10rem !important; } .pr-40 { padding-right: 10rem !important; } .pb-40 { padding-bottom: 10rem !important; } .pl-40 { padding-left: 10rem !important; } .pt-48 { padding-top: 12rem !important; } .pr-48 { padding-right: 12rem !important; } .pb-48 { padding-bottom: 12rem !important; } .pl-48 { padding-left: 12rem !important; } .pt-56 { padding-top: 14rem !important; } .pr-56 { padding-right: 14rem !important; } .pb-56 { padding-bottom: 14rem !important; } .pl-56 { padding-left: 14rem !important; } .pt-64 { padding-top: 16rem !important; } .pr-64 { padding-right: 16rem !important; } .pb-64 { padding-bottom: 16rem !important; } .pl-64 { padding-left: 16rem !important; } .pt-px { padding-top: 1px !important; } .pr-px { padding-right: 1px !important; } .pb-px { padding-bottom: 1px !important; } .pl-px { padding-left: 1px !important; } .pt-2px { padding-top: 2px !important; } .pr-2px { padding-right: 2px !important; } .pb-2px { padding-bottom: 2px !important; } .pl-2px { padding-left: 2px !important; } .placeholder-opacity-0::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .placeholder-opacity-0::-moz-placeholder { --placeholder-opacity: 0 !important; } .placeholder-opacity-0::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .placeholder-opacity-0::placeholder { --placeholder-opacity: 0 !important; } .placeholder-opacity-12::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .placeholder-opacity-12::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .placeholder-opacity-12::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .placeholder-opacity-12::placeholder { --placeholder-opacity: 0.12 !important; } .placeholder-opacity-25::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .placeholder-opacity-25::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .placeholder-opacity-25::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .placeholder-opacity-25::placeholder { --placeholder-opacity: 0.25 !important; } .placeholder-opacity-38::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .placeholder-opacity-38::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .placeholder-opacity-38::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .placeholder-opacity-38::placeholder { --placeholder-opacity: 0.38 !important; } .placeholder-opacity-50::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .placeholder-opacity-50::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .placeholder-opacity-50::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .placeholder-opacity-50::placeholder { --placeholder-opacity: 0.5 !important; } .placeholder-opacity-54::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .placeholder-opacity-54::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .placeholder-opacity-54::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .placeholder-opacity-54::placeholder { --placeholder-opacity: 0.54 !important; } .placeholder-opacity-70::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .placeholder-opacity-70::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .placeholder-opacity-70::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .placeholder-opacity-70::placeholder { --placeholder-opacity: 0.70 !important; } .placeholder-opacity-75::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .placeholder-opacity-75::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .placeholder-opacity-75::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .placeholder-opacity-75::placeholder { --placeholder-opacity: 0.75 !important; } .placeholder-opacity-84::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .placeholder-opacity-84::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .placeholder-opacity-84::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .placeholder-opacity-84::placeholder { --placeholder-opacity: 0.84 !important; } .placeholder-opacity-100::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .placeholder-opacity-100::-moz-placeholder { --placeholder-opacity: 1 !important; } .placeholder-opacity-100::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .placeholder-opacity-100::placeholder { --placeholder-opacity: 1 !important; } .focus\:placeholder-opacity-0:focus::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .focus\:placeholder-opacity-0:focus::-moz-placeholder { --placeholder-opacity: 0 !important; } .focus\:placeholder-opacity-0:focus::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .focus\:placeholder-opacity-0:focus::placeholder { --placeholder-opacity: 0 !important; } .focus\:placeholder-opacity-12:focus::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .focus\:placeholder-opacity-12:focus::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .focus\:placeholder-opacity-12:focus::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .focus\:placeholder-opacity-12:focus::placeholder { --placeholder-opacity: 0.12 !important; } .focus\:placeholder-opacity-25:focus::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .focus\:placeholder-opacity-25:focus::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .focus\:placeholder-opacity-25:focus::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .focus\:placeholder-opacity-25:focus::placeholder { --placeholder-opacity: 0.25 !important; } .focus\:placeholder-opacity-38:focus::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .focus\:placeholder-opacity-38:focus::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .focus\:placeholder-opacity-38:focus::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .focus\:placeholder-opacity-38:focus::placeholder { --placeholder-opacity: 0.38 !important; } .focus\:placeholder-opacity-50:focus::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .focus\:placeholder-opacity-50:focus::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .focus\:placeholder-opacity-50:focus::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .focus\:placeholder-opacity-50:focus::placeholder { --placeholder-opacity: 0.5 !important; } .focus\:placeholder-opacity-54:focus::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .focus\:placeholder-opacity-54:focus::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .focus\:placeholder-opacity-54:focus::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .focus\:placeholder-opacity-54:focus::placeholder { --placeholder-opacity: 0.54 !important; } .focus\:placeholder-opacity-70:focus::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .focus\:placeholder-opacity-70:focus::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .focus\:placeholder-opacity-70:focus::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .focus\:placeholder-opacity-70:focus::placeholder { --placeholder-opacity: 0.70 !important; } .focus\:placeholder-opacity-75:focus::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .focus\:placeholder-opacity-75:focus::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .focus\:placeholder-opacity-75:focus::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .focus\:placeholder-opacity-75:focus::placeholder { --placeholder-opacity: 0.75 !important; } .focus\:placeholder-opacity-84:focus::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .focus\:placeholder-opacity-84:focus::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .focus\:placeholder-opacity-84:focus::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .focus\:placeholder-opacity-84:focus::placeholder { --placeholder-opacity: 0.84 !important; } .focus\:placeholder-opacity-100:focus::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .focus\:placeholder-opacity-100:focus::-moz-placeholder { --placeholder-opacity: 1 !important; } .focus\:placeholder-opacity-100:focus::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .focus\:placeholder-opacity-100:focus::placeholder { --placeholder-opacity: 1 !important; } .pointer-events-none { pointer-events: none !important; } .pointer-events-auto { pointer-events: auto !important; } .static { position: static !important; } .fixed { position: fixed !important; } .absolute { position: absolute !important; } .relative { position: relative !important; } .sticky { position: -webkit-sticky !important; position: sticky !important; } .inset-0 { top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; } .inset-auto { top: auto !important; right: auto !important; bottom: auto !important; left: auto !important; } .inset-y-0 { top: 0 !important; bottom: 0 !important; } .inset-x-0 { right: 0 !important; left: 0 !important; } .inset-y-auto { top: auto !important; bottom: auto !important; } .inset-x-auto { right: auto !important; left: auto !important; } .top-0 { top: 0 !important; } .right-0 { right: 0 !important; } .bottom-0 { bottom: 0 !important; } .left-0 { left: 0 !important; } .top-auto { top: auto !important; } .right-auto { right: auto !important; } .bottom-auto { bottom: auto !important; } .left-auto { left: auto !important; } .resize-none { resize: none !important; } .resize-y { resize: vertical !important; } .resize-x { resize: horizontal !important; } .resize { resize: both !important; } .shadow-xs { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .shadow-sm { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .shadow-xl { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .shadow-2xl { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .shadow-inner { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .shadow-outline { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .shadow-none { box-shadow: none !important; } .shadow-solid { box-shadow: 0 0 0 2px currentColor !important; } .hover\:shadow-xs:hover { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .hover\:shadow-sm:hover { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .hover\:shadow:hover { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .hover\:shadow-md:hover { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .hover\:shadow-lg:hover { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .hover\:shadow-xl:hover { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .hover\:shadow-2xl:hover { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .hover\:shadow-inner:hover { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .hover\:shadow-outline:hover { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .hover\:shadow-none:hover { box-shadow: none !important; } .hover\:shadow-solid:hover { box-shadow: 0 0 0 2px currentColor !important; } .focus\:shadow-xs:focus { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .focus\:shadow-sm:focus { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .focus\:shadow:focus { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .focus\:shadow-md:focus { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .focus\:shadow-lg:focus { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .focus\:shadow-xl:focus { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .focus\:shadow-2xl:focus { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .focus\:shadow-inner:focus { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .focus\:shadow-outline:focus { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .focus\:shadow-none:focus { box-shadow: none !important; } .focus\:shadow-solid:focus { box-shadow: 0 0 0 2px currentColor !important; } .fill-current { fill: currentColor !important; } .stroke-current { stroke: currentColor !important; } .stroke-0 { stroke-width: 0 !important; } .stroke-1 { stroke-width: 1 !important; } .stroke-2 { stroke-width: 2 !important; } .table-auto { table-layout: auto !important; } .table-fixed { table-layout: fixed !important; } .text-left { text-align: left !important; } .text-center { text-align: center !important; } .text-right { text-align: right !important; } .text-justify { text-align: justify !important; } .text-current { color: currentColor !important; } .text-transparent { color: transparent !important; } .text-white { --text-opacity: 1 !important; color: #FFFFFF !important; color: rgba(255, 255, 255, var(--text-opacity)) !important; } .text-black { --text-opacity: 1 !important; color: #000000 !important; color: rgba(0, 0, 0, var(--text-opacity)) !important; } .text-gray-50 { --text-opacity: 1 !important; color: #F9FAFB !important; color: rgba(249, 250, 251, var(--text-opacity)) !important; } .text-gray-100 { --text-opacity: 1 !important; color: #F4F5F7 !important; color: rgba(244, 245, 247, var(--text-opacity)) !important; } .text-gray-200 { --text-opacity: 1 !important; color: #E5E7EB !important; color: rgba(229, 231, 235, var(--text-opacity)) !important; } .text-gray-300 { --text-opacity: 1 !important; color: #D2D6DC !important; color: rgba(210, 214, 220, var(--text-opacity)) !important; } .text-gray-400 { --text-opacity: 1 !important; color: #9FA6B2 !important; color: rgba(159, 166, 178, var(--text-opacity)) !important; } .text-gray-500 { --text-opacity: 1 !important; color: #6B7280 !important; color: rgba(107, 114, 128, var(--text-opacity)) !important; } .text-gray-600 { --text-opacity: 1 !important; color: #4B5563 !important; color: rgba(75, 85, 99, var(--text-opacity)) !important; } .text-gray-700 { --text-opacity: 1 !important; color: #374151 !important; color: rgba(55, 65, 81, var(--text-opacity)) !important; } .text-gray-800 { --text-opacity: 1 !important; color: #252F3F !important; color: rgba(37, 47, 63, var(--text-opacity)) !important; } .text-gray-900 { --text-opacity: 1 !important; color: #161E2E !important; color: rgba(22, 30, 46, var(--text-opacity)) !important; } .text-gray { --text-opacity: 1 !important; color: #6B7280 !important; color: rgba(107, 114, 128, var(--text-opacity)) !important; } .text-cool-gray-50 { --text-opacity: 1 !important; color: #FBFDFE !important; color: rgba(251, 253, 254, var(--text-opacity)) !important; } .text-cool-gray-100 { --text-opacity: 1 !important; color: #F1F5F9 !important; color: rgba(241, 245, 249, var(--text-opacity)) !important; } .text-cool-gray-200 { --text-opacity: 1 !important; color: #E2E8F0 !important; color: rgba(226, 232, 240, var(--text-opacity)) !important; } .text-cool-gray-300 { --text-opacity: 1 !important; color: #CFD8E3 !important; color: rgba(207, 216, 227, var(--text-opacity)) !important; } .text-cool-gray-400 { --text-opacity: 1 !important; color: #97A6BA !important; color: rgba(151, 166, 186, var(--text-opacity)) !important; } .text-cool-gray-500 { --text-opacity: 1 !important; color: #64748B !important; color: rgba(100, 116, 139, var(--text-opacity)) !important; } .text-cool-gray-600 { --text-opacity: 1 !important; color: #475569 !important; color: rgba(71, 85, 105, var(--text-opacity)) !important; } .text-cool-gray-700 { --text-opacity: 1 !important; color: #364152 !important; color: rgba(54, 65, 82, var(--text-opacity)) !important; } .text-cool-gray-800 { --text-opacity: 1 !important; color: #27303F !important; color: rgba(39, 48, 63, var(--text-opacity)) !important; } .text-cool-gray-900 { --text-opacity: 1 !important; color: #1A202E !important; color: rgba(26, 32, 46, var(--text-opacity)) !important; } .text-cool-gray { --text-opacity: 1 !important; color: #64748B !important; color: rgba(100, 116, 139, var(--text-opacity)) !important; } .text-red-50 { --text-opacity: 1 !important; color: #FDF2F2 !important; color: rgba(253, 242, 242, var(--text-opacity)) !important; } .text-red-100 { --text-opacity: 1 !important; color: #FDE8E8 !important; color: rgba(253, 232, 232, var(--text-opacity)) !important; } .text-red-200 { --text-opacity: 1 !important; color: #FBD5D5 !important; color: rgba(251, 213, 213, var(--text-opacity)) !important; } .text-red-300 { --text-opacity: 1 !important; color: #F8B4B4 !important; color: rgba(248, 180, 180, var(--text-opacity)) !important; } .text-red-400 { --text-opacity: 1 !important; color: #F98080 !important; color: rgba(249, 128, 128, var(--text-opacity)) !important; } .text-red-500 { --text-opacity: 1 !important; color: #F05252 !important; color: rgba(240, 82, 82, var(--text-opacity)) !important; } .text-red-600 { --text-opacity: 1 !important; color: #E02424 !important; color: rgba(224, 36, 36, var(--text-opacity)) !important; } .text-red-700 { --text-opacity: 1 !important; color: #C81E1E !important; color: rgba(200, 30, 30, var(--text-opacity)) !important; } .text-red-800 { --text-opacity: 1 !important; color: #9B1C1C !important; color: rgba(155, 28, 28, var(--text-opacity)) !important; } .text-red-900 { --text-opacity: 1 !important; color: #771D1D !important; color: rgba(119, 29, 29, var(--text-opacity)) !important; } .text-red { --text-opacity: 1 !important; color: #F05252 !important; color: rgba(240, 82, 82, var(--text-opacity)) !important; } .text-orange-50 { --text-opacity: 1 !important; color: #FFF8F1 !important; color: rgba(255, 248, 241, var(--text-opacity)) !important; } .text-orange-100 { --text-opacity: 1 !important; color: #FEECDC !important; color: rgba(254, 236, 220, var(--text-opacity)) !important; } .text-orange-200 { --text-opacity: 1 !important; color: #FCD9BD !important; color: rgba(252, 217, 189, var(--text-opacity)) !important; } .text-orange-300 { --text-opacity: 1 !important; color: #FDBA8C !important; color: rgba(253, 186, 140, var(--text-opacity)) !important; } .text-orange-400 { --text-opacity: 1 !important; color: #FF8A4C !important; color: rgba(255, 138, 76, var(--text-opacity)) !important; } .text-orange-500 { --text-opacity: 1 !important; color: #FF5A1F !important; color: rgba(255, 90, 31, var(--text-opacity)) !important; } .text-orange-600 { --text-opacity: 1 !important; color: #D03801 !important; color: rgba(208, 56, 1, var(--text-opacity)) !important; } .text-orange-700 { --text-opacity: 1 !important; color: #B43403 !important; color: rgba(180, 52, 3, var(--text-opacity)) !important; } .text-orange-800 { --text-opacity: 1 !important; color: #8A2C0D !important; color: rgba(138, 44, 13, var(--text-opacity)) !important; } .text-orange-900 { --text-opacity: 1 !important; color: #771D1D !important; color: rgba(119, 29, 29, var(--text-opacity)) !important; } .text-orange { --text-opacity: 1 !important; color: #FF5A1F !important; color: rgba(255, 90, 31, var(--text-opacity)) !important; } .text-yellow-50 { --text-opacity: 1 !important; color: #FDFDEA !important; color: rgba(253, 253, 234, var(--text-opacity)) !important; } .text-yellow-100 { --text-opacity: 1 !important; color: #FDF6B2 !important; color: rgba(253, 246, 178, var(--text-opacity)) !important; } .text-yellow-200 { --text-opacity: 1 !important; color: #FCE96A !important; color: rgba(252, 233, 106, var(--text-opacity)) !important; } .text-yellow-300 { --text-opacity: 1 !important; color: #FACA15 !important; color: rgba(250, 202, 21, var(--text-opacity)) !important; } .text-yellow-400 { --text-opacity: 1 !important; color: #E3A008 !important; color: rgba(227, 160, 8, var(--text-opacity)) !important; } .text-yellow-500 { --text-opacity: 1 !important; color: #C27803 !important; color: rgba(194, 120, 3, var(--text-opacity)) !important; } .text-yellow-600 { --text-opacity: 1 !important; color: #9F580A !important; color: rgba(159, 88, 10, var(--text-opacity)) !important; } .text-yellow-700 { --text-opacity: 1 !important; color: #8E4B10 !important; color: rgba(142, 75, 16, var(--text-opacity)) !important; } .text-yellow-800 { --text-opacity: 1 !important; color: #723B13 !important; color: rgba(114, 59, 19, var(--text-opacity)) !important; } .text-yellow-900 { --text-opacity: 1 !important; color: #633112 !important; color: rgba(99, 49, 18, var(--text-opacity)) !important; } .text-yellow { --text-opacity: 1 !important; color: #C27803 !important; color: rgba(194, 120, 3, var(--text-opacity)) !important; } .text-green-50 { --text-opacity: 1 !important; color: #F3FAF7 !important; color: rgba(243, 250, 247, var(--text-opacity)) !important; } .text-green-100 { --text-opacity: 1 !important; color: #DEF7EC !important; color: rgba(222, 247, 236, var(--text-opacity)) !important; } .text-green-200 { --text-opacity: 1 !important; color: #BCF0DA !important; color: rgba(188, 240, 218, var(--text-opacity)) !important; } .text-green-300 { --text-opacity: 1 !important; color: #84E1BC !important; color: rgba(132, 225, 188, var(--text-opacity)) !important; } .text-green-400 { --text-opacity: 1 !important; color: #31C48D !important; color: rgba(49, 196, 141, var(--text-opacity)) !important; } .text-green-500 { --text-opacity: 1 !important; color: #0E9F6E !important; color: rgba(14, 159, 110, var(--text-opacity)) !important; } .text-green-600 { --text-opacity: 1 !important; color: #057A55 !important; color: rgba(5, 122, 85, var(--text-opacity)) !important; } .text-green-700 { --text-opacity: 1 !important; color: #046C4E !important; color: rgba(4, 108, 78, var(--text-opacity)) !important; } .text-green-800 { --text-opacity: 1 !important; color: #03543F !important; color: rgba(3, 84, 63, var(--text-opacity)) !important; } .text-green-900 { --text-opacity: 1 !important; color: #014737 !important; color: rgba(1, 71, 55, var(--text-opacity)) !important; } .text-green { --text-opacity: 1 !important; color: #0E9F6E !important; color: rgba(14, 159, 110, var(--text-opacity)) !important; } .text-teal-50 { --text-opacity: 1 !important; color: #EDFAFA !important; color: rgba(237, 250, 250, var(--text-opacity)) !important; } .text-teal-100 { --text-opacity: 1 !important; color: #D5F5F6 !important; color: rgba(213, 245, 246, var(--text-opacity)) !important; } .text-teal-200 { --text-opacity: 1 !important; color: #AFECEF !important; color: rgba(175, 236, 239, var(--text-opacity)) !important; } .text-teal-300 { --text-opacity: 1 !important; color: #7EDCE2 !important; color: rgba(126, 220, 226, var(--text-opacity)) !important; } .text-teal-400 { --text-opacity: 1 !important; color: #16BDCA !important; color: rgba(22, 189, 202, var(--text-opacity)) !important; } .text-teal-500 { --text-opacity: 1 !important; color: #0694A2 !important; color: rgba(6, 148, 162, var(--text-opacity)) !important; } .text-teal-600 { --text-opacity: 1 !important; color: #047481 !important; color: rgba(4, 116, 129, var(--text-opacity)) !important; } .text-teal-700 { --text-opacity: 1 !important; color: #036672 !important; color: rgba(3, 102, 114, var(--text-opacity)) !important; } .text-teal-800 { --text-opacity: 1 !important; color: #05505C !important; color: rgba(5, 80, 92, var(--text-opacity)) !important; } .text-teal-900 { --text-opacity: 1 !important; color: #014451 !important; color: rgba(1, 68, 81, var(--text-opacity)) !important; } .text-teal { --text-opacity: 1 !important; color: #0694A2 !important; color: rgba(6, 148, 162, var(--text-opacity)) !important; } .text-blue-50 { --text-opacity: 1 !important; color: #EBF5FF !important; color: rgba(235, 245, 255, var(--text-opacity)) !important; } .text-blue-100 { --text-opacity: 1 !important; color: #E1EFFE !important; color: rgba(225, 239, 254, var(--text-opacity)) !important; } .text-blue-200 { --text-opacity: 1 !important; color: #C3DDFD !important; color: rgba(195, 221, 253, var(--text-opacity)) !important; } .text-blue-300 { --text-opacity: 1 !important; color: #A4CAFE !important; color: rgba(164, 202, 254, var(--text-opacity)) !important; } .text-blue-400 { --text-opacity: 1 !important; color: #76A9FA !important; color: rgba(118, 169, 250, var(--text-opacity)) !important; } .text-blue-500 { --text-opacity: 1 !important; color: #3F83F8 !important; color: rgba(63, 131, 248, var(--text-opacity)) !important; } .text-blue-600 { --text-opacity: 1 !important; color: #1C64F2 !important; color: rgba(28, 100, 242, var(--text-opacity)) !important; } .text-blue-700 { --text-opacity: 1 !important; color: #1A56DB !important; color: rgba(26, 86, 219, var(--text-opacity)) !important; } .text-blue-800 { --text-opacity: 1 !important; color: #1E429F !important; color: rgba(30, 66, 159, var(--text-opacity)) !important; } .text-blue-900 { --text-opacity: 1 !important; color: #233876 !important; color: rgba(35, 56, 118, var(--text-opacity)) !important; } .text-blue { --text-opacity: 1 !important; color: #3F83F8 !important; color: rgba(63, 131, 248, var(--text-opacity)) !important; } .text-indigo-50 { --text-opacity: 1 !important; color: #F0F5FF !important; color: rgba(240, 245, 255, var(--text-opacity)) !important; } .text-indigo-100 { --text-opacity: 1 !important; color: #E5EDFF !important; color: rgba(229, 237, 255, var(--text-opacity)) !important; } .text-indigo-200 { --text-opacity: 1 !important; color: #CDDBFE !important; color: rgba(205, 219, 254, var(--text-opacity)) !important; } .text-indigo-300 { --text-opacity: 1 !important; color: #B4C6FC !important; color: rgba(180, 198, 252, var(--text-opacity)) !important; } .text-indigo-400 { --text-opacity: 1 !important; color: #8DA2FB !important; color: rgba(141, 162, 251, var(--text-opacity)) !important; } .text-indigo-500 { --text-opacity: 1 !important; color: #6875F5 !important; color: rgba(104, 117, 245, var(--text-opacity)) !important; } .text-indigo-600 { --text-opacity: 1 !important; color: #5850EC !important; color: rgba(88, 80, 236, var(--text-opacity)) !important; } .text-indigo-700 { --text-opacity: 1 !important; color: #5145CD !important; color: rgba(81, 69, 205, var(--text-opacity)) !important; } .text-indigo-800 { --text-opacity: 1 !important; color: #42389D !important; color: rgba(66, 56, 157, var(--text-opacity)) !important; } .text-indigo-900 { --text-opacity: 1 !important; color: #362F78 !important; color: rgba(54, 47, 120, var(--text-opacity)) !important; } .text-indigo { --text-opacity: 1 !important; color: #6875F5 !important; color: rgba(104, 117, 245, var(--text-opacity)) !important; } .text-purple-50 { --text-opacity: 1 !important; color: #F6F5FF !important; color: rgba(246, 245, 255, var(--text-opacity)) !important; } .text-purple-100 { --text-opacity: 1 !important; color: #EDEBFE !important; color: rgba(237, 235, 254, var(--text-opacity)) !important; } .text-purple-200 { --text-opacity: 1 !important; color: #DCD7FE !important; color: rgba(220, 215, 254, var(--text-opacity)) !important; } .text-purple-300 { --text-opacity: 1 !important; color: #CABFFD !important; color: rgba(202, 191, 253, var(--text-opacity)) !important; } .text-purple-400 { --text-opacity: 1 !important; color: #AC94FA !important; color: rgba(172, 148, 250, var(--text-opacity)) !important; } .text-purple-500 { --text-opacity: 1 !important; color: #9061F9 !important; color: rgba(144, 97, 249, var(--text-opacity)) !important; } .text-purple-600 { --text-opacity: 1 !important; color: #7E3AF2 !important; color: rgba(126, 58, 242, var(--text-opacity)) !important; } .text-purple-700 { --text-opacity: 1 !important; color: #6C2BD9 !important; color: rgba(108, 43, 217, var(--text-opacity)) !important; } .text-purple-800 { --text-opacity: 1 !important; color: #5521B5 !important; color: rgba(85, 33, 181, var(--text-opacity)) !important; } .text-purple-900 { --text-opacity: 1 !important; color: #4A1D96 !important; color: rgba(74, 29, 150, var(--text-opacity)) !important; } .text-purple { --text-opacity: 1 !important; color: #9061F9 !important; color: rgba(144, 97, 249, var(--text-opacity)) !important; } .text-pink-50 { --text-opacity: 1 !important; color: #FDF2F8 !important; color: rgba(253, 242, 248, var(--text-opacity)) !important; } .text-pink-100 { --text-opacity: 1 !important; color: #FCE8F3 !important; color: rgba(252, 232, 243, var(--text-opacity)) !important; } .text-pink-200 { --text-opacity: 1 !important; color: #FAD1E8 !important; color: rgba(250, 209, 232, var(--text-opacity)) !important; } .text-pink-300 { --text-opacity: 1 !important; color: #F8B4D9 !important; color: rgba(248, 180, 217, var(--text-opacity)) !important; } .text-pink-400 { --text-opacity: 1 !important; color: #F17EB8 !important; color: rgba(241, 126, 184, var(--text-opacity)) !important; } .text-pink-500 { --text-opacity: 1 !important; color: #E74694 !important; color: rgba(231, 70, 148, var(--text-opacity)) !important; } .text-pink-600 { --text-opacity: 1 !important; color: #D61F69 !important; color: rgba(214, 31, 105, var(--text-opacity)) !important; } .text-pink-700 { --text-opacity: 1 !important; color: #BF125D !important; color: rgba(191, 18, 93, var(--text-opacity)) !important; } .text-pink-800 { --text-opacity: 1 !important; color: #99154B !important; color: rgba(153, 21, 75, var(--text-opacity)) !important; } .text-pink-900 { --text-opacity: 1 !important; color: #751A3D !important; color: rgba(117, 26, 61, var(--text-opacity)) !important; } .text-pink { --text-opacity: 1 !important; color: #E74694 !important; color: rgba(231, 70, 148, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-current, [class*="theme-dark"] .dark\:text-current, [class*="theme-light"].light\:text-current, [class*="theme-light"] .light\:text-current { color: currentColor !important; } [class*="theme-dark"].dark\:text-transparent, [class*="theme-dark"] .dark\:text-transparent, [class*="theme-light"].light\:text-transparent, [class*="theme-light"] .light\:text-transparent { color: transparent !important; } [class*="theme-dark"].dark\:text-white, [class*="theme-dark"] .dark\:text-white, [class*="theme-light"].light\:text-white, [class*="theme-light"] .light\:text-white { --text-opacity: 1 !important; color: #FFFFFF !important; color: rgba(255, 255, 255, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-black, [class*="theme-dark"] .dark\:text-black, [class*="theme-light"].light\:text-black, [class*="theme-light"] .light\:text-black { --text-opacity: 1 !important; color: #000000 !important; color: rgba(0, 0, 0, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-gray-50, [class*="theme-dark"] .dark\:text-gray-50, [class*="theme-light"].light\:text-gray-50, [class*="theme-light"] .light\:text-gray-50 { --text-opacity: 1 !important; color: #F9FAFB !important; color: rgba(249, 250, 251, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-gray-100, [class*="theme-dark"] .dark\:text-gray-100, [class*="theme-light"].light\:text-gray-100, [class*="theme-light"] .light\:text-gray-100 { --text-opacity: 1 !important; color: #F4F5F7 !important; color: rgba(244, 245, 247, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-gray-200, [class*="theme-dark"] .dark\:text-gray-200, [class*="theme-light"].light\:text-gray-200, [class*="theme-light"] .light\:text-gray-200 { --text-opacity: 1 !important; color: #E5E7EB !important; color: rgba(229, 231, 235, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-gray-300, [class*="theme-dark"] .dark\:text-gray-300, [class*="theme-light"].light\:text-gray-300, [class*="theme-light"] .light\:text-gray-300 { --text-opacity: 1 !important; color: #D2D6DC !important; color: rgba(210, 214, 220, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-gray-400, [class*="theme-dark"] .dark\:text-gray-400, [class*="theme-light"].light\:text-gray-400, [class*="theme-light"] .light\:text-gray-400 { --text-opacity: 1 !important; color: #9FA6B2 !important; color: rgba(159, 166, 178, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-gray-500, [class*="theme-dark"] .dark\:text-gray-500, [class*="theme-light"].light\:text-gray-500, [class*="theme-light"] .light\:text-gray-500 { --text-opacity: 1 !important; color: #6B7280 !important; color: rgba(107, 114, 128, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-gray-600, [class*="theme-dark"] .dark\:text-gray-600, [class*="theme-light"].light\:text-gray-600, [class*="theme-light"] .light\:text-gray-600 { --text-opacity: 1 !important; color: #4B5563 !important; color: rgba(75, 85, 99, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-gray-700, [class*="theme-dark"] .dark\:text-gray-700, [class*="theme-light"].light\:text-gray-700, [class*="theme-light"] .light\:text-gray-700 { --text-opacity: 1 !important; color: #374151 !important; color: rgba(55, 65, 81, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-gray-800, [class*="theme-dark"] .dark\:text-gray-800, [class*="theme-light"].light\:text-gray-800, [class*="theme-light"] .light\:text-gray-800 { --text-opacity: 1 !important; color: #252F3F !important; color: rgba(37, 47, 63, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-gray-900, [class*="theme-dark"] .dark\:text-gray-900, [class*="theme-light"].light\:text-gray-900, [class*="theme-light"] .light\:text-gray-900 { --text-opacity: 1 !important; color: #161E2E !important; color: rgba(22, 30, 46, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-gray, [class*="theme-dark"] .dark\:text-gray, [class*="theme-light"].light\:text-gray, [class*="theme-light"] .light\:text-gray { --text-opacity: 1 !important; color: #6B7280 !important; color: rgba(107, 114, 128, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-cool-gray-50, [class*="theme-dark"] .dark\:text-cool-gray-50, [class*="theme-light"].light\:text-cool-gray-50, [class*="theme-light"] .light\:text-cool-gray-50 { --text-opacity: 1 !important; color: #FBFDFE !important; color: rgba(251, 253, 254, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-cool-gray-100, [class*="theme-dark"] .dark\:text-cool-gray-100, [class*="theme-light"].light\:text-cool-gray-100, [class*="theme-light"] .light\:text-cool-gray-100 { --text-opacity: 1 !important; color: #F1F5F9 !important; color: rgba(241, 245, 249, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-cool-gray-200, [class*="theme-dark"] .dark\:text-cool-gray-200, [class*="theme-light"].light\:text-cool-gray-200, [class*="theme-light"] .light\:text-cool-gray-200 { --text-opacity: 1 !important; color: #E2E8F0 !important; color: rgba(226, 232, 240, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-cool-gray-300, [class*="theme-dark"] .dark\:text-cool-gray-300, [class*="theme-light"].light\:text-cool-gray-300, [class*="theme-light"] .light\:text-cool-gray-300 { --text-opacity: 1 !important; color: #CFD8E3 !important; color: rgba(207, 216, 227, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-cool-gray-400, [class*="theme-dark"] .dark\:text-cool-gray-400, [class*="theme-light"].light\:text-cool-gray-400, [class*="theme-light"] .light\:text-cool-gray-400 { --text-opacity: 1 !important; color: #97A6BA !important; color: rgba(151, 166, 186, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-cool-gray-500, [class*="theme-dark"] .dark\:text-cool-gray-500, [class*="theme-light"].light\:text-cool-gray-500, [class*="theme-light"] .light\:text-cool-gray-500 { --text-opacity: 1 !important; color: #64748B !important; color: rgba(100, 116, 139, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-cool-gray-600, [class*="theme-dark"] .dark\:text-cool-gray-600, [class*="theme-light"].light\:text-cool-gray-600, [class*="theme-light"] .light\:text-cool-gray-600 { --text-opacity: 1 !important; color: #475569 !important; color: rgba(71, 85, 105, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-cool-gray-700, [class*="theme-dark"] .dark\:text-cool-gray-700, [class*="theme-light"].light\:text-cool-gray-700, [class*="theme-light"] .light\:text-cool-gray-700 { --text-opacity: 1 !important; color: #364152 !important; color: rgba(54, 65, 82, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-cool-gray-800, [class*="theme-dark"] .dark\:text-cool-gray-800, [class*="theme-light"].light\:text-cool-gray-800, [class*="theme-light"] .light\:text-cool-gray-800 { --text-opacity: 1 !important; color: #27303F !important; color: rgba(39, 48, 63, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-cool-gray-900, [class*="theme-dark"] .dark\:text-cool-gray-900, [class*="theme-light"].light\:text-cool-gray-900, [class*="theme-light"] .light\:text-cool-gray-900 { --text-opacity: 1 !important; color: #1A202E !important; color: rgba(26, 32, 46, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-cool-gray, [class*="theme-dark"] .dark\:text-cool-gray, [class*="theme-light"].light\:text-cool-gray, [class*="theme-light"] .light\:text-cool-gray { --text-opacity: 1 !important; color: #64748B !important; color: rgba(100, 116, 139, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-red-50, [class*="theme-dark"] .dark\:text-red-50, [class*="theme-light"].light\:text-red-50, [class*="theme-light"] .light\:text-red-50 { --text-opacity: 1 !important; color: #FDF2F2 !important; color: rgba(253, 242, 242, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-red-100, [class*="theme-dark"] .dark\:text-red-100, [class*="theme-light"].light\:text-red-100, [class*="theme-light"] .light\:text-red-100 { --text-opacity: 1 !important; color: #FDE8E8 !important; color: rgba(253, 232, 232, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-red-200, [class*="theme-dark"] .dark\:text-red-200, [class*="theme-light"].light\:text-red-200, [class*="theme-light"] .light\:text-red-200 { --text-opacity: 1 !important; color: #FBD5D5 !important; color: rgba(251, 213, 213, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-red-300, [class*="theme-dark"] .dark\:text-red-300, [class*="theme-light"].light\:text-red-300, [class*="theme-light"] .light\:text-red-300 { --text-opacity: 1 !important; color: #F8B4B4 !important; color: rgba(248, 180, 180, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-red-400, [class*="theme-dark"] .dark\:text-red-400, [class*="theme-light"].light\:text-red-400, [class*="theme-light"] .light\:text-red-400 { --text-opacity: 1 !important; color: #F98080 !important; color: rgba(249, 128, 128, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-red-500, [class*="theme-dark"] .dark\:text-red-500, [class*="theme-light"].light\:text-red-500, [class*="theme-light"] .light\:text-red-500 { --text-opacity: 1 !important; color: #F05252 !important; color: rgba(240, 82, 82, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-red-600, [class*="theme-dark"] .dark\:text-red-600, [class*="theme-light"].light\:text-red-600, [class*="theme-light"] .light\:text-red-600 { --text-opacity: 1 !important; color: #E02424 !important; color: rgba(224, 36, 36, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-red-700, [class*="theme-dark"] .dark\:text-red-700, [class*="theme-light"].light\:text-red-700, [class*="theme-light"] .light\:text-red-700 { --text-opacity: 1 !important; color: #C81E1E !important; color: rgba(200, 30, 30, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-red-800, [class*="theme-dark"] .dark\:text-red-800, [class*="theme-light"].light\:text-red-800, [class*="theme-light"] .light\:text-red-800 { --text-opacity: 1 !important; color: #9B1C1C !important; color: rgba(155, 28, 28, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-red-900, [class*="theme-dark"] .dark\:text-red-900, [class*="theme-light"].light\:text-red-900, [class*="theme-light"] .light\:text-red-900 { --text-opacity: 1 !important; color: #771D1D !important; color: rgba(119, 29, 29, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-red, [class*="theme-dark"] .dark\:text-red, [class*="theme-light"].light\:text-red, [class*="theme-light"] .light\:text-red { --text-opacity: 1 !important; color: #F05252 !important; color: rgba(240, 82, 82, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-orange-50, [class*="theme-dark"] .dark\:text-orange-50, [class*="theme-light"].light\:text-orange-50, [class*="theme-light"] .light\:text-orange-50 { --text-opacity: 1 !important; color: #FFF8F1 !important; color: rgba(255, 248, 241, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-orange-100, [class*="theme-dark"] .dark\:text-orange-100, [class*="theme-light"].light\:text-orange-100, [class*="theme-light"] .light\:text-orange-100 { --text-opacity: 1 !important; color: #FEECDC !important; color: rgba(254, 236, 220, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-orange-200, [class*="theme-dark"] .dark\:text-orange-200, [class*="theme-light"].light\:text-orange-200, [class*="theme-light"] .light\:text-orange-200 { --text-opacity: 1 !important; color: #FCD9BD !important; color: rgba(252, 217, 189, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-orange-300, [class*="theme-dark"] .dark\:text-orange-300, [class*="theme-light"].light\:text-orange-300, [class*="theme-light"] .light\:text-orange-300 { --text-opacity: 1 !important; color: #FDBA8C !important; color: rgba(253, 186, 140, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-orange-400, [class*="theme-dark"] .dark\:text-orange-400, [class*="theme-light"].light\:text-orange-400, [class*="theme-light"] .light\:text-orange-400 { --text-opacity: 1 !important; color: #FF8A4C !important; color: rgba(255, 138, 76, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-orange-500, [class*="theme-dark"] .dark\:text-orange-500, [class*="theme-light"].light\:text-orange-500, [class*="theme-light"] .light\:text-orange-500 { --text-opacity: 1 !important; color: #FF5A1F !important; color: rgba(255, 90, 31, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-orange-600, [class*="theme-dark"] .dark\:text-orange-600, [class*="theme-light"].light\:text-orange-600, [class*="theme-light"] .light\:text-orange-600 { --text-opacity: 1 !important; color: #D03801 !important; color: rgba(208, 56, 1, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-orange-700, [class*="theme-dark"] .dark\:text-orange-700, [class*="theme-light"].light\:text-orange-700, [class*="theme-light"] .light\:text-orange-700 { --text-opacity: 1 !important; color: #B43403 !important; color: rgba(180, 52, 3, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-orange-800, [class*="theme-dark"] .dark\:text-orange-800, [class*="theme-light"].light\:text-orange-800, [class*="theme-light"] .light\:text-orange-800 { --text-opacity: 1 !important; color: #8A2C0D !important; color: rgba(138, 44, 13, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-orange-900, [class*="theme-dark"] .dark\:text-orange-900, [class*="theme-light"].light\:text-orange-900, [class*="theme-light"] .light\:text-orange-900 { --text-opacity: 1 !important; color: #771D1D !important; color: rgba(119, 29, 29, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-orange, [class*="theme-dark"] .dark\:text-orange, [class*="theme-light"].light\:text-orange, [class*="theme-light"] .light\:text-orange { --text-opacity: 1 !important; color: #FF5A1F !important; color: rgba(255, 90, 31, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-yellow-50, [class*="theme-dark"] .dark\:text-yellow-50, [class*="theme-light"].light\:text-yellow-50, [class*="theme-light"] .light\:text-yellow-50 { --text-opacity: 1 !important; color: #FDFDEA !important; color: rgba(253, 253, 234, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-yellow-100, [class*="theme-dark"] .dark\:text-yellow-100, [class*="theme-light"].light\:text-yellow-100, [class*="theme-light"] .light\:text-yellow-100 { --text-opacity: 1 !important; color: #FDF6B2 !important; color: rgba(253, 246, 178, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-yellow-200, [class*="theme-dark"] .dark\:text-yellow-200, [class*="theme-light"].light\:text-yellow-200, [class*="theme-light"] .light\:text-yellow-200 { --text-opacity: 1 !important; color: #FCE96A !important; color: rgba(252, 233, 106, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-yellow-300, [class*="theme-dark"] .dark\:text-yellow-300, [class*="theme-light"].light\:text-yellow-300, [class*="theme-light"] .light\:text-yellow-300 { --text-opacity: 1 !important; color: #FACA15 !important; color: rgba(250, 202, 21, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-yellow-400, [class*="theme-dark"] .dark\:text-yellow-400, [class*="theme-light"].light\:text-yellow-400, [class*="theme-light"] .light\:text-yellow-400 { --text-opacity: 1 !important; color: #E3A008 !important; color: rgba(227, 160, 8, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-yellow-500, [class*="theme-dark"] .dark\:text-yellow-500, [class*="theme-light"].light\:text-yellow-500, [class*="theme-light"] .light\:text-yellow-500 { --text-opacity: 1 !important; color: #C27803 !important; color: rgba(194, 120, 3, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-yellow-600, [class*="theme-dark"] .dark\:text-yellow-600, [class*="theme-light"].light\:text-yellow-600, [class*="theme-light"] .light\:text-yellow-600 { --text-opacity: 1 !important; color: #9F580A !important; color: rgba(159, 88, 10, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-yellow-700, [class*="theme-dark"] .dark\:text-yellow-700, [class*="theme-light"].light\:text-yellow-700, [class*="theme-light"] .light\:text-yellow-700 { --text-opacity: 1 !important; color: #8E4B10 !important; color: rgba(142, 75, 16, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-yellow-800, [class*="theme-dark"] .dark\:text-yellow-800, [class*="theme-light"].light\:text-yellow-800, [class*="theme-light"] .light\:text-yellow-800 { --text-opacity: 1 !important; color: #723B13 !important; color: rgba(114, 59, 19, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-yellow-900, [class*="theme-dark"] .dark\:text-yellow-900, [class*="theme-light"].light\:text-yellow-900, [class*="theme-light"] .light\:text-yellow-900 { --text-opacity: 1 !important; color: #633112 !important; color: rgba(99, 49, 18, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-yellow, [class*="theme-dark"] .dark\:text-yellow, [class*="theme-light"].light\:text-yellow, [class*="theme-light"] .light\:text-yellow { --text-opacity: 1 !important; color: #C27803 !important; color: rgba(194, 120, 3, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-green-50, [class*="theme-dark"] .dark\:text-green-50, [class*="theme-light"].light\:text-green-50, [class*="theme-light"] .light\:text-green-50 { --text-opacity: 1 !important; color: #F3FAF7 !important; color: rgba(243, 250, 247, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-green-100, [class*="theme-dark"] .dark\:text-green-100, [class*="theme-light"].light\:text-green-100, [class*="theme-light"] .light\:text-green-100 { --text-opacity: 1 !important; color: #DEF7EC !important; color: rgba(222, 247, 236, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-green-200, [class*="theme-dark"] .dark\:text-green-200, [class*="theme-light"].light\:text-green-200, [class*="theme-light"] .light\:text-green-200 { --text-opacity: 1 !important; color: #BCF0DA !important; color: rgba(188, 240, 218, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-green-300, [class*="theme-dark"] .dark\:text-green-300, [class*="theme-light"].light\:text-green-300, [class*="theme-light"] .light\:text-green-300 { --text-opacity: 1 !important; color: #84E1BC !important; color: rgba(132, 225, 188, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-green-400, [class*="theme-dark"] .dark\:text-green-400, [class*="theme-light"].light\:text-green-400, [class*="theme-light"] .light\:text-green-400 { --text-opacity: 1 !important; color: #31C48D !important; color: rgba(49, 196, 141, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-green-500, [class*="theme-dark"] .dark\:text-green-500, [class*="theme-light"].light\:text-green-500, [class*="theme-light"] .light\:text-green-500 { --text-opacity: 1 !important; color: #0E9F6E !important; color: rgba(14, 159, 110, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-green-600, [class*="theme-dark"] .dark\:text-green-600, [class*="theme-light"].light\:text-green-600, [class*="theme-light"] .light\:text-green-600 { --text-opacity: 1 !important; color: #057A55 !important; color: rgba(5, 122, 85, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-green-700, [class*="theme-dark"] .dark\:text-green-700, [class*="theme-light"].light\:text-green-700, [class*="theme-light"] .light\:text-green-700 { --text-opacity: 1 !important; color: #046C4E !important; color: rgba(4, 108, 78, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-green-800, [class*="theme-dark"] .dark\:text-green-800, [class*="theme-light"].light\:text-green-800, [class*="theme-light"] .light\:text-green-800 { --text-opacity: 1 !important; color: #03543F !important; color: rgba(3, 84, 63, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-green-900, [class*="theme-dark"] .dark\:text-green-900, [class*="theme-light"].light\:text-green-900, [class*="theme-light"] .light\:text-green-900 { --text-opacity: 1 !important; color: #014737 !important; color: rgba(1, 71, 55, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-green, [class*="theme-dark"] .dark\:text-green, [class*="theme-light"].light\:text-green, [class*="theme-light"] .light\:text-green { --text-opacity: 1 !important; color: #0E9F6E !important; color: rgba(14, 159, 110, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-teal-50, [class*="theme-dark"] .dark\:text-teal-50, [class*="theme-light"].light\:text-teal-50, [class*="theme-light"] .light\:text-teal-50 { --text-opacity: 1 !important; color: #EDFAFA !important; color: rgba(237, 250, 250, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-teal-100, [class*="theme-dark"] .dark\:text-teal-100, [class*="theme-light"].light\:text-teal-100, [class*="theme-light"] .light\:text-teal-100 { --text-opacity: 1 !important; color: #D5F5F6 !important; color: rgba(213, 245, 246, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-teal-200, [class*="theme-dark"] .dark\:text-teal-200, [class*="theme-light"].light\:text-teal-200, [class*="theme-light"] .light\:text-teal-200 { --text-opacity: 1 !important; color: #AFECEF !important; color: rgba(175, 236, 239, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-teal-300, [class*="theme-dark"] .dark\:text-teal-300, [class*="theme-light"].light\:text-teal-300, [class*="theme-light"] .light\:text-teal-300 { --text-opacity: 1 !important; color: #7EDCE2 !important; color: rgba(126, 220, 226, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-teal-400, [class*="theme-dark"] .dark\:text-teal-400, [class*="theme-light"].light\:text-teal-400, [class*="theme-light"] .light\:text-teal-400 { --text-opacity: 1 !important; color: #16BDCA !important; color: rgba(22, 189, 202, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-teal-500, [class*="theme-dark"] .dark\:text-teal-500, [class*="theme-light"].light\:text-teal-500, [class*="theme-light"] .light\:text-teal-500 { --text-opacity: 1 !important; color: #0694A2 !important; color: rgba(6, 148, 162, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-teal-600, [class*="theme-dark"] .dark\:text-teal-600, [class*="theme-light"].light\:text-teal-600, [class*="theme-light"] .light\:text-teal-600 { --text-opacity: 1 !important; color: #047481 !important; color: rgba(4, 116, 129, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-teal-700, [class*="theme-dark"] .dark\:text-teal-700, [class*="theme-light"].light\:text-teal-700, [class*="theme-light"] .light\:text-teal-700 { --text-opacity: 1 !important; color: #036672 !important; color: rgba(3, 102, 114, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-teal-800, [class*="theme-dark"] .dark\:text-teal-800, [class*="theme-light"].light\:text-teal-800, [class*="theme-light"] .light\:text-teal-800 { --text-opacity: 1 !important; color: #05505C !important; color: rgba(5, 80, 92, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-teal-900, [class*="theme-dark"] .dark\:text-teal-900, [class*="theme-light"].light\:text-teal-900, [class*="theme-light"] .light\:text-teal-900 { --text-opacity: 1 !important; color: #014451 !important; color: rgba(1, 68, 81, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-teal, [class*="theme-dark"] .dark\:text-teal, [class*="theme-light"].light\:text-teal, [class*="theme-light"] .light\:text-teal { --text-opacity: 1 !important; color: #0694A2 !important; color: rgba(6, 148, 162, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-blue-50, [class*="theme-dark"] .dark\:text-blue-50, [class*="theme-light"].light\:text-blue-50, [class*="theme-light"] .light\:text-blue-50 { --text-opacity: 1 !important; color: #EBF5FF !important; color: rgba(235, 245, 255, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-blue-100, [class*="theme-dark"] .dark\:text-blue-100, [class*="theme-light"].light\:text-blue-100, [class*="theme-light"] .light\:text-blue-100 { --text-opacity: 1 !important; color: #E1EFFE !important; color: rgba(225, 239, 254, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-blue-200, [class*="theme-dark"] .dark\:text-blue-200, [class*="theme-light"].light\:text-blue-200, [class*="theme-light"] .light\:text-blue-200 { --text-opacity: 1 !important; color: #C3DDFD !important; color: rgba(195, 221, 253, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-blue-300, [class*="theme-dark"] .dark\:text-blue-300, [class*="theme-light"].light\:text-blue-300, [class*="theme-light"] .light\:text-blue-300 { --text-opacity: 1 !important; color: #A4CAFE !important; color: rgba(164, 202, 254, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-blue-400, [class*="theme-dark"] .dark\:text-blue-400, [class*="theme-light"].light\:text-blue-400, [class*="theme-light"] .light\:text-blue-400 { --text-opacity: 1 !important; color: #76A9FA !important; color: rgba(118, 169, 250, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-blue-500, [class*="theme-dark"] .dark\:text-blue-500, [class*="theme-light"].light\:text-blue-500, [class*="theme-light"] .light\:text-blue-500 { --text-opacity: 1 !important; color: #3F83F8 !important; color: rgba(63, 131, 248, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-blue-600, [class*="theme-dark"] .dark\:text-blue-600, [class*="theme-light"].light\:text-blue-600, [class*="theme-light"] .light\:text-blue-600 { --text-opacity: 1 !important; color: #1C64F2 !important; color: rgba(28, 100, 242, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-blue-700, [class*="theme-dark"] .dark\:text-blue-700, [class*="theme-light"].light\:text-blue-700, [class*="theme-light"] .light\:text-blue-700 { --text-opacity: 1 !important; color: #1A56DB !important; color: rgba(26, 86, 219, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-blue-800, [class*="theme-dark"] .dark\:text-blue-800, [class*="theme-light"].light\:text-blue-800, [class*="theme-light"] .light\:text-blue-800 { --text-opacity: 1 !important; color: #1E429F !important; color: rgba(30, 66, 159, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-blue-900, [class*="theme-dark"] .dark\:text-blue-900, [class*="theme-light"].light\:text-blue-900, [class*="theme-light"] .light\:text-blue-900 { --text-opacity: 1 !important; color: #233876 !important; color: rgba(35, 56, 118, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-blue, [class*="theme-dark"] .dark\:text-blue, [class*="theme-light"].light\:text-blue, [class*="theme-light"] .light\:text-blue { --text-opacity: 1 !important; color: #3F83F8 !important; color: rgba(63, 131, 248, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-indigo-50, [class*="theme-dark"] .dark\:text-indigo-50, [class*="theme-light"].light\:text-indigo-50, [class*="theme-light"] .light\:text-indigo-50 { --text-opacity: 1 !important; color: #F0F5FF !important; color: rgba(240, 245, 255, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-indigo-100, [class*="theme-dark"] .dark\:text-indigo-100, [class*="theme-light"].light\:text-indigo-100, [class*="theme-light"] .light\:text-indigo-100 { --text-opacity: 1 !important; color: #E5EDFF !important; color: rgba(229, 237, 255, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-indigo-200, [class*="theme-dark"] .dark\:text-indigo-200, [class*="theme-light"].light\:text-indigo-200, [class*="theme-light"] .light\:text-indigo-200 { --text-opacity: 1 !important; color: #CDDBFE !important; color: rgba(205, 219, 254, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-indigo-300, [class*="theme-dark"] .dark\:text-indigo-300, [class*="theme-light"].light\:text-indigo-300, [class*="theme-light"] .light\:text-indigo-300 { --text-opacity: 1 !important; color: #B4C6FC !important; color: rgba(180, 198, 252, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-indigo-400, [class*="theme-dark"] .dark\:text-indigo-400, [class*="theme-light"].light\:text-indigo-400, [class*="theme-light"] .light\:text-indigo-400 { --text-opacity: 1 !important; color: #8DA2FB !important; color: rgba(141, 162, 251, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-indigo-500, [class*="theme-dark"] .dark\:text-indigo-500, [class*="theme-light"].light\:text-indigo-500, [class*="theme-light"] .light\:text-indigo-500 { --text-opacity: 1 !important; color: #6875F5 !important; color: rgba(104, 117, 245, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-indigo-600, [class*="theme-dark"] .dark\:text-indigo-600, [class*="theme-light"].light\:text-indigo-600, [class*="theme-light"] .light\:text-indigo-600 { --text-opacity: 1 !important; color: #5850EC !important; color: rgba(88, 80, 236, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-indigo-700, [class*="theme-dark"] .dark\:text-indigo-700, [class*="theme-light"].light\:text-indigo-700, [class*="theme-light"] .light\:text-indigo-700 { --text-opacity: 1 !important; color: #5145CD !important; color: rgba(81, 69, 205, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-indigo-800, [class*="theme-dark"] .dark\:text-indigo-800, [class*="theme-light"].light\:text-indigo-800, [class*="theme-light"] .light\:text-indigo-800 { --text-opacity: 1 !important; color: #42389D !important; color: rgba(66, 56, 157, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-indigo-900, [class*="theme-dark"] .dark\:text-indigo-900, [class*="theme-light"].light\:text-indigo-900, [class*="theme-light"] .light\:text-indigo-900 { --text-opacity: 1 !important; color: #362F78 !important; color: rgba(54, 47, 120, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-indigo, [class*="theme-dark"] .dark\:text-indigo, [class*="theme-light"].light\:text-indigo, [class*="theme-light"] .light\:text-indigo { --text-opacity: 1 !important; color: #6875F5 !important; color: rgba(104, 117, 245, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-purple-50, [class*="theme-dark"] .dark\:text-purple-50, [class*="theme-light"].light\:text-purple-50, [class*="theme-light"] .light\:text-purple-50 { --text-opacity: 1 !important; color: #F6F5FF !important; color: rgba(246, 245, 255, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-purple-100, [class*="theme-dark"] .dark\:text-purple-100, [class*="theme-light"].light\:text-purple-100, [class*="theme-light"] .light\:text-purple-100 { --text-opacity: 1 !important; color: #EDEBFE !important; color: rgba(237, 235, 254, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-purple-200, [class*="theme-dark"] .dark\:text-purple-200, [class*="theme-light"].light\:text-purple-200, [class*="theme-light"] .light\:text-purple-200 { --text-opacity: 1 !important; color: #DCD7FE !important; color: rgba(220, 215, 254, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-purple-300, [class*="theme-dark"] .dark\:text-purple-300, [class*="theme-light"].light\:text-purple-300, [class*="theme-light"] .light\:text-purple-300 { --text-opacity: 1 !important; color: #CABFFD !important; color: rgba(202, 191, 253, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-purple-400, [class*="theme-dark"] .dark\:text-purple-400, [class*="theme-light"].light\:text-purple-400, [class*="theme-light"] .light\:text-purple-400 { --text-opacity: 1 !important; color: #AC94FA !important; color: rgba(172, 148, 250, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-purple-500, [class*="theme-dark"] .dark\:text-purple-500, [class*="theme-light"].light\:text-purple-500, [class*="theme-light"] .light\:text-purple-500 { --text-opacity: 1 !important; color: #9061F9 !important; color: rgba(144, 97, 249, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-purple-600, [class*="theme-dark"] .dark\:text-purple-600, [class*="theme-light"].light\:text-purple-600, [class*="theme-light"] .light\:text-purple-600 { --text-opacity: 1 !important; color: #7E3AF2 !important; color: rgba(126, 58, 242, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-purple-700, [class*="theme-dark"] .dark\:text-purple-700, [class*="theme-light"].light\:text-purple-700, [class*="theme-light"] .light\:text-purple-700 { --text-opacity: 1 !important; color: #6C2BD9 !important; color: rgba(108, 43, 217, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-purple-800, [class*="theme-dark"] .dark\:text-purple-800, [class*="theme-light"].light\:text-purple-800, [class*="theme-light"] .light\:text-purple-800 { --text-opacity: 1 !important; color: #5521B5 !important; color: rgba(85, 33, 181, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-purple-900, [class*="theme-dark"] .dark\:text-purple-900, [class*="theme-light"].light\:text-purple-900, [class*="theme-light"] .light\:text-purple-900 { --text-opacity: 1 !important; color: #4A1D96 !important; color: rgba(74, 29, 150, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-purple, [class*="theme-dark"] .dark\:text-purple, [class*="theme-light"].light\:text-purple, [class*="theme-light"] .light\:text-purple { --text-opacity: 1 !important; color: #9061F9 !important; color: rgba(144, 97, 249, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-pink-50, [class*="theme-dark"] .dark\:text-pink-50, [class*="theme-light"].light\:text-pink-50, [class*="theme-light"] .light\:text-pink-50 { --text-opacity: 1 !important; color: #FDF2F8 !important; color: rgba(253, 242, 248, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-pink-100, [class*="theme-dark"] .dark\:text-pink-100, [class*="theme-light"].light\:text-pink-100, [class*="theme-light"] .light\:text-pink-100 { --text-opacity: 1 !important; color: #FCE8F3 !important; color: rgba(252, 232, 243, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-pink-200, [class*="theme-dark"] .dark\:text-pink-200, [class*="theme-light"].light\:text-pink-200, [class*="theme-light"] .light\:text-pink-200 { --text-opacity: 1 !important; color: #FAD1E8 !important; color: rgba(250, 209, 232, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-pink-300, [class*="theme-dark"] .dark\:text-pink-300, [class*="theme-light"].light\:text-pink-300, [class*="theme-light"] .light\:text-pink-300 { --text-opacity: 1 !important; color: #F8B4D9 !important; color: rgba(248, 180, 217, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-pink-400, [class*="theme-dark"] .dark\:text-pink-400, [class*="theme-light"].light\:text-pink-400, [class*="theme-light"] .light\:text-pink-400 { --text-opacity: 1 !important; color: #F17EB8 !important; color: rgba(241, 126, 184, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-pink-500, [class*="theme-dark"] .dark\:text-pink-500, [class*="theme-light"].light\:text-pink-500, [class*="theme-light"] .light\:text-pink-500 { --text-opacity: 1 !important; color: #E74694 !important; color: rgba(231, 70, 148, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-pink-600, [class*="theme-dark"] .dark\:text-pink-600, [class*="theme-light"].light\:text-pink-600, [class*="theme-light"] .light\:text-pink-600 { --text-opacity: 1 !important; color: #D61F69 !important; color: rgba(214, 31, 105, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-pink-700, [class*="theme-dark"] .dark\:text-pink-700, [class*="theme-light"].light\:text-pink-700, [class*="theme-light"] .light\:text-pink-700 { --text-opacity: 1 !important; color: #BF125D !important; color: rgba(191, 18, 93, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-pink-800, [class*="theme-dark"] .dark\:text-pink-800, [class*="theme-light"].light\:text-pink-800, [class*="theme-light"] .light\:text-pink-800 { --text-opacity: 1 !important; color: #99154B !important; color: rgba(153, 21, 75, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-pink-900, [class*="theme-dark"] .dark\:text-pink-900, [class*="theme-light"].light\:text-pink-900, [class*="theme-light"] .light\:text-pink-900 { --text-opacity: 1 !important; color: #751A3D !important; color: rgba(117, 26, 61, var(--text-opacity)) !important; } [class*="theme-dark"].dark\:text-pink, [class*="theme-dark"] .dark\:text-pink, [class*="theme-light"].light\:text-pink, [class*="theme-light"] .light\:text-pink { --text-opacity: 1 !important; color: #E74694 !important; color: rgba(231, 70, 148, var(--text-opacity)) !important; } .text-opacity-0 { --text-opacity: 0 !important; } .text-opacity-12 { --text-opacity: 0.12 !important; } .text-opacity-25 { --text-opacity: 0.25 !important; } .text-opacity-38 { --text-opacity: 0.38 !important; } .text-opacity-50 { --text-opacity: 0.5 !important; } .text-opacity-54 { --text-opacity: 0.54 !important; } .text-opacity-70 { --text-opacity: 0.70 !important; } .text-opacity-75 { --text-opacity: 0.75 !important; } .text-opacity-84 { --text-opacity: 0.84 !important; } .text-opacity-100 { --text-opacity: 1 !important; } .hover\:text-opacity-0:hover { --text-opacity: 0 !important; } .hover\:text-opacity-12:hover { --text-opacity: 0.12 !important; } .hover\:text-opacity-25:hover { --text-opacity: 0.25 !important; } .hover\:text-opacity-38:hover { --text-opacity: 0.38 !important; } .hover\:text-opacity-50:hover { --text-opacity: 0.5 !important; } .hover\:text-opacity-54:hover { --text-opacity: 0.54 !important; } .hover\:text-opacity-70:hover { --text-opacity: 0.70 !important; } .hover\:text-opacity-75:hover { --text-opacity: 0.75 !important; } .hover\:text-opacity-84:hover { --text-opacity: 0.84 !important; } .hover\:text-opacity-100:hover { --text-opacity: 1 !important; } .focus\:text-opacity-0:focus { --text-opacity: 0 !important; } .focus\:text-opacity-12:focus { --text-opacity: 0.12 !important; } .focus\:text-opacity-25:focus { --text-opacity: 0.25 !important; } .focus\:text-opacity-38:focus { --text-opacity: 0.38 !important; } .focus\:text-opacity-50:focus { --text-opacity: 0.5 !important; } .focus\:text-opacity-54:focus { --text-opacity: 0.54 !important; } .focus\:text-opacity-70:focus { --text-opacity: 0.70 !important; } .focus\:text-opacity-75:focus { --text-opacity: 0.75 !important; } .focus\:text-opacity-84:focus { --text-opacity: 0.84 !important; } .focus\:text-opacity-100:focus { --text-opacity: 1 !important; } .italic { font-style: italic !important; } .not-italic { font-style: normal !important; } .uppercase { text-transform: uppercase !important; } .lowercase { text-transform: lowercase !important; } .capitalize { text-transform: capitalize !important; } .normal-case { text-transform: none !important; } .underline { text-decoration: underline !important; } .line-through { text-decoration: line-through !important; } .no-underline { text-decoration: none !important; } .hover\:underline:hover { text-decoration: underline !important; } .hover\:line-through:hover { text-decoration: line-through !important; } .hover\:no-underline:hover { text-decoration: none !important; } .focus\:underline:focus { text-decoration: underline !important; } .focus\:line-through:focus { text-decoration: line-through !important; } .focus\:no-underline:focus { text-decoration: none !important; } .antialiased { -webkit-font-smoothing: antialiased !important; -moz-osx-font-smoothing: grayscale !important; } .subpixel-antialiased { -webkit-font-smoothing: auto !important; -moz-osx-font-smoothing: auto !important; } .tracking-tighter { letter-spacing: -0.05em !important; } .tracking-tight { letter-spacing: -0.025em !important; } .tracking-normal { letter-spacing: 0 !important; } .tracking-wide { letter-spacing: 0.025em !important; } .tracking-wider { letter-spacing: 0.05em !important; } .tracking-widest { letter-spacing: 0.1em !important; } .select-none { -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important; } .select-text { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } .select-all { -webkit-user-select: all !important; -moz-user-select: all !important; -ms-user-select: all !important; user-select: all !important; } .select-auto { -webkit-user-select: auto !important; -moz-user-select: auto !important; -ms-user-select: auto !important; user-select: auto !important; } .align-baseline { vertical-align: baseline !important; } .align-top { vertical-align: top !important; } .align-middle { vertical-align: middle !important; } .align-bottom { vertical-align: bottom !important; } .align-text-top { vertical-align: text-top !important; } .align-text-bottom { vertical-align: text-bottom !important; } .visible { visibility: visible !important; } .invisible { visibility: hidden !important; } .whitespace-normal { white-space: normal !important; } .whitespace-no-wrap { white-space: nowrap !important; } .whitespace-pre { white-space: pre !important; } .whitespace-pre-line { white-space: pre-line !important; } .whitespace-pre-wrap { white-space: pre-wrap !important; } .break-normal { overflow-wrap: normal !important; word-break: normal !important; } .break-words { overflow-wrap: break-word !important; } .break-all { word-break: break-all !important; } .truncate { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } .w-0 { width: 0 !important; } .w-1 { width: 0.25rem !important; } .w-2 { width: 0.5rem !important; } .w-3 { width: 0.75rem !important; } .w-4 { width: 1rem !important; } .w-5 { width: 1.25rem !important; } .w-6 { width: 1.5rem !important; } .w-8 { width: 2rem !important; } .w-10 { width: 2.5rem !important; } .w-12 { width: 3rem !important; } .w-14 { width: 3.5rem !important; } .w-16 { width: 4rem !important; } .w-18 { width: 4.5rem !important; } .w-20 { width: 5rem !important; } .w-22 { width: 5.5rem !important; } .w-24 { width: 6rem !important; } .w-26 { width: 6.5rem !important; } .w-28 { width: 7rem !important; } .w-30 { width: 7.5rem !important; } .w-32 { width: 8rem !important; } .w-36 { width: 9rem !important; } .w-40 { width: 10rem !important; } .w-48 { width: 12rem !important; } .w-50 { width: 12.5rem !important; } .w-56 { width: 14rem !important; } .w-60 { width: 15rem !important; } .w-64 { width: 16rem !important; } .w-80 { width: 20rem !important; } .w-90 { width: 24rem !important; } .w-100 { width: 25rem !important; } .w-120 { width: 30rem !important; } .w-128 { width: 32rem !important; } .w-140 { width: 35rem !important; } .w-160 { width: 40rem !important; } .w-180 { width: 45rem !important; } .w-192 { width: 48rem !important; } .w-200 { width: 50rem !important; } .w-240 { width: 60rem !important; } .w-256 { width: 64rem !important; } .w-280 { width: 70rem !important; } .w-320 { width: 80rem !important; } .w-360 { width: 90rem !important; } .w-400 { width: 100rem !important; } .w-480 { width: 120rem !important; } .w-auto { width: auto !important; } .w-px { width: 1px !important; } .w-2px { width: 2px !important; } .w-1\/2 { width: 50% !important; } .w-1\/3 { width: 33.33333% !important; } .w-2\/3 { width: 66.66667% !important; } .w-1\/4 { width: 25% !important; } .w-2\/4 { width: 50% !important; } .w-3\/4 { width: 75% !important; } .w-1\/5 { width: 20% !important; } .w-2\/5 { width: 40% !important; } .w-3\/5 { width: 60% !important; } .w-4\/5 { width: 80% !important; } .w-1\/6 { width: 16.666667% !important; } .w-2\/6 { width: 33.333333% !important; } .w-3\/6 { width: 50% !important; } .w-4\/6 { width: 66.666667% !important; } .w-5\/6 { width: 83.333333% !important; } .w-1\/12 { width: 8.33333% !important; } .w-2\/12 { width: 16.66667% !important; } .w-3\/12 { width: 25% !important; } .w-4\/12 { width: 33.33333% !important; } .w-5\/12 { width: 41.66667% !important; } .w-6\/12 { width: 50% !important; } .w-7\/12 { width: 58.33333% !important; } .w-8\/12 { width: 66.66667% !important; } .w-9\/12 { width: 75% !important; } .w-10\/12 { width: 83.33333% !important; } .w-11\/12 { width: 91.66667% !important; } .w-full { width: 100% !important; } .w-screen { width: 100vw !important; } .z-0 { z-index: 0 !important; } .z-10 { z-index: 10 !important; } .z-20 { z-index: 20 !important; } .z-30 { z-index: 30 !important; } .z-40 { z-index: 40 !important; } .z-50 { z-index: 50 !important; } .z-60 { z-index: 60 !important; } .z-70 { z-index: 70 !important; } .z-80 { z-index: 80 !important; } .z-90 { z-index: 90 !important; } .z-99 { z-index: 99 !important; } .z-999 { z-index: 999 !important; } .z-9999 { z-index: 9999 !important; } .z-99999 { z-index: 99999 !important; } .z-auto { z-index: auto !important; } .-z-1 { z-index: -1 !important; } .gap-0 { grid-gap: 0 !important; gap: 0 !important; } .gap-1 { grid-gap: 0.25rem !important; gap: 0.25rem !important; } .gap-2 { grid-gap: 0.5rem !important; gap: 0.5rem !important; } .gap-3 { grid-gap: 0.75rem !important; gap: 0.75rem !important; } .gap-4 { grid-gap: 1rem !important; gap: 1rem !important; } .gap-5 { grid-gap: 1.25rem !important; gap: 1.25rem !important; } .gap-6 { grid-gap: 1.5rem !important; gap: 1.5rem !important; } .gap-8 { grid-gap: 2rem !important; gap: 2rem !important; } .gap-10 { grid-gap: 2.5rem !important; gap: 2.5rem !important; } .gap-12 { grid-gap: 3rem !important; gap: 3rem !important; } .gap-14 { grid-gap: 3.5rem !important; gap: 3.5rem !important; } .gap-16 { grid-gap: 4rem !important; gap: 4rem !important; } .gap-18 { grid-gap: 4.5rem !important; gap: 4.5rem !important; } .gap-20 { grid-gap: 5rem !important; gap: 5rem !important; } .gap-22 { grid-gap: 5.5rem !important; gap: 5.5rem !important; } .gap-24 { grid-gap: 6rem !important; gap: 6rem !important; } .gap-26 { grid-gap: 6.5rem !important; gap: 6.5rem !important; } .gap-28 { grid-gap: 7rem !important; gap: 7rem !important; } .gap-30 { grid-gap: 7.5rem !important; gap: 7.5rem !important; } .gap-32 { grid-gap: 8rem !important; gap: 8rem !important; } .gap-36 { grid-gap: 9rem !important; gap: 9rem !important; } .gap-40 { grid-gap: 10rem !important; gap: 10rem !important; } .gap-48 { grid-gap: 12rem !important; gap: 12rem !important; } .gap-56 { grid-gap: 14rem !important; gap: 14rem !important; } .gap-64 { grid-gap: 16rem !important; gap: 16rem !important; } .gap-px { grid-gap: 1px !important; gap: 1px !important; } .gap-2px { grid-gap: 2px !important; gap: 2px !important; } .col-gap-0 { grid-column-gap: 0 !important; -moz-column-gap: 0 !important; column-gap: 0 !important; } .col-gap-1 { grid-column-gap: 0.25rem !important; -moz-column-gap: 0.25rem !important; column-gap: 0.25rem !important; } .col-gap-2 { grid-column-gap: 0.5rem !important; -moz-column-gap: 0.5rem !important; column-gap: 0.5rem !important; } .col-gap-3 { grid-column-gap: 0.75rem !important; -moz-column-gap: 0.75rem !important; column-gap: 0.75rem !important; } .col-gap-4 { grid-column-gap: 1rem !important; -moz-column-gap: 1rem !important; column-gap: 1rem !important; } .col-gap-5 { grid-column-gap: 1.25rem !important; -moz-column-gap: 1.25rem !important; column-gap: 1.25rem !important; } .col-gap-6 { grid-column-gap: 1.5rem !important; -moz-column-gap: 1.5rem !important; column-gap: 1.5rem !important; } .col-gap-8 { grid-column-gap: 2rem !important; -moz-column-gap: 2rem !important; column-gap: 2rem !important; } .col-gap-10 { grid-column-gap: 2.5rem !important; -moz-column-gap: 2.5rem !important; column-gap: 2.5rem !important; } .col-gap-12 { grid-column-gap: 3rem !important; -moz-column-gap: 3rem !important; column-gap: 3rem !important; } .col-gap-14 { grid-column-gap: 3.5rem !important; -moz-column-gap: 3.5rem !important; column-gap: 3.5rem !important; } .col-gap-16 { grid-column-gap: 4rem !important; -moz-column-gap: 4rem !important; column-gap: 4rem !important; } .col-gap-18 { grid-column-gap: 4.5rem !important; -moz-column-gap: 4.5rem !important; column-gap: 4.5rem !important; } .col-gap-20 { grid-column-gap: 5rem !important; -moz-column-gap: 5rem !important; column-gap: 5rem !important; } .col-gap-22 { grid-column-gap: 5.5rem !important; -moz-column-gap: 5.5rem !important; column-gap: 5.5rem !important; } .col-gap-24 { grid-column-gap: 6rem !important; -moz-column-gap: 6rem !important; column-gap: 6rem !important; } .col-gap-26 { grid-column-gap: 6.5rem !important; -moz-column-gap: 6.5rem !important; column-gap: 6.5rem !important; } .col-gap-28 { grid-column-gap: 7rem !important; -moz-column-gap: 7rem !important; column-gap: 7rem !important; } .col-gap-30 { grid-column-gap: 7.5rem !important; -moz-column-gap: 7.5rem !important; column-gap: 7.5rem !important; } .col-gap-32 { grid-column-gap: 8rem !important; -moz-column-gap: 8rem !important; column-gap: 8rem !important; } .col-gap-36 { grid-column-gap: 9rem !important; -moz-column-gap: 9rem !important; column-gap: 9rem !important; } .col-gap-40 { grid-column-gap: 10rem !important; -moz-column-gap: 10rem !important; column-gap: 10rem !important; } .col-gap-48 { grid-column-gap: 12rem !important; -moz-column-gap: 12rem !important; column-gap: 12rem !important; } .col-gap-56 { grid-column-gap: 14rem !important; -moz-column-gap: 14rem !important; column-gap: 14rem !important; } .col-gap-64 { grid-column-gap: 16rem !important; -moz-column-gap: 16rem !important; column-gap: 16rem !important; } .col-gap-px { grid-column-gap: 1px !important; -moz-column-gap: 1px !important; column-gap: 1px !important; } .col-gap-2px { grid-column-gap: 2px !important; -moz-column-gap: 2px !important; column-gap: 2px !important; } .row-gap-0 { grid-row-gap: 0 !important; row-gap: 0 !important; } .row-gap-1 { grid-row-gap: 0.25rem !important; row-gap: 0.25rem !important; } .row-gap-2 { grid-row-gap: 0.5rem !important; row-gap: 0.5rem !important; } .row-gap-3 { grid-row-gap: 0.75rem !important; row-gap: 0.75rem !important; } .row-gap-4 { grid-row-gap: 1rem !important; row-gap: 1rem !important; } .row-gap-5 { grid-row-gap: 1.25rem !important; row-gap: 1.25rem !important; } .row-gap-6 { grid-row-gap: 1.5rem !important; row-gap: 1.5rem !important; } .row-gap-8 { grid-row-gap: 2rem !important; row-gap: 2rem !important; } .row-gap-10 { grid-row-gap: 2.5rem !important; row-gap: 2.5rem !important; } .row-gap-12 { grid-row-gap: 3rem !important; row-gap: 3rem !important; } .row-gap-14 { grid-row-gap: 3.5rem !important; row-gap: 3.5rem !important; } .row-gap-16 { grid-row-gap: 4rem !important; row-gap: 4rem !important; } .row-gap-18 { grid-row-gap: 4.5rem !important; row-gap: 4.5rem !important; } .row-gap-20 { grid-row-gap: 5rem !important; row-gap: 5rem !important; } .row-gap-22 { grid-row-gap: 5.5rem !important; row-gap: 5.5rem !important; } .row-gap-24 { grid-row-gap: 6rem !important; row-gap: 6rem !important; } .row-gap-26 { grid-row-gap: 6.5rem !important; row-gap: 6.5rem !important; } .row-gap-28 { grid-row-gap: 7rem !important; row-gap: 7rem !important; } .row-gap-30 { grid-row-gap: 7.5rem !important; row-gap: 7.5rem !important; } .row-gap-32 { grid-row-gap: 8rem !important; row-gap: 8rem !important; } .row-gap-36 { grid-row-gap: 9rem !important; row-gap: 9rem !important; } .row-gap-40 { grid-row-gap: 10rem !important; row-gap: 10rem !important; } .row-gap-48 { grid-row-gap: 12rem !important; row-gap: 12rem !important; } .row-gap-56 { grid-row-gap: 14rem !important; row-gap: 14rem !important; } .row-gap-64 { grid-row-gap: 16rem !important; row-gap: 16rem !important; } .row-gap-px { grid-row-gap: 1px !important; row-gap: 1px !important; } .row-gap-2px { grid-row-gap: 2px !important; row-gap: 2px !important; } .grid-flow-row { grid-auto-flow: row !important; } .grid-flow-col { grid-auto-flow: column !important; } .grid-flow-row-dense { grid-auto-flow: row dense !important; } .grid-flow-col-dense { grid-auto-flow: column dense !important; } .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; } .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } .grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; } .grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; } .grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; } .grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; } .grid-cols-7 { grid-template-columns: repeat(7, minmax(0, 1fr)) !important; } .grid-cols-8 { grid-template-columns: repeat(8, minmax(0, 1fr)) !important; } .grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)) !important; } .grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)) !important; } .grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)) !important; } .grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)) !important; } .grid-cols-none { grid-template-columns: none !important; } .col-auto { grid-column: auto !important; } .col-span-1 { grid-column: span 1 / span 1 !important; } .col-span-2 { grid-column: span 2 / span 2 !important; } .col-span-3 { grid-column: span 3 / span 3 !important; } .col-span-4 { grid-column: span 4 / span 4 !important; } .col-span-5 { grid-column: span 5 / span 5 !important; } .col-span-6 { grid-column: span 6 / span 6 !important; } .col-span-7 { grid-column: span 7 / span 7 !important; } .col-span-8 { grid-column: span 8 / span 8 !important; } .col-span-9 { grid-column: span 9 / span 9 !important; } .col-span-10 { grid-column: span 10 / span 10 !important; } .col-span-11 { grid-column: span 11 / span 11 !important; } .col-span-12 { grid-column: span 12 / span 12 !important; } .col-start-1 { grid-column-start: 1 !important; } .col-start-2 { grid-column-start: 2 !important; } .col-start-3 { grid-column-start: 3 !important; } .col-start-4 { grid-column-start: 4 !important; } .col-start-5 { grid-column-start: 5 !important; } .col-start-6 { grid-column-start: 6 !important; } .col-start-7 { grid-column-start: 7 !important; } .col-start-8 { grid-column-start: 8 !important; } .col-start-9 { grid-column-start: 9 !important; } .col-start-10 { grid-column-start: 10 !important; } .col-start-11 { grid-column-start: 11 !important; } .col-start-12 { grid-column-start: 12 !important; } .col-start-13 { grid-column-start: 13 !important; } .col-start-auto { grid-column-start: auto !important; } .col-end-1 { grid-column-end: 1 !important; } .col-end-2 { grid-column-end: 2 !important; } .col-end-3 { grid-column-end: 3 !important; } .col-end-4 { grid-column-end: 4 !important; } .col-end-5 { grid-column-end: 5 !important; } .col-end-6 { grid-column-end: 6 !important; } .col-end-7 { grid-column-end: 7 !important; } .col-end-8 { grid-column-end: 8 !important; } .col-end-9 { grid-column-end: 9 !important; } .col-end-10 { grid-column-end: 10 !important; } .col-end-11 { grid-column-end: 11 !important; } .col-end-12 { grid-column-end: 12 !important; } .col-end-13 { grid-column-end: 13 !important; } .col-end-auto { grid-column-end: auto !important; } .grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)) !important; } .grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)) !important; } .grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)) !important; } .grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)) !important; } .grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)) !important; } .grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)) !important; } .grid-rows-none { grid-template-rows: none !important; } .row-auto { grid-row: auto !important; } .row-span-1 { grid-row: span 1 / span 1 !important; } .row-span-2 { grid-row: span 2 / span 2 !important; } .row-span-3 { grid-row: span 3 / span 3 !important; } .row-span-4 { grid-row: span 4 / span 4 !important; } .row-span-5 { grid-row: span 5 / span 5 !important; } .row-span-6 { grid-row: span 6 / span 6 !important; } .row-start-1 { grid-row-start: 1 !important; } .row-start-2 { grid-row-start: 2 !important; } .row-start-3 { grid-row-start: 3 !important; } .row-start-4 { grid-row-start: 4 !important; } .row-start-5 { grid-row-start: 5 !important; } .row-start-6 { grid-row-start: 6 !important; } .row-start-7 { grid-row-start: 7 !important; } .row-start-auto { grid-row-start: auto !important; } .row-end-1 { grid-row-end: 1 !important; } .row-end-2 { grid-row-end: 2 !important; } .row-end-3 { grid-row-end: 3 !important; } .row-end-4 { grid-row-end: 4 !important; } .row-end-5 { grid-row-end: 5 !important; } .row-end-6 { grid-row-end: 6 !important; } .row-end-7 { grid-row-end: 7 !important; } .row-end-auto { grid-row-end: auto !important; } .transform { --transform-translate-x: 0 !important; --transform-translate-y: 0 !important; --transform-rotate: 0 !important; --transform-skew-x: 0 !important; --transform-skew-y: 0 !important; --transform-scale-x: 1 !important; --transform-scale-y: 1 !important; transform: translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y)) !important; } .transform-none { transform: none !important; } .origin-center { transform-origin: center !important; } .origin-top { transform-origin: top !important; } .origin-top-right { transform-origin: top right !important; } .origin-right { transform-origin: right !important; } .origin-bottom-right { transform-origin: bottom right !important; } .origin-bottom { transform-origin: bottom !important; } .origin-bottom-left { transform-origin: bottom left !important; } .origin-left { transform-origin: left !important; } .origin-top-left { transform-origin: top left !important; } .scale-0 { --transform-scale-x: 0 !important; --transform-scale-y: 0 !important; } .scale-50 { --transform-scale-x: .5 !important; --transform-scale-y: .5 !important; } .scale-75 { --transform-scale-x: .75 !important; --transform-scale-y: .75 !important; } .scale-90 { --transform-scale-x: .9 !important; --transform-scale-y: .9 !important; } .scale-95 { --transform-scale-x: .95 !important; --transform-scale-y: .95 !important; } .scale-100 { --transform-scale-x: 1 !important; --transform-scale-y: 1 !important; } .scale-105 { --transform-scale-x: 1.05 !important; --transform-scale-y: 1.05 !important; } .scale-110 { --transform-scale-x: 1.1 !important; --transform-scale-y: 1.1 !important; } .scale-125 { --transform-scale-x: 1.25 !important; --transform-scale-y: 1.25 !important; } .scale-150 { --transform-scale-x: 1.5 !important; --transform-scale-y: 1.5 !important; } .scale-x-0 { --transform-scale-x: 0 !important; } .scale-x-50 { --transform-scale-x: .5 !important; } .scale-x-75 { --transform-scale-x: .75 !important; } .scale-x-90 { --transform-scale-x: .9 !important; } .scale-x-95 { --transform-scale-x: .95 !important; } .scale-x-100 { --transform-scale-x: 1 !important; } .scale-x-105 { --transform-scale-x: 1.05 !important; } .scale-x-110 { --transform-scale-x: 1.1 !important; } .scale-x-125 { --transform-scale-x: 1.25 !important; } .scale-x-150 { --transform-scale-x: 1.5 !important; } .scale-y-0 { --transform-scale-y: 0 !important; } .scale-y-50 { --transform-scale-y: .5 !important; } .scale-y-75 { --transform-scale-y: .75 !important; } .scale-y-90 { --transform-scale-y: .9 !important; } .scale-y-95 { --transform-scale-y: .95 !important; } .scale-y-100 { --transform-scale-y: 1 !important; } .scale-y-105 { --transform-scale-y: 1.05 !important; } .scale-y-110 { --transform-scale-y: 1.1 !important; } .scale-y-125 { --transform-scale-y: 1.25 !important; } .scale-y-150 { --transform-scale-y: 1.5 !important; } .rotate-0 { --transform-rotate: 0 !important; } .rotate-15 { --transform-rotate: 15deg !important; } .rotate-30 { --transform-rotate: 30deg !important; } .rotate-45 { --transform-rotate: 45deg !important; } .rotate-60 { --transform-rotate: 60deg !important; } .rotate-90 { --transform-rotate: 90deg !important; } .rotate-180 { --transform-rotate: 180deg !important; } .rotate-270 { --transform-rotate: 270deg !important; } .-rotate-180 { --transform-rotate: -180deg !important; } .-rotate-90 { --transform-rotate: -90deg !important; } .-rotate-45 { --transform-rotate: -45deg !important; } .-rotate-270 { --transform-rotate: 270deg !important; } .translate-x-0 { --transform-translate-x: 0 !important; } .translate-x-1 { --transform-translate-x: 0.25rem !important; } .translate-x-2 { --transform-translate-x: 0.5rem !important; } .translate-x-3 { --transform-translate-x: 0.75rem !important; } .translate-x-4 { --transform-translate-x: 1rem !important; } .translate-x-5 { --transform-translate-x: 1.25rem !important; } .translate-x-6 { --transform-translate-x: 1.5rem !important; } .translate-x-8 { --transform-translate-x: 2rem !important; } .translate-x-10 { --transform-translate-x: 2.5rem !important; } .translate-x-12 { --transform-translate-x: 3rem !important; } .translate-x-14 { --transform-translate-x: 3.5rem !important; } .translate-x-16 { --transform-translate-x: 4rem !important; } .translate-x-18 { --transform-translate-x: 4.5rem !important; } .translate-x-20 { --transform-translate-x: 5rem !important; } .translate-x-22 { --transform-translate-x: 5.5rem !important; } .translate-x-24 { --transform-translate-x: 6rem !important; } .translate-x-26 { --transform-translate-x: 6.5rem !important; } .translate-x-28 { --transform-translate-x: 7rem !important; } .translate-x-30 { --transform-translate-x: 7.5rem !important; } .translate-x-32 { --transform-translate-x: 8rem !important; } .translate-x-36 { --transform-translate-x: 9rem !important; } .translate-x-40 { --transform-translate-x: 10rem !important; } .translate-x-48 { --transform-translate-x: 12rem !important; } .translate-x-56 { --transform-translate-x: 14rem !important; } .translate-x-64 { --transform-translate-x: 16rem !important; } .translate-x-px { --transform-translate-x: 1px !important; } .translate-x-2px { --transform-translate-x: 2px !important; } .-translate-x-1 { --transform-translate-x: -0.25rem !important; } .-translate-x-2 { --transform-translate-x: -0.5rem !important; } .-translate-x-3 { --transform-translate-x: -0.75rem !important; } .-translate-x-4 { --transform-translate-x: -1rem !important; } .-translate-x-5 { --transform-translate-x: -1.25rem !important; } .-translate-x-6 { --transform-translate-x: -1.5rem !important; } .-translate-x-8 { --transform-translate-x: -2rem !important; } .-translate-x-10 { --transform-translate-x: -2.5rem !important; } .-translate-x-12 { --transform-translate-x: -3rem !important; } .-translate-x-14 { --transform-translate-x: -3.5rem !important; } .-translate-x-16 { --transform-translate-x: -4rem !important; } .-translate-x-18 { --transform-translate-x: -4.5rem !important; } .-translate-x-20 { --transform-translate-x: -5rem !important; } .-translate-x-22 { --transform-translate-x: -5.5rem !important; } .-translate-x-24 { --transform-translate-x: -6rem !important; } .-translate-x-26 { --transform-translate-x: -6.5rem !important; } .-translate-x-28 { --transform-translate-x: -7rem !important; } .-translate-x-30 { --transform-translate-x: -7.5rem !important; } .-translate-x-32 { --transform-translate-x: -8rem !important; } .-translate-x-36 { --transform-translate-x: -9rem !important; } .-translate-x-40 { --transform-translate-x: -10rem !important; } .-translate-x-48 { --transform-translate-x: -12rem !important; } .-translate-x-56 { --transform-translate-x: -14rem !important; } .-translate-x-64 { --transform-translate-x: -16rem !important; } .-translate-x-px { --transform-translate-x: -1px !important; } .-translate-x-2px { --transform-translate-x: -2px !important; } .-translate-x-full { --transform-translate-x: -100% !important; } .-translate-x-1\/2 { --transform-translate-x: -50% !important; } .translate-x-1\/2 { --transform-translate-x: 50% !important; } .translate-x-full { --transform-translate-x: 100% !important; } .translate-y-0 { --transform-translate-y: 0 !important; } .translate-y-1 { --transform-translate-y: 0.25rem !important; } .translate-y-2 { --transform-translate-y: 0.5rem !important; } .translate-y-3 { --transform-translate-y: 0.75rem !important; } .translate-y-4 { --transform-translate-y: 1rem !important; } .translate-y-5 { --transform-translate-y: 1.25rem !important; } .translate-y-6 { --transform-translate-y: 1.5rem !important; } .translate-y-8 { --transform-translate-y: 2rem !important; } .translate-y-10 { --transform-translate-y: 2.5rem !important; } .translate-y-12 { --transform-translate-y: 3rem !important; } .translate-y-14 { --transform-translate-y: 3.5rem !important; } .translate-y-16 { --transform-translate-y: 4rem !important; } .translate-y-18 { --transform-translate-y: 4.5rem !important; } .translate-y-20 { --transform-translate-y: 5rem !important; } .translate-y-22 { --transform-translate-y: 5.5rem !important; } .translate-y-24 { --transform-translate-y: 6rem !important; } .translate-y-26 { --transform-translate-y: 6.5rem !important; } .translate-y-28 { --transform-translate-y: 7rem !important; } .translate-y-30 { --transform-translate-y: 7.5rem !important; } .translate-y-32 { --transform-translate-y: 8rem !important; } .translate-y-36 { --transform-translate-y: 9rem !important; } .translate-y-40 { --transform-translate-y: 10rem !important; } .translate-y-48 { --transform-translate-y: 12rem !important; } .translate-y-56 { --transform-translate-y: 14rem !important; } .translate-y-64 { --transform-translate-y: 16rem !important; } .translate-y-px { --transform-translate-y: 1px !important; } .translate-y-2px { --transform-translate-y: 2px !important; } .-translate-y-1 { --transform-translate-y: -0.25rem !important; } .-translate-y-2 { --transform-translate-y: -0.5rem !important; } .-translate-y-3 { --transform-translate-y: -0.75rem !important; } .-translate-y-4 { --transform-translate-y: -1rem !important; } .-translate-y-5 { --transform-translate-y: -1.25rem !important; } .-translate-y-6 { --transform-translate-y: -1.5rem !important; } .-translate-y-8 { --transform-translate-y: -2rem !important; } .-translate-y-10 { --transform-translate-y: -2.5rem !important; } .-translate-y-12 { --transform-translate-y: -3rem !important; } .-translate-y-14 { --transform-translate-y: -3.5rem !important; } .-translate-y-16 { --transform-translate-y: -4rem !important; } .-translate-y-18 { --transform-translate-y: -4.5rem !important; } .-translate-y-20 { --transform-translate-y: -5rem !important; } .-translate-y-22 { --transform-translate-y: -5.5rem !important; } .-translate-y-24 { --transform-translate-y: -6rem !important; } .-translate-y-26 { --transform-translate-y: -6.5rem !important; } .-translate-y-28 { --transform-translate-y: -7rem !important; } .-translate-y-30 { --transform-translate-y: -7.5rem !important; } .-translate-y-32 { --transform-translate-y: -8rem !important; } .-translate-y-36 { --transform-translate-y: -9rem !important; } .-translate-y-40 { --transform-translate-y: -10rem !important; } .-translate-y-48 { --transform-translate-y: -12rem !important; } .-translate-y-56 { --transform-translate-y: -14rem !important; } .-translate-y-64 { --transform-translate-y: -16rem !important; } .-translate-y-px { --transform-translate-y: -1px !important; } .-translate-y-2px { --transform-translate-y: -2px !important; } .-translate-y-full { --transform-translate-y: -100% !important; } .-translate-y-1\/2 { --transform-translate-y: -50% !important; } .translate-y-1\/2 { --transform-translate-y: 50% !important; } .translate-y-full { --transform-translate-y: 100% !important; } .skew-x-0 { --transform-skew-x: 0 !important; } .skew-x-3 { --transform-skew-x: 3deg !important; } .skew-x-6 { --transform-skew-x: 6deg !important; } .skew-x-12 { --transform-skew-x: 12deg !important; } .-skew-x-12 { --transform-skew-x: -12deg !important; } .-skew-x-6 { --transform-skew-x: -6deg !important; } .-skew-x-3 { --transform-skew-x: -3deg !important; } .skew-y-0 { --transform-skew-y: 0 !important; } .skew-y-3 { --transform-skew-y: 3deg !important; } .skew-y-6 { --transform-skew-y: 6deg !important; } .skew-y-12 { --transform-skew-y: 12deg !important; } .-skew-y-12 { --transform-skew-y: -12deg !important; } .-skew-y-6 { --transform-skew-y: -6deg !important; } .-skew-y-3 { --transform-skew-y: -3deg !important; } .transition-none { transition-property: none !important; } .transition-all { transition-property: all !important; } .transition { transition-property: background-color, border-color, color, fill, stroke, opacity, box-shadow, transform !important; } .transition-colors { transition-property: background-color, border-color, color, fill, stroke !important; } .transition-opacity { transition-property: opacity !important; } .transition-shadow { transition-property: box-shadow !important; } .transition-transform { transition-property: transform !important; } .ease-linear { transition-timing-function: linear !important; } .ease-in { transition-timing-function: cubic-bezier(0.4, 0, 1, 1) !important; } .ease-out { transition-timing-function: cubic-bezier(0, 0, 0.2, 1) !important; } .ease-in-out { transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; } .duration-75 { transition-duration: 75ms !important; } .duration-100 { transition-duration: 100ms !important; } .duration-150 { transition-duration: 150ms !important; } .duration-200 { transition-duration: 200ms !important; } .duration-300 { transition-duration: 300ms !important; } .duration-500 { transition-duration: 500ms !important; } .duration-700 { transition-duration: 700ms !important; } .duration-1000 { transition-duration: 1000ms !important; } .delay-75 { transition-delay: 75ms !important; } .delay-100 { transition-delay: 100ms !important; } .delay-150 { transition-delay: 150ms !important; } .delay-200 { transition-delay: 200ms !important; } .delay-300 { transition-delay: 300ms !important; } .delay-500 { transition-delay: 500ms !important; } .delay-700 { transition-delay: 700ms !important; } .delay-1000 { transition-delay: 1000ms !important; } .text-black-contrast { color: #FFFFFF !important; } .bg-black-contrast { background-color: #FFFFFF !important; } .text-white-contrast { color: #252F3F !important; } .bg-white-contrast { background-color: #252F3F !important; } .text-gray-50-contrast { color: #161E2E !important; } .bg-gray-50-contrast { background-color: #161E2E !important; } .text-gray-100-contrast { color: #161E2E !important; } .bg-gray-100-contrast { background-color: #161E2E !important; } .text-gray-200-contrast { color: #161E2E !important; } .bg-gray-200-contrast { background-color: #161E2E !important; } .text-gray-300-contrast { color: #161E2E !important; } .bg-gray-300-contrast { background-color: #161E2E !important; } .text-gray-400-contrast { color: #161E2E !important; } .bg-gray-400-contrast { background-color: #161E2E !important; } .text-gray-500-contrast { color: #161E2E !important; } .bg-gray-500-contrast { background-color: #161E2E !important; } .text-gray-600-contrast { color: #F9FAFB !important; } .bg-gray-600-contrast { background-color: #F9FAFB !important; } .text-gray-700-contrast { color: #F9FAFB !important; } .bg-gray-700-contrast { background-color: #F9FAFB !important; } .text-gray-800-contrast { color: #F9FAFB !important; } .bg-gray-800-contrast { background-color: #F9FAFB !important; } .text-gray-900-contrast { color: #F9FAFB !important; } .bg-gray-900-contrast { background-color: #F9FAFB !important; } .text-gray-contrast { color: #161E2E !important; } .bg-gray-contrast { background-color: #161E2E !important; } .text-cool-gray-50-contrast { color: #1A202E !important; } .bg-cool-gray-50-contrast { background-color: #1A202E !important; } .text-cool-gray-100-contrast { color: #1A202E !important; } .bg-cool-gray-100-contrast { background-color: #1A202E !important; } .text-cool-gray-200-contrast { color: #1A202E !important; } .bg-cool-gray-200-contrast { background-color: #1A202E !important; } .text-cool-gray-300-contrast { color: #1A202E !important; } .bg-cool-gray-300-contrast { background-color: #1A202E !important; } .text-cool-gray-400-contrast { color: #1A202E !important; } .bg-cool-gray-400-contrast { background-color: #1A202E !important; } .text-cool-gray-500-contrast { color: #1A202E !important; } .bg-cool-gray-500-contrast { background-color: #1A202E !important; } .text-cool-gray-600-contrast { color: #FBFDFE !important; } .bg-cool-gray-600-contrast { background-color: #FBFDFE !important; } .text-cool-gray-700-contrast { color: #FBFDFE !important; } .bg-cool-gray-700-contrast { background-color: #FBFDFE !important; } .text-cool-gray-800-contrast { color: #FBFDFE !important; } .bg-cool-gray-800-contrast { background-color: #FBFDFE !important; } .text-cool-gray-900-contrast { color: #FBFDFE !important; } .bg-cool-gray-900-contrast { background-color: #FBFDFE !important; } .text-cool-gray-contrast { color: #1A202E !important; } .bg-cool-gray-contrast { background-color: #1A202E !important; } .text-red-50-contrast { color: #771D1D !important; } .bg-red-50-contrast { background-color: #771D1D !important; } .text-red-100-contrast { color: #771D1D !important; } .bg-red-100-contrast { background-color: #771D1D !important; } .text-red-200-contrast { color: #771D1D !important; } .bg-red-200-contrast { background-color: #771D1D !important; } .text-red-300-contrast { color: #771D1D !important; } .bg-red-300-contrast { background-color: #771D1D !important; } .text-red-400-contrast { color: #771D1D !important; } .bg-red-400-contrast { background-color: #771D1D !important; } .text-red-500-contrast { color: #771D1D !important; } .bg-red-500-contrast { background-color: #771D1D !important; } .text-red-600-contrast { color: #FDF2F2 !important; } .bg-red-600-contrast { background-color: #FDF2F2 !important; } .text-red-700-contrast { color: #FDF2F2 !important; } .bg-red-700-contrast { background-color: #FDF2F2 !important; } .text-red-800-contrast { color: #FDF2F2 !important; } .bg-red-800-contrast { background-color: #FDF2F2 !important; } .text-red-900-contrast { color: #FDF2F2 !important; } .bg-red-900-contrast { background-color: #FDF2F2 !important; } .text-red-contrast { color: #771D1D !important; } .bg-red-contrast { background-color: #771D1D !important; } .text-orange-50-contrast { color: #771D1D !important; } .bg-orange-50-contrast { background-color: #771D1D !important; } .text-orange-100-contrast { color: #771D1D !important; } .bg-orange-100-contrast { background-color: #771D1D !important; } .text-orange-200-contrast { color: #771D1D !important; } .bg-orange-200-contrast { background-color: #771D1D !important; } .text-orange-300-contrast { color: #771D1D !important; } .bg-orange-300-contrast { background-color: #771D1D !important; } .text-orange-400-contrast { color: #771D1D !important; } .bg-orange-400-contrast { background-color: #771D1D !important; } .text-orange-500-contrast { color: #771D1D !important; } .bg-orange-500-contrast { background-color: #771D1D !important; } .text-orange-600-contrast { color: #FFF8F1 !important; } .bg-orange-600-contrast { background-color: #FFF8F1 !important; } .text-orange-700-contrast { color: #FFF8F1 !important; } .bg-orange-700-contrast { background-color: #FFF8F1 !important; } .text-orange-800-contrast { color: #FFF8F1 !important; } .bg-orange-800-contrast { background-color: #FFF8F1 !important; } .text-orange-900-contrast { color: #FFF8F1 !important; } .bg-orange-900-contrast { background-color: #FFF8F1 !important; } .text-orange-contrast { color: #771D1D !important; } .bg-orange-contrast { background-color: #771D1D !important; } .text-yellow-50-contrast { color: #633112 !important; } .bg-yellow-50-contrast { background-color: #633112 !important; } .text-yellow-100-contrast { color: #633112 !important; } .bg-yellow-100-contrast { background-color: #633112 !important; } .text-yellow-200-contrast { color: #633112 !important; } .bg-yellow-200-contrast { background-color: #633112 !important; } .text-yellow-300-contrast { color: #633112 !important; } .bg-yellow-300-contrast { background-color: #633112 !important; } .text-yellow-400-contrast { color: #633112 !important; } .bg-yellow-400-contrast { background-color: #633112 !important; } .text-yellow-500-contrast { color: #633112 !important; } .bg-yellow-500-contrast { background-color: #633112 !important; } .text-yellow-600-contrast { color: #FDFDEA !important; } .bg-yellow-600-contrast { background-color: #FDFDEA !important; } .text-yellow-700-contrast { color: #FDFDEA !important; } .bg-yellow-700-contrast { background-color: #FDFDEA !important; } .text-yellow-800-contrast { color: #FDFDEA !important; } .bg-yellow-800-contrast { background-color: #FDFDEA !important; } .text-yellow-900-contrast { color: #FDFDEA !important; } .bg-yellow-900-contrast { background-color: #FDFDEA !important; } .text-yellow-contrast { color: #633112 !important; } .bg-yellow-contrast { background-color: #633112 !important; } .text-green-50-contrast { color: #014737 !important; } .bg-green-50-contrast { background-color: #014737 !important; } .text-green-100-contrast { color: #014737 !important; } .bg-green-100-contrast { background-color: #014737 !important; } .text-green-200-contrast { color: #014737 !important; } .bg-green-200-contrast { background-color: #014737 !important; } .text-green-300-contrast { color: #014737 !important; } .bg-green-300-contrast { background-color: #014737 !important; } .text-green-400-contrast { color: #014737 !important; } .bg-green-400-contrast { background-color: #014737 !important; } .text-green-500-contrast { color: #F3FAF7 !important; } .bg-green-500-contrast { background-color: #F3FAF7 !important; } .text-green-600-contrast { color: #F3FAF7 !important; } .bg-green-600-contrast { background-color: #F3FAF7 !important; } .text-green-700-contrast { color: #F3FAF7 !important; } .bg-green-700-contrast { background-color: #F3FAF7 !important; } .text-green-800-contrast { color: #F3FAF7 !important; } .bg-green-800-contrast { background-color: #F3FAF7 !important; } .text-green-900-contrast { color: #F3FAF7 !important; } .bg-green-900-contrast { background-color: #F3FAF7 !important; } .text-green-contrast { color: #F3FAF7 !important; } .bg-green-contrast { background-color: #F3FAF7 !important; } .text-teal-50-contrast { color: #014451 !important; } .bg-teal-50-contrast { background-color: #014451 !important; } .text-teal-100-contrast { color: #014451 !important; } .bg-teal-100-contrast { background-color: #014451 !important; } .text-teal-200-contrast { color: #014451 !important; } .bg-teal-200-contrast { background-color: #014451 !important; } .text-teal-300-contrast { color: #014451 !important; } .bg-teal-300-contrast { background-color: #014451 !important; } .text-teal-400-contrast { color: #014451 !important; } .bg-teal-400-contrast { background-color: #014451 !important; } .text-teal-500-contrast { color: #EDFAFA !important; } .bg-teal-500-contrast { background-color: #EDFAFA !important; } .text-teal-600-contrast { color: #EDFAFA !important; } .bg-teal-600-contrast { background-color: #EDFAFA !important; } .text-teal-700-contrast { color: #EDFAFA !important; } .bg-teal-700-contrast { background-color: #EDFAFA !important; } .text-teal-800-contrast { color: #EDFAFA !important; } .bg-teal-800-contrast { background-color: #EDFAFA !important; } .text-teal-900-contrast { color: #EDFAFA !important; } .bg-teal-900-contrast { background-color: #EDFAFA !important; } .text-teal-contrast { color: #EDFAFA !important; } .bg-teal-contrast { background-color: #EDFAFA !important; } .text-blue-50-contrast { color: #233876 !important; } .bg-blue-50-contrast { background-color: #233876 !important; } .text-blue-100-contrast { color: #233876 !important; } .bg-blue-100-contrast { background-color: #233876 !important; } .text-blue-200-contrast { color: #233876 !important; } .bg-blue-200-contrast { background-color: #233876 !important; } .text-blue-300-contrast { color: #233876 !important; } .bg-blue-300-contrast { background-color: #233876 !important; } .text-blue-400-contrast { color: #233876 !important; } .bg-blue-400-contrast { background-color: #233876 !important; } .text-blue-500-contrast { color: #EBF5FF !important; } .bg-blue-500-contrast { background-color: #EBF5FF !important; } .text-blue-600-contrast { color: #EBF5FF !important; } .bg-blue-600-contrast { background-color: #EBF5FF !important; } .text-blue-700-contrast { color: #EBF5FF !important; } .bg-blue-700-contrast { background-color: #EBF5FF !important; } .text-blue-800-contrast { color: #EBF5FF !important; } .bg-blue-800-contrast { background-color: #EBF5FF !important; } .text-blue-900-contrast { color: #EBF5FF !important; } .bg-blue-900-contrast { background-color: #EBF5FF !important; } .text-blue-contrast { color: #EBF5FF !important; } .bg-blue-contrast { background-color: #EBF5FF !important; } .text-indigo-50-contrast { color: #362F78 !important; } .bg-indigo-50-contrast { background-color: #362F78 !important; } .text-indigo-100-contrast { color: #362F78 !important; } .bg-indigo-100-contrast { background-color: #362F78 !important; } .text-indigo-200-contrast { color: #362F78 !important; } .bg-indigo-200-contrast { background-color: #362F78 !important; } .text-indigo-300-contrast { color: #362F78 !important; } .bg-indigo-300-contrast { background-color: #362F78 !important; } .text-indigo-400-contrast { color: #362F78 !important; } .bg-indigo-400-contrast { background-color: #362F78 !important; } .text-indigo-500-contrast { color: #F0F5FF !important; } .bg-indigo-500-contrast { background-color: #F0F5FF !important; } .text-indigo-600-contrast { color: #F0F5FF !important; } .bg-indigo-600-contrast { background-color: #F0F5FF !important; } .text-indigo-700-contrast { color: #F0F5FF !important; } .bg-indigo-700-contrast { background-color: #F0F5FF !important; } .text-indigo-800-contrast { color: #F0F5FF !important; } .bg-indigo-800-contrast { background-color: #F0F5FF !important; } .text-indigo-900-contrast { color: #F0F5FF !important; } .bg-indigo-900-contrast { background-color: #F0F5FF !important; } .text-indigo-contrast { color: #F0F5FF !important; } .bg-indigo-contrast { background-color: #F0F5FF !important; } .text-purple-50-contrast { color: #4A1D96 !important; } .bg-purple-50-contrast { background-color: #4A1D96 !important; } .text-purple-100-contrast { color: #4A1D96 !important; } .bg-purple-100-contrast { background-color: #4A1D96 !important; } .text-purple-200-contrast { color: #4A1D96 !important; } .bg-purple-200-contrast { background-color: #4A1D96 !important; } .text-purple-300-contrast { color: #4A1D96 !important; } .bg-purple-300-contrast { background-color: #4A1D96 !important; } .text-purple-400-contrast { color: #4A1D96 !important; } .bg-purple-400-contrast { background-color: #4A1D96 !important; } .text-purple-500-contrast { color: #F6F5FF !important; } .bg-purple-500-contrast { background-color: #F6F5FF !important; } .text-purple-600-contrast { color: #F6F5FF !important; } .bg-purple-600-contrast { background-color: #F6F5FF !important; } .text-purple-700-contrast { color: #F6F5FF !important; } .bg-purple-700-contrast { background-color: #F6F5FF !important; } .text-purple-800-contrast { color: #F6F5FF !important; } .bg-purple-800-contrast { background-color: #F6F5FF !important; } .text-purple-900-contrast { color: #F6F5FF !important; } .bg-purple-900-contrast { background-color: #F6F5FF !important; } .text-purple-contrast { color: #F6F5FF !important; } .bg-purple-contrast { background-color: #F6F5FF !important; } .text-pink-50-contrast { color: #751A3D !important; } .bg-pink-50-contrast { background-color: #751A3D !important; } .text-pink-100-contrast { color: #751A3D !important; } .bg-pink-100-contrast { background-color: #751A3D !important; } .text-pink-200-contrast { color: #751A3D !important; } .bg-pink-200-contrast { background-color: #751A3D !important; } .text-pink-300-contrast { color: #751A3D !important; } .bg-pink-300-contrast { background-color: #751A3D !important; } .text-pink-400-contrast { color: #751A3D !important; } .bg-pink-400-contrast { background-color: #751A3D !important; } .text-pink-500-contrast { color: #FDF2F8 !important; } .bg-pink-500-contrast { background-color: #FDF2F8 !important; } .text-pink-600-contrast { color: #FDF2F8 !important; } .bg-pink-600-contrast { background-color: #FDF2F8 !important; } .text-pink-700-contrast { color: #FDF2F8 !important; } .bg-pink-700-contrast { background-color: #FDF2F8 !important; } .text-pink-800-contrast { color: #FDF2F8 !important; } .bg-pink-800-contrast { background-color: #FDF2F8 !important; } .text-pink-900-contrast { color: #FDF2F8 !important; } .bg-pink-900-contrast { background-color: #FDF2F8 !important; } .text-pink-contrast { color: #FDF2F8 !important; } .bg-pink-contrast { background-color: #FDF2F8 !important; } .white { background-color: #FFFFFF !important; color: #252F3F !important; } .white.mat-icon, .white .mat-icon { color: #252F3F !important; } .white.text-secondary, .white .text-secondary { color: rgba(#252F3F, 0.7) !important; } .white.text-hint, .white .text-hint, .white.text-disabled, .white .text-disabled { color: rgba(#252F3F, 0.38) !important; } .white.divider, .white .divider { color: rgba(#252F3F, 0.12) !important; } .text-white.text-secondary, .text-white .text-secondary { color: rgba(#FFFFFF, 0.7) !important; } .text-white.text-hint, .text-white .text-hint, .text-white.text-disabled, .text-white .text-disabled { color: rgba(#FFFFFF, 0.38) !important; } .text-white.divider, .text-white .divider { color: rgba(#FFFFFF, 0.12) !important; } .black { background-color: #000000 !important; color: #FFFFFF !important; } .black.mat-icon, .black .mat-icon { color: #FFFFFF !important; } .black.text-secondary, .black .text-secondary { color: rgba(#FFFFFF, 0.7) !important; } .black.text-hint, .black .text-hint, .black.text-disabled, .black .text-disabled { color: rgba(#FFFFFF, 0.38) !important; } .black.divider, .black .divider { color: rgba(#FFFFFF, 0.12) !important; } .text-black.text-secondary, .text-black .text-secondary { color: rgba(#000000, 0.7) !important; } .text-black.text-hint, .text-black .text-hint, .text-black.text-disabled, .text-black .text-disabled { color: rgba(#000000, 0.38) !important; } .text-black.divider, .text-black .divider { color: rgba(#000000, 0.12) !important; } .gray-50 { background-color: #F9FAFB !important; color: #161E2E !important; } .gray-50.mat-icon, .gray-50 .mat-icon { color: #161E2E !important; } .gray-50.text-secondary, .gray-50 .text-secondary { color: rgba(#161E2E, 0.7) !important; } .gray-50.text-hint, .gray-50 .text-hint, .gray-50.text-disabled, .gray-50 .text-disabled { color: rgba(#161E2E, 0.38) !important; } .gray-50.divider, .gray-50 .divider { color: rgba(#161E2E, 0.12) !important; } .text-gray-50.text-secondary, .text-gray-50 .text-secondary { color: rgba(#F9FAFB, 0.7) !important; } .text-gray-50.text-hint, .text-gray-50 .text-hint, .text-gray-50.text-disabled, .text-gray-50 .text-disabled { color: rgba(#F9FAFB, 0.38) !important; } .text-gray-50.divider, .text-gray-50 .divider { color: rgba(#F9FAFB, 0.12) !important; } .gray-100 { background-color: #F4F5F7 !important; color: #161E2E !important; } .gray-100.mat-icon, .gray-100 .mat-icon { color: #161E2E !important; } .gray-100.text-secondary, .gray-100 .text-secondary { color: rgba(#161E2E, 0.7) !important; } .gray-100.text-hint, .gray-100 .text-hint, .gray-100.text-disabled, .gray-100 .text-disabled { color: rgba(#161E2E, 0.38) !important; } .gray-100.divider, .gray-100 .divider { color: rgba(#161E2E, 0.12) !important; } .text-gray-100.text-secondary, .text-gray-100 .text-secondary { color: rgba(#F4F5F7, 0.7) !important; } .text-gray-100.text-hint, .text-gray-100 .text-hint, .text-gray-100.text-disabled, .text-gray-100 .text-disabled { color: rgba(#F4F5F7, 0.38) !important; } .text-gray-100.divider, .text-gray-100 .divider { color: rgba(#F4F5F7, 0.12) !important; } .gray-200 { background-color: #E5E7EB !important; color: #161E2E !important; } .gray-200.mat-icon, .gray-200 .mat-icon { color: #161E2E !important; } .gray-200.text-secondary, .gray-200 .text-secondary { color: rgba(#161E2E, 0.7) !important; } .gray-200.text-hint, .gray-200 .text-hint, .gray-200.text-disabled, .gray-200 .text-disabled { color: rgba(#161E2E, 0.38) !important; } .gray-200.divider, .gray-200 .divider { color: rgba(#161E2E, 0.12) !important; } .text-gray-200.text-secondary, .text-gray-200 .text-secondary { color: rgba(#E5E7EB, 0.7) !important; } .text-gray-200.text-hint, .text-gray-200 .text-hint, .text-gray-200.text-disabled, .text-gray-200 .text-disabled { color: rgba(#E5E7EB, 0.38) !important; } .text-gray-200.divider, .text-gray-200 .divider { color: rgba(#E5E7EB, 0.12) !important; } .gray-300 { background-color: #D2D6DC !important; color: #161E2E !important; } .gray-300.mat-icon, .gray-300 .mat-icon { color: #161E2E !important; } .gray-300.text-secondary, .gray-300 .text-secondary { color: rgba(#161E2E, 0.7) !important; } .gray-300.text-hint, .gray-300 .text-hint, .gray-300.text-disabled, .gray-300 .text-disabled { color: rgba(#161E2E, 0.38) !important; } .gray-300.divider, .gray-300 .divider { color: rgba(#161E2E, 0.12) !important; } .text-gray-300.text-secondary, .text-gray-300 .text-secondary { color: rgba(#D2D6DC, 0.7) !important; } .text-gray-300.text-hint, .text-gray-300 .text-hint, .text-gray-300.text-disabled, .text-gray-300 .text-disabled { color: rgba(#D2D6DC, 0.38) !important; } .text-gray-300.divider, .text-gray-300 .divider { color: rgba(#D2D6DC, 0.12) !important; } .gray-400 { background-color: #9FA6B2 !important; color: #161E2E !important; } .gray-400.mat-icon, .gray-400 .mat-icon { color: #161E2E !important; } .gray-400.text-secondary, .gray-400 .text-secondary { color: rgba(#161E2E, 0.7) !important; } .gray-400.text-hint, .gray-400 .text-hint, .gray-400.text-disabled, .gray-400 .text-disabled { color: rgba(#161E2E, 0.38) !important; } .gray-400.divider, .gray-400 .divider { color: rgba(#161E2E, 0.12) !important; } .text-gray-400.text-secondary, .text-gray-400 .text-secondary { color: rgba(#9FA6B2, 0.7) !important; } .text-gray-400.text-hint, .text-gray-400 .text-hint, .text-gray-400.text-disabled, .text-gray-400 .text-disabled { color: rgba(#9FA6B2, 0.38) !important; } .text-gray-400.divider, .text-gray-400 .divider { color: rgba(#9FA6B2, 0.12) !important; } .gray-500 { background-color: #6B7280 !important; color: #161E2E !important; } .gray-500.mat-icon, .gray-500 .mat-icon { color: #161E2E !important; } .gray-500.text-secondary, .gray-500 .text-secondary { color: rgba(#161E2E, 0.7) !important; } .gray-500.text-hint, .gray-500 .text-hint, .gray-500.text-disabled, .gray-500 .text-disabled { color: rgba(#161E2E, 0.38) !important; } .gray-500.divider, .gray-500 .divider { color: rgba(#161E2E, 0.12) !important; } .text-gray-500.text-secondary, .text-gray-500 .text-secondary { color: rgba(#6B7280, 0.7) !important; } .text-gray-500.text-hint, .text-gray-500 .text-hint, .text-gray-500.text-disabled, .text-gray-500 .text-disabled { color: rgba(#6B7280, 0.38) !important; } .text-gray-500.divider, .text-gray-500 .divider { color: rgba(#6B7280, 0.12) !important; } .gray-600 { background-color: #4B5563 !important; color: #F9FAFB !important; } .gray-600.mat-icon, .gray-600 .mat-icon { color: #F9FAFB !important; } .gray-600.text-secondary, .gray-600 .text-secondary { color: rgba(#F9FAFB, 0.7) !important; } .gray-600.text-hint, .gray-600 .text-hint, .gray-600.text-disabled, .gray-600 .text-disabled { color: rgba(#F9FAFB, 0.38) !important; } .gray-600.divider, .gray-600 .divider { color: rgba(#F9FAFB, 0.12) !important; } .text-gray-600.text-secondary, .text-gray-600 .text-secondary { color: rgba(#4B5563, 0.7) !important; } .text-gray-600.text-hint, .text-gray-600 .text-hint, .text-gray-600.text-disabled, .text-gray-600 .text-disabled { color: rgba(#4B5563, 0.38) !important; } .text-gray-600.divider, .text-gray-600 .divider { color: rgba(#4B5563, 0.12) !important; } .gray-700 { background-color: #374151 !important; color: #F9FAFB !important; } .gray-700.mat-icon, .gray-700 .mat-icon { color: #F9FAFB !important; } .gray-700.text-secondary, .gray-700 .text-secondary { color: rgba(#F9FAFB, 0.7) !important; } .gray-700.text-hint, .gray-700 .text-hint, .gray-700.text-disabled, .gray-700 .text-disabled { color: rgba(#F9FAFB, 0.38) !important; } .gray-700.divider, .gray-700 .divider { color: rgba(#F9FAFB, 0.12) !important; } .text-gray-700.text-secondary, .text-gray-700 .text-secondary { color: rgba(#374151, 0.7) !important; } .text-gray-700.text-hint, .text-gray-700 .text-hint, .text-gray-700.text-disabled, .text-gray-700 .text-disabled { color: rgba(#374151, 0.38) !important; } .text-gray-700.divider, .text-gray-700 .divider { color: rgba(#374151, 0.12) !important; } .gray-800 { background-color: #252F3F !important; color: #F9FAFB !important; } .gray-800.mat-icon, .gray-800 .mat-icon { color: #F9FAFB !important; } .gray-800.text-secondary, .gray-800 .text-secondary { color: rgba(#F9FAFB, 0.7) !important; } .gray-800.text-hint, .gray-800 .text-hint, .gray-800.text-disabled, .gray-800 .text-disabled { color: rgba(#F9FAFB, 0.38) !important; } .gray-800.divider, .gray-800 .divider { color: rgba(#F9FAFB, 0.12) !important; } .text-gray-800.text-secondary, .text-gray-800 .text-secondary { color: rgba(#252F3F, 0.7) !important; } .text-gray-800.text-hint, .text-gray-800 .text-hint, .text-gray-800.text-disabled, .text-gray-800 .text-disabled { color: rgba(#252F3F, 0.38) !important; } .text-gray-800.divider, .text-gray-800 .divider { color: rgba(#252F3F, 0.12) !important; } .gray-900 { background-color: #161E2E !important; color: #F9FAFB !important; } .gray-900.mat-icon, .gray-900 .mat-icon { color: #F9FAFB !important; } .gray-900.text-secondary, .gray-900 .text-secondary { color: rgba(#F9FAFB, 0.7) !important; } .gray-900.text-hint, .gray-900 .text-hint, .gray-900.text-disabled, .gray-900 .text-disabled { color: rgba(#F9FAFB, 0.38) !important; } .gray-900.divider, .gray-900 .divider { color: rgba(#F9FAFB, 0.12) !important; } .text-gray-900.text-secondary, .text-gray-900 .text-secondary { color: rgba(#161E2E, 0.7) !important; } .text-gray-900.text-hint, .text-gray-900 .text-hint, .text-gray-900.text-disabled, .text-gray-900 .text-disabled { color: rgba(#161E2E, 0.38) !important; } .text-gray-900.divider, .text-gray-900 .divider { color: rgba(#161E2E, 0.12) !important; } .gray { background-color: #6B7280 !important; color: #161E2E !important; } .gray.mat-icon, .gray .mat-icon { color: #161E2E !important; } .gray.text-secondary, .gray .text-secondary { color: rgba(#161E2E, 0.7) !important; } .gray.text-hint, .gray .text-hint, .gray.text-disabled, .gray .text-disabled { color: rgba(#161E2E, 0.38) !important; } .gray.divider, .gray .divider { color: rgba(#161E2E, 0.12) !important; } .text-gray.text-secondary, .text-gray .text-secondary { color: rgba(#6B7280, 0.7) !important; } .text-gray.text-hint, .text-gray .text-hint, .text-gray.text-disabled, .text-gray .text-disabled { color: rgba(#6B7280, 0.38) !important; } .text-gray.divider, .text-gray .divider { color: rgba(#6B7280, 0.12) !important; } .cool-gray-50 { background-color: #FBFDFE !important; color: #1A202E !important; } .cool-gray-50.mat-icon, .cool-gray-50 .mat-icon { color: #1A202E !important; } .cool-gray-50.text-secondary, .cool-gray-50 .text-secondary { color: rgba(#1A202E, 0.7) !important; } .cool-gray-50.text-hint, .cool-gray-50 .text-hint, .cool-gray-50.text-disabled, .cool-gray-50 .text-disabled { color: rgba(#1A202E, 0.38) !important; } .cool-gray-50.divider, .cool-gray-50 .divider { color: rgba(#1A202E, 0.12) !important; } .text-cool-gray-50.text-secondary, .text-cool-gray-50 .text-secondary { color: rgba(#FBFDFE, 0.7) !important; } .text-cool-gray-50.text-hint, .text-cool-gray-50 .text-hint, .text-cool-gray-50.text-disabled, .text-cool-gray-50 .text-disabled { color: rgba(#FBFDFE, 0.38) !important; } .text-cool-gray-50.divider, .text-cool-gray-50 .divider { color: rgba(#FBFDFE, 0.12) !important; } .cool-gray-100 { background-color: #F1F5F9 !important; color: #1A202E !important; } .cool-gray-100.mat-icon, .cool-gray-100 .mat-icon { color: #1A202E !important; } .cool-gray-100.text-secondary, .cool-gray-100 .text-secondary { color: rgba(#1A202E, 0.7) !important; } .cool-gray-100.text-hint, .cool-gray-100 .text-hint, .cool-gray-100.text-disabled, .cool-gray-100 .text-disabled { color: rgba(#1A202E, 0.38) !important; } .cool-gray-100.divider, .cool-gray-100 .divider { color: rgba(#1A202E, 0.12) !important; } .text-cool-gray-100.text-secondary, .text-cool-gray-100 .text-secondary { color: rgba(#F1F5F9, 0.7) !important; } .text-cool-gray-100.text-hint, .text-cool-gray-100 .text-hint, .text-cool-gray-100.text-disabled, .text-cool-gray-100 .text-disabled { color: rgba(#F1F5F9, 0.38) !important; } .text-cool-gray-100.divider, .text-cool-gray-100 .divider { color: rgba(#F1F5F9, 0.12) !important; } .cool-gray-200 { background-color: #E2E8F0 !important; color: #1A202E !important; } .cool-gray-200.mat-icon, .cool-gray-200 .mat-icon { color: #1A202E !important; } .cool-gray-200.text-secondary, .cool-gray-200 .text-secondary { color: rgba(#1A202E, 0.7) !important; } .cool-gray-200.text-hint, .cool-gray-200 .text-hint, .cool-gray-200.text-disabled, .cool-gray-200 .text-disabled { color: rgba(#1A202E, 0.38) !important; } .cool-gray-200.divider, .cool-gray-200 .divider { color: rgba(#1A202E, 0.12) !important; } .text-cool-gray-200.text-secondary, .text-cool-gray-200 .text-secondary { color: rgba(#E2E8F0, 0.7) !important; } .text-cool-gray-200.text-hint, .text-cool-gray-200 .text-hint, .text-cool-gray-200.text-disabled, .text-cool-gray-200 .text-disabled { color: rgba(#E2E8F0, 0.38) !important; } .text-cool-gray-200.divider, .text-cool-gray-200 .divider { color: rgba(#E2E8F0, 0.12) !important; } .cool-gray-300 { background-color: #CFD8E3 !important; color: #1A202E !important; } .cool-gray-300.mat-icon, .cool-gray-300 .mat-icon { color: #1A202E !important; } .cool-gray-300.text-secondary, .cool-gray-300 .text-secondary { color: rgba(#1A202E, 0.7) !important; } .cool-gray-300.text-hint, .cool-gray-300 .text-hint, .cool-gray-300.text-disabled, .cool-gray-300 .text-disabled { color: rgba(#1A202E, 0.38) !important; } .cool-gray-300.divider, .cool-gray-300 .divider { color: rgba(#1A202E, 0.12) !important; } .text-cool-gray-300.text-secondary, .text-cool-gray-300 .text-secondary { color: rgba(#CFD8E3, 0.7) !important; } .text-cool-gray-300.text-hint, .text-cool-gray-300 .text-hint, .text-cool-gray-300.text-disabled, .text-cool-gray-300 .text-disabled { color: rgba(#CFD8E3, 0.38) !important; } .text-cool-gray-300.divider, .text-cool-gray-300 .divider { color: rgba(#CFD8E3, 0.12) !important; } .cool-gray-400 { background-color: #97A6BA !important; color: #1A202E !important; } .cool-gray-400.mat-icon, .cool-gray-400 .mat-icon { color: #1A202E !important; } .cool-gray-400.text-secondary, .cool-gray-400 .text-secondary { color: rgba(#1A202E, 0.7) !important; } .cool-gray-400.text-hint, .cool-gray-400 .text-hint, .cool-gray-400.text-disabled, .cool-gray-400 .text-disabled { color: rgba(#1A202E, 0.38) !important; } .cool-gray-400.divider, .cool-gray-400 .divider { color: rgba(#1A202E, 0.12) !important; } .text-cool-gray-400.text-secondary, .text-cool-gray-400 .text-secondary { color: rgba(#97A6BA, 0.7) !important; } .text-cool-gray-400.text-hint, .text-cool-gray-400 .text-hint, .text-cool-gray-400.text-disabled, .text-cool-gray-400 .text-disabled { color: rgba(#97A6BA, 0.38) !important; } .text-cool-gray-400.divider, .text-cool-gray-400 .divider { color: rgba(#97A6BA, 0.12) !important; } .cool-gray-500 { background-color: #64748B !important; color: #1A202E !important; } .cool-gray-500.mat-icon, .cool-gray-500 .mat-icon { color: #1A202E !important; } .cool-gray-500.text-secondary, .cool-gray-500 .text-secondary { color: rgba(#1A202E, 0.7) !important; } .cool-gray-500.text-hint, .cool-gray-500 .text-hint, .cool-gray-500.text-disabled, .cool-gray-500 .text-disabled { color: rgba(#1A202E, 0.38) !important; } .cool-gray-500.divider, .cool-gray-500 .divider { color: rgba(#1A202E, 0.12) !important; } .text-cool-gray-500.text-secondary, .text-cool-gray-500 .text-secondary { color: rgba(#64748B, 0.7) !important; } .text-cool-gray-500.text-hint, .text-cool-gray-500 .text-hint, .text-cool-gray-500.text-disabled, .text-cool-gray-500 .text-disabled { color: rgba(#64748B, 0.38) !important; } .text-cool-gray-500.divider, .text-cool-gray-500 .divider { color: rgba(#64748B, 0.12) !important; } .cool-gray-600 { background-color: #475569 !important; color: #FBFDFE !important; } .cool-gray-600.mat-icon, .cool-gray-600 .mat-icon { color: #FBFDFE !important; } .cool-gray-600.text-secondary, .cool-gray-600 .text-secondary { color: rgba(#FBFDFE, 0.7) !important; } .cool-gray-600.text-hint, .cool-gray-600 .text-hint, .cool-gray-600.text-disabled, .cool-gray-600 .text-disabled { color: rgba(#FBFDFE, 0.38) !important; } .cool-gray-600.divider, .cool-gray-600 .divider { color: rgba(#FBFDFE, 0.12) !important; } .text-cool-gray-600.text-secondary, .text-cool-gray-600 .text-secondary { color: rgba(#475569, 0.7) !important; } .text-cool-gray-600.text-hint, .text-cool-gray-600 .text-hint, .text-cool-gray-600.text-disabled, .text-cool-gray-600 .text-disabled { color: rgba(#475569, 0.38) !important; } .text-cool-gray-600.divider, .text-cool-gray-600 .divider { color: rgba(#475569, 0.12) !important; } .cool-gray-700 { background-color: #364152 !important; color: #FBFDFE !important; } .cool-gray-700.mat-icon, .cool-gray-700 .mat-icon { color: #FBFDFE !important; } .cool-gray-700.text-secondary, .cool-gray-700 .text-secondary { color: rgba(#FBFDFE, 0.7) !important; } .cool-gray-700.text-hint, .cool-gray-700 .text-hint, .cool-gray-700.text-disabled, .cool-gray-700 .text-disabled { color: rgba(#FBFDFE, 0.38) !important; } .cool-gray-700.divider, .cool-gray-700 .divider { color: rgba(#FBFDFE, 0.12) !important; } .text-cool-gray-700.text-secondary, .text-cool-gray-700 .text-secondary { color: rgba(#364152, 0.7) !important; } .text-cool-gray-700.text-hint, .text-cool-gray-700 .text-hint, .text-cool-gray-700.text-disabled, .text-cool-gray-700 .text-disabled { color: rgba(#364152, 0.38) !important; } .text-cool-gray-700.divider, .text-cool-gray-700 .divider { color: rgba(#364152, 0.12) !important; } .cool-gray-800 { background-color: #27303F !important; color: #FBFDFE !important; } .cool-gray-800.mat-icon, .cool-gray-800 .mat-icon { color: #FBFDFE !important; } .cool-gray-800.text-secondary, .cool-gray-800 .text-secondary { color: rgba(#FBFDFE, 0.7) !important; } .cool-gray-800.text-hint, .cool-gray-800 .text-hint, .cool-gray-800.text-disabled, .cool-gray-800 .text-disabled { color: rgba(#FBFDFE, 0.38) !important; } .cool-gray-800.divider, .cool-gray-800 .divider { color: rgba(#FBFDFE, 0.12) !important; } .text-cool-gray-800.text-secondary, .text-cool-gray-800 .text-secondary { color: rgba(#27303F, 0.7) !important; } .text-cool-gray-800.text-hint, .text-cool-gray-800 .text-hint, .text-cool-gray-800.text-disabled, .text-cool-gray-800 .text-disabled { color: rgba(#27303F, 0.38) !important; } .text-cool-gray-800.divider, .text-cool-gray-800 .divider { color: rgba(#27303F, 0.12) !important; } .cool-gray-900 { background-color: #1A202E !important; color: #FBFDFE !important; } .cool-gray-900.mat-icon, .cool-gray-900 .mat-icon { color: #FBFDFE !important; } .cool-gray-900.text-secondary, .cool-gray-900 .text-secondary { color: rgba(#FBFDFE, 0.7) !important; } .cool-gray-900.text-hint, .cool-gray-900 .text-hint, .cool-gray-900.text-disabled, .cool-gray-900 .text-disabled { color: rgba(#FBFDFE, 0.38) !important; } .cool-gray-900.divider, .cool-gray-900 .divider { color: rgba(#FBFDFE, 0.12) !important; } .text-cool-gray-900.text-secondary, .text-cool-gray-900 .text-secondary { color: rgba(#1A202E, 0.7) !important; } .text-cool-gray-900.text-hint, .text-cool-gray-900 .text-hint, .text-cool-gray-900.text-disabled, .text-cool-gray-900 .text-disabled { color: rgba(#1A202E, 0.38) !important; } .text-cool-gray-900.divider, .text-cool-gray-900 .divider { color: rgba(#1A202E, 0.12) !important; } .cool-gray { background-color: #64748B !important; color: #1A202E !important; } .cool-gray.mat-icon, .cool-gray .mat-icon { color: #1A202E !important; } .cool-gray.text-secondary, .cool-gray .text-secondary { color: rgba(#1A202E, 0.7) !important; } .cool-gray.text-hint, .cool-gray .text-hint, .cool-gray.text-disabled, .cool-gray .text-disabled { color: rgba(#1A202E, 0.38) !important; } .cool-gray.divider, .cool-gray .divider { color: rgba(#1A202E, 0.12) !important; } .text-cool-gray.text-secondary, .text-cool-gray .text-secondary { color: rgba(#64748B, 0.7) !important; } .text-cool-gray.text-hint, .text-cool-gray .text-hint, .text-cool-gray.text-disabled, .text-cool-gray .text-disabled { color: rgba(#64748B, 0.38) !important; } .text-cool-gray.divider, .text-cool-gray .divider { color: rgba(#64748B, 0.12) !important; } .red-50 { background-color: #FDF2F2 !important; color: #771D1D !important; } .red-50.mat-icon, .red-50 .mat-icon { color: #771D1D !important; } .red-50.text-secondary, .red-50 .text-secondary { color: rgba(#771D1D, 0.7) !important; } .red-50.text-hint, .red-50 .text-hint, .red-50.text-disabled, .red-50 .text-disabled { color: rgba(#771D1D, 0.38) !important; } .red-50.divider, .red-50 .divider { color: rgba(#771D1D, 0.12) !important; } .text-red-50.text-secondary, .text-red-50 .text-secondary { color: rgba(#FDF2F2, 0.7) !important; } .text-red-50.text-hint, .text-red-50 .text-hint, .text-red-50.text-disabled, .text-red-50 .text-disabled { color: rgba(#FDF2F2, 0.38) !important; } .text-red-50.divider, .text-red-50 .divider { color: rgba(#FDF2F2, 0.12) !important; } .red-100 { background-color: #FDE8E8 !important; color: #771D1D !important; } .red-100.mat-icon, .red-100 .mat-icon { color: #771D1D !important; } .red-100.text-secondary, .red-100 .text-secondary { color: rgba(#771D1D, 0.7) !important; } .red-100.text-hint, .red-100 .text-hint, .red-100.text-disabled, .red-100 .text-disabled { color: rgba(#771D1D, 0.38) !important; } .red-100.divider, .red-100 .divider { color: rgba(#771D1D, 0.12) !important; } .text-red-100.text-secondary, .text-red-100 .text-secondary { color: rgba(#FDE8E8, 0.7) !important; } .text-red-100.text-hint, .text-red-100 .text-hint, .text-red-100.text-disabled, .text-red-100 .text-disabled { color: rgba(#FDE8E8, 0.38) !important; } .text-red-100.divider, .text-red-100 .divider { color: rgba(#FDE8E8, 0.12) !important; } .red-200 { background-color: #FBD5D5 !important; color: #771D1D !important; } .red-200.mat-icon, .red-200 .mat-icon { color: #771D1D !important; } .red-200.text-secondary, .red-200 .text-secondary { color: rgba(#771D1D, 0.7) !important; } .red-200.text-hint, .red-200 .text-hint, .red-200.text-disabled, .red-200 .text-disabled { color: rgba(#771D1D, 0.38) !important; } .red-200.divider, .red-200 .divider { color: rgba(#771D1D, 0.12) !important; } .text-red-200.text-secondary, .text-red-200 .text-secondary { color: rgba(#FBD5D5, 0.7) !important; } .text-red-200.text-hint, .text-red-200 .text-hint, .text-red-200.text-disabled, .text-red-200 .text-disabled { color: rgba(#FBD5D5, 0.38) !important; } .text-red-200.divider, .text-red-200 .divider { color: rgba(#FBD5D5, 0.12) !important; } .red-300 { background-color: #F8B4B4 !important; color: #771D1D !important; } .red-300.mat-icon, .red-300 .mat-icon { color: #771D1D !important; } .red-300.text-secondary, .red-300 .text-secondary { color: rgba(#771D1D, 0.7) !important; } .red-300.text-hint, .red-300 .text-hint, .red-300.text-disabled, .red-300 .text-disabled { color: rgba(#771D1D, 0.38) !important; } .red-300.divider, .red-300 .divider { color: rgba(#771D1D, 0.12) !important; } .text-red-300.text-secondary, .text-red-300 .text-secondary { color: rgba(#F8B4B4, 0.7) !important; } .text-red-300.text-hint, .text-red-300 .text-hint, .text-red-300.text-disabled, .text-red-300 .text-disabled { color: rgba(#F8B4B4, 0.38) !important; } .text-red-300.divider, .text-red-300 .divider { color: rgba(#F8B4B4, 0.12) !important; } .red-400 { background-color: #F98080 !important; color: #771D1D !important; } .red-400.mat-icon, .red-400 .mat-icon { color: #771D1D !important; } .red-400.text-secondary, .red-400 .text-secondary { color: rgba(#771D1D, 0.7) !important; } .red-400.text-hint, .red-400 .text-hint, .red-400.text-disabled, .red-400 .text-disabled { color: rgba(#771D1D, 0.38) !important; } .red-400.divider, .red-400 .divider { color: rgba(#771D1D, 0.12) !important; } .text-red-400.text-secondary, .text-red-400 .text-secondary { color: rgba(#F98080, 0.7) !important; } .text-red-400.text-hint, .text-red-400 .text-hint, .text-red-400.text-disabled, .text-red-400 .text-disabled { color: rgba(#F98080, 0.38) !important; } .text-red-400.divider, .text-red-400 .divider { color: rgba(#F98080, 0.12) !important; } .red-500 { background-color: #F05252 !important; color: #771D1D !important; } .red-500.mat-icon, .red-500 .mat-icon { color: #771D1D !important; } .red-500.text-secondary, .red-500 .text-secondary { color: rgba(#771D1D, 0.7) !important; } .red-500.text-hint, .red-500 .text-hint, .red-500.text-disabled, .red-500 .text-disabled { color: rgba(#771D1D, 0.38) !important; } .red-500.divider, .red-500 .divider { color: rgba(#771D1D, 0.12) !important; } .text-red-500.text-secondary, .text-red-500 .text-secondary { color: rgba(#F05252, 0.7) !important; } .text-red-500.text-hint, .text-red-500 .text-hint, .text-red-500.text-disabled, .text-red-500 .text-disabled { color: rgba(#F05252, 0.38) !important; } .text-red-500.divider, .text-red-500 .divider { color: rgba(#F05252, 0.12) !important; } .red-600 { background-color: #E02424 !important; color: #FDF2F2 !important; } .red-600.mat-icon, .red-600 .mat-icon { color: #FDF2F2 !important; } .red-600.text-secondary, .red-600 .text-secondary { color: rgba(#FDF2F2, 0.7) !important; } .red-600.text-hint, .red-600 .text-hint, .red-600.text-disabled, .red-600 .text-disabled { color: rgba(#FDF2F2, 0.38) !important; } .red-600.divider, .red-600 .divider { color: rgba(#FDF2F2, 0.12) !important; } .text-red-600.text-secondary, .text-red-600 .text-secondary { color: rgba(#E02424, 0.7) !important; } .text-red-600.text-hint, .text-red-600 .text-hint, .text-red-600.text-disabled, .text-red-600 .text-disabled { color: rgba(#E02424, 0.38) !important; } .text-red-600.divider, .text-red-600 .divider { color: rgba(#E02424, 0.12) !important; } .red-700 { background-color: #C81E1E !important; color: #FDF2F2 !important; } .red-700.mat-icon, .red-700 .mat-icon { color: #FDF2F2 !important; } .red-700.text-secondary, .red-700 .text-secondary { color: rgba(#FDF2F2, 0.7) !important; } .red-700.text-hint, .red-700 .text-hint, .red-700.text-disabled, .red-700 .text-disabled { color: rgba(#FDF2F2, 0.38) !important; } .red-700.divider, .red-700 .divider { color: rgba(#FDF2F2, 0.12) !important; } .text-red-700.text-secondary, .text-red-700 .text-secondary { color: rgba(#C81E1E, 0.7) !important; } .text-red-700.text-hint, .text-red-700 .text-hint, .text-red-700.text-disabled, .text-red-700 .text-disabled { color: rgba(#C81E1E, 0.38) !important; } .text-red-700.divider, .text-red-700 .divider { color: rgba(#C81E1E, 0.12) !important; } .red-800 { background-color: #9B1C1C !important; color: #FDF2F2 !important; } .red-800.mat-icon, .red-800 .mat-icon { color: #FDF2F2 !important; } .red-800.text-secondary, .red-800 .text-secondary { color: rgba(#FDF2F2, 0.7) !important; } .red-800.text-hint, .red-800 .text-hint, .red-800.text-disabled, .red-800 .text-disabled { color: rgba(#FDF2F2, 0.38) !important; } .red-800.divider, .red-800 .divider { color: rgba(#FDF2F2, 0.12) !important; } .text-red-800.text-secondary, .text-red-800 .text-secondary { color: rgba(#9B1C1C, 0.7) !important; } .text-red-800.text-hint, .text-red-800 .text-hint, .text-red-800.text-disabled, .text-red-800 .text-disabled { color: rgba(#9B1C1C, 0.38) !important; } .text-red-800.divider, .text-red-800 .divider { color: rgba(#9B1C1C, 0.12) !important; } .red-900 { background-color: #771D1D !important; color: #FDF2F2 !important; } .red-900.mat-icon, .red-900 .mat-icon { color: #FDF2F2 !important; } .red-900.text-secondary, .red-900 .text-secondary { color: rgba(#FDF2F2, 0.7) !important; } .red-900.text-hint, .red-900 .text-hint, .red-900.text-disabled, .red-900 .text-disabled { color: rgba(#FDF2F2, 0.38) !important; } .red-900.divider, .red-900 .divider { color: rgba(#FDF2F2, 0.12) !important; } .text-red-900.text-secondary, .text-red-900 .text-secondary { color: rgba(#771D1D, 0.7) !important; } .text-red-900.text-hint, .text-red-900 .text-hint, .text-red-900.text-disabled, .text-red-900 .text-disabled { color: rgba(#771D1D, 0.38) !important; } .text-red-900.divider, .text-red-900 .divider { color: rgba(#771D1D, 0.12) !important; } .red { background-color: #F05252 !important; color: #771D1D !important; } .red.mat-icon, .red .mat-icon { color: #771D1D !important; } .red.text-secondary, .red .text-secondary { color: rgba(#771D1D, 0.7) !important; } .red.text-hint, .red .text-hint, .red.text-disabled, .red .text-disabled { color: rgba(#771D1D, 0.38) !important; } .red.divider, .red .divider { color: rgba(#771D1D, 0.12) !important; } .text-red.text-secondary, .text-red .text-secondary { color: rgba(#F05252, 0.7) !important; } .text-red.text-hint, .text-red .text-hint, .text-red.text-disabled, .text-red .text-disabled { color: rgba(#F05252, 0.38) !important; } .text-red.divider, .text-red .divider { color: rgba(#F05252, 0.12) !important; } .orange-50 { background-color: #FFF8F1 !important; color: #771D1D !important; } .orange-50.mat-icon, .orange-50 .mat-icon { color: #771D1D !important; } .orange-50.text-secondary, .orange-50 .text-secondary { color: rgba(#771D1D, 0.7) !important; } .orange-50.text-hint, .orange-50 .text-hint, .orange-50.text-disabled, .orange-50 .text-disabled { color: rgba(#771D1D, 0.38) !important; } .orange-50.divider, .orange-50 .divider { color: rgba(#771D1D, 0.12) !important; } .text-orange-50.text-secondary, .text-orange-50 .text-secondary { color: rgba(#FFF8F1, 0.7) !important; } .text-orange-50.text-hint, .text-orange-50 .text-hint, .text-orange-50.text-disabled, .text-orange-50 .text-disabled { color: rgba(#FFF8F1, 0.38) !important; } .text-orange-50.divider, .text-orange-50 .divider { color: rgba(#FFF8F1, 0.12) !important; } .orange-100 { background-color: #FEECDC !important; color: #771D1D !important; } .orange-100.mat-icon, .orange-100 .mat-icon { color: #771D1D !important; } .orange-100.text-secondary, .orange-100 .text-secondary { color: rgba(#771D1D, 0.7) !important; } .orange-100.text-hint, .orange-100 .text-hint, .orange-100.text-disabled, .orange-100 .text-disabled { color: rgba(#771D1D, 0.38) !important; } .orange-100.divider, .orange-100 .divider { color: rgba(#771D1D, 0.12) !important; } .text-orange-100.text-secondary, .text-orange-100 .text-secondary { color: rgba(#FEECDC, 0.7) !important; } .text-orange-100.text-hint, .text-orange-100 .text-hint, .text-orange-100.text-disabled, .text-orange-100 .text-disabled { color: rgba(#FEECDC, 0.38) !important; } .text-orange-100.divider, .text-orange-100 .divider { color: rgba(#FEECDC, 0.12) !important; } .orange-200 { background-color: #FCD9BD !important; color: #771D1D !important; } .orange-200.mat-icon, .orange-200 .mat-icon { color: #771D1D !important; } .orange-200.text-secondary, .orange-200 .text-secondary { color: rgba(#771D1D, 0.7) !important; } .orange-200.text-hint, .orange-200 .text-hint, .orange-200.text-disabled, .orange-200 .text-disabled { color: rgba(#771D1D, 0.38) !important; } .orange-200.divider, .orange-200 .divider { color: rgba(#771D1D, 0.12) !important; } .text-orange-200.text-secondary, .text-orange-200 .text-secondary { color: rgba(#FCD9BD, 0.7) !important; } .text-orange-200.text-hint, .text-orange-200 .text-hint, .text-orange-200.text-disabled, .text-orange-200 .text-disabled { color: rgba(#FCD9BD, 0.38) !important; } .text-orange-200.divider, .text-orange-200 .divider { color: rgba(#FCD9BD, 0.12) !important; } .orange-300 { background-color: #FDBA8C !important; color: #771D1D !important; } .orange-300.mat-icon, .orange-300 .mat-icon { color: #771D1D !important; } .orange-300.text-secondary, .orange-300 .text-secondary { color: rgba(#771D1D, 0.7) !important; } .orange-300.text-hint, .orange-300 .text-hint, .orange-300.text-disabled, .orange-300 .text-disabled { color: rgba(#771D1D, 0.38) !important; } .orange-300.divider, .orange-300 .divider { color: rgba(#771D1D, 0.12) !important; } .text-orange-300.text-secondary, .text-orange-300 .text-secondary { color: rgba(#FDBA8C, 0.7) !important; } .text-orange-300.text-hint, .text-orange-300 .text-hint, .text-orange-300.text-disabled, .text-orange-300 .text-disabled { color: rgba(#FDBA8C, 0.38) !important; } .text-orange-300.divider, .text-orange-300 .divider { color: rgba(#FDBA8C, 0.12) !important; } .orange-400 { background-color: #FF8A4C !important; color: #771D1D !important; } .orange-400.mat-icon, .orange-400 .mat-icon { color: #771D1D !important; } .orange-400.text-secondary, .orange-400 .text-secondary { color: rgba(#771D1D, 0.7) !important; } .orange-400.text-hint, .orange-400 .text-hint, .orange-400.text-disabled, .orange-400 .text-disabled { color: rgba(#771D1D, 0.38) !important; } .orange-400.divider, .orange-400 .divider { color: rgba(#771D1D, 0.12) !important; } .text-orange-400.text-secondary, .text-orange-400 .text-secondary { color: rgba(#FF8A4C, 0.7) !important; } .text-orange-400.text-hint, .text-orange-400 .text-hint, .text-orange-400.text-disabled, .text-orange-400 .text-disabled { color: rgba(#FF8A4C, 0.38) !important; } .text-orange-400.divider, .text-orange-400 .divider { color: rgba(#FF8A4C, 0.12) !important; } .orange-500 { background-color: #FF5A1F !important; color: #771D1D !important; } .orange-500.mat-icon, .orange-500 .mat-icon { color: #771D1D !important; } .orange-500.text-secondary, .orange-500 .text-secondary { color: rgba(#771D1D, 0.7) !important; } .orange-500.text-hint, .orange-500 .text-hint, .orange-500.text-disabled, .orange-500 .text-disabled { color: rgba(#771D1D, 0.38) !important; } .orange-500.divider, .orange-500 .divider { color: rgba(#771D1D, 0.12) !important; } .text-orange-500.text-secondary, .text-orange-500 .text-secondary { color: rgba(#FF5A1F, 0.7) !important; } .text-orange-500.text-hint, .text-orange-500 .text-hint, .text-orange-500.text-disabled, .text-orange-500 .text-disabled { color: rgba(#FF5A1F, 0.38) !important; } .text-orange-500.divider, .text-orange-500 .divider { color: rgba(#FF5A1F, 0.12) !important; } .orange-600 { background-color: #D03801 !important; color: #FFF8F1 !important; } .orange-600.mat-icon, .orange-600 .mat-icon { color: #FFF8F1 !important; } .orange-600.text-secondary, .orange-600 .text-secondary { color: rgba(#FFF8F1, 0.7) !important; } .orange-600.text-hint, .orange-600 .text-hint, .orange-600.text-disabled, .orange-600 .text-disabled { color: rgba(#FFF8F1, 0.38) !important; } .orange-600.divider, .orange-600 .divider { color: rgba(#FFF8F1, 0.12) !important; } .text-orange-600.text-secondary, .text-orange-600 .text-secondary { color: rgba(#D03801, 0.7) !important; } .text-orange-600.text-hint, .text-orange-600 .text-hint, .text-orange-600.text-disabled, .text-orange-600 .text-disabled { color: rgba(#D03801, 0.38) !important; } .text-orange-600.divider, .text-orange-600 .divider { color: rgba(#D03801, 0.12) !important; } .orange-700 { background-color: #B43403 !important; color: #FFF8F1 !important; } .orange-700.mat-icon, .orange-700 .mat-icon { color: #FFF8F1 !important; } .orange-700.text-secondary, .orange-700 .text-secondary { color: rgba(#FFF8F1, 0.7) !important; } .orange-700.text-hint, .orange-700 .text-hint, .orange-700.text-disabled, .orange-700 .text-disabled { color: rgba(#FFF8F1, 0.38) !important; } .orange-700.divider, .orange-700 .divider { color: rgba(#FFF8F1, 0.12) !important; } .text-orange-700.text-secondary, .text-orange-700 .text-secondary { color: rgba(#B43403, 0.7) !important; } .text-orange-700.text-hint, .text-orange-700 .text-hint, .text-orange-700.text-disabled, .text-orange-700 .text-disabled { color: rgba(#B43403, 0.38) !important; } .text-orange-700.divider, .text-orange-700 .divider { color: rgba(#B43403, 0.12) !important; } .orange-800 { background-color: #8A2C0D !important; color: #FFF8F1 !important; } .orange-800.mat-icon, .orange-800 .mat-icon { color: #FFF8F1 !important; } .orange-800.text-secondary, .orange-800 .text-secondary { color: rgba(#FFF8F1, 0.7) !important; } .orange-800.text-hint, .orange-800 .text-hint, .orange-800.text-disabled, .orange-800 .text-disabled { color: rgba(#FFF8F1, 0.38) !important; } .orange-800.divider, .orange-800 .divider { color: rgba(#FFF8F1, 0.12) !important; } .text-orange-800.text-secondary, .text-orange-800 .text-secondary { color: rgba(#8A2C0D, 0.7) !important; } .text-orange-800.text-hint, .text-orange-800 .text-hint, .text-orange-800.text-disabled, .text-orange-800 .text-disabled { color: rgba(#8A2C0D, 0.38) !important; } .text-orange-800.divider, .text-orange-800 .divider { color: rgba(#8A2C0D, 0.12) !important; } .orange-900 { background-color: #771D1D !important; color: #FFF8F1 !important; } .orange-900.mat-icon, .orange-900 .mat-icon { color: #FFF8F1 !important; } .orange-900.text-secondary, .orange-900 .text-secondary { color: rgba(#FFF8F1, 0.7) !important; } .orange-900.text-hint, .orange-900 .text-hint, .orange-900.text-disabled, .orange-900 .text-disabled { color: rgba(#FFF8F1, 0.38) !important; } .orange-900.divider, .orange-900 .divider { color: rgba(#FFF8F1, 0.12) !important; } .text-orange-900.text-secondary, .text-orange-900 .text-secondary { color: rgba(#771D1D, 0.7) !important; } .text-orange-900.text-hint, .text-orange-900 .text-hint, .text-orange-900.text-disabled, .text-orange-900 .text-disabled { color: rgba(#771D1D, 0.38) !important; } .text-orange-900.divider, .text-orange-900 .divider { color: rgba(#771D1D, 0.12) !important; } .orange { background-color: #FF5A1F !important; color: #771D1D !important; } .orange.mat-icon, .orange .mat-icon { color: #771D1D !important; } .orange.text-secondary, .orange .text-secondary { color: rgba(#771D1D, 0.7) !important; } .orange.text-hint, .orange .text-hint, .orange.text-disabled, .orange .text-disabled { color: rgba(#771D1D, 0.38) !important; } .orange.divider, .orange .divider { color: rgba(#771D1D, 0.12) !important; } .text-orange.text-secondary, .text-orange .text-secondary { color: rgba(#FF5A1F, 0.7) !important; } .text-orange.text-hint, .text-orange .text-hint, .text-orange.text-disabled, .text-orange .text-disabled { color: rgba(#FF5A1F, 0.38) !important; } .text-orange.divider, .text-orange .divider { color: rgba(#FF5A1F, 0.12) !important; } .yellow-50 { background-color: #FDFDEA !important; color: #633112 !important; } .yellow-50.mat-icon, .yellow-50 .mat-icon { color: #633112 !important; } .yellow-50.text-secondary, .yellow-50 .text-secondary { color: rgba(#633112, 0.7) !important; } .yellow-50.text-hint, .yellow-50 .text-hint, .yellow-50.text-disabled, .yellow-50 .text-disabled { color: rgba(#633112, 0.38) !important; } .yellow-50.divider, .yellow-50 .divider { color: rgba(#633112, 0.12) !important; } .text-yellow-50.text-secondary, .text-yellow-50 .text-secondary { color: rgba(#FDFDEA, 0.7) !important; } .text-yellow-50.text-hint, .text-yellow-50 .text-hint, .text-yellow-50.text-disabled, .text-yellow-50 .text-disabled { color: rgba(#FDFDEA, 0.38) !important; } .text-yellow-50.divider, .text-yellow-50 .divider { color: rgba(#FDFDEA, 0.12) !important; } .yellow-100 { background-color: #FDF6B2 !important; color: #633112 !important; } .yellow-100.mat-icon, .yellow-100 .mat-icon { color: #633112 !important; } .yellow-100.text-secondary, .yellow-100 .text-secondary { color: rgba(#633112, 0.7) !important; } .yellow-100.text-hint, .yellow-100 .text-hint, .yellow-100.text-disabled, .yellow-100 .text-disabled { color: rgba(#633112, 0.38) !important; } .yellow-100.divider, .yellow-100 .divider { color: rgba(#633112, 0.12) !important; } .text-yellow-100.text-secondary, .text-yellow-100 .text-secondary { color: rgba(#FDF6B2, 0.7) !important; } .text-yellow-100.text-hint, .text-yellow-100 .text-hint, .text-yellow-100.text-disabled, .text-yellow-100 .text-disabled { color: rgba(#FDF6B2, 0.38) !important; } .text-yellow-100.divider, .text-yellow-100 .divider { color: rgba(#FDF6B2, 0.12) !important; } .yellow-200 { background-color: #FCE96A !important; color: #633112 !important; } .yellow-200.mat-icon, .yellow-200 .mat-icon { color: #633112 !important; } .yellow-200.text-secondary, .yellow-200 .text-secondary { color: rgba(#633112, 0.7) !important; } .yellow-200.text-hint, .yellow-200 .text-hint, .yellow-200.text-disabled, .yellow-200 .text-disabled { color: rgba(#633112, 0.38) !important; } .yellow-200.divider, .yellow-200 .divider { color: rgba(#633112, 0.12) !important; } .text-yellow-200.text-secondary, .text-yellow-200 .text-secondary { color: rgba(#FCE96A, 0.7) !important; } .text-yellow-200.text-hint, .text-yellow-200 .text-hint, .text-yellow-200.text-disabled, .text-yellow-200 .text-disabled { color: rgba(#FCE96A, 0.38) !important; } .text-yellow-200.divider, .text-yellow-200 .divider { color: rgba(#FCE96A, 0.12) !important; } .yellow-300 { background-color: #FACA15 !important; color: #633112 !important; } .yellow-300.mat-icon, .yellow-300 .mat-icon { color: #633112 !important; } .yellow-300.text-secondary, .yellow-300 .text-secondary { color: rgba(#633112, 0.7) !important; } .yellow-300.text-hint, .yellow-300 .text-hint, .yellow-300.text-disabled, .yellow-300 .text-disabled { color: rgba(#633112, 0.38) !important; } .yellow-300.divider, .yellow-300 .divider { color: rgba(#633112, 0.12) !important; } .text-yellow-300.text-secondary, .text-yellow-300 .text-secondary { color: rgba(#FACA15, 0.7) !important; } .text-yellow-300.text-hint, .text-yellow-300 .text-hint, .text-yellow-300.text-disabled, .text-yellow-300 .text-disabled { color: rgba(#FACA15, 0.38) !important; } .text-yellow-300.divider, .text-yellow-300 .divider { color: rgba(#FACA15, 0.12) !important; } .yellow-400 { background-color: #E3A008 !important; color: #633112 !important; } .yellow-400.mat-icon, .yellow-400 .mat-icon { color: #633112 !important; } .yellow-400.text-secondary, .yellow-400 .text-secondary { color: rgba(#633112, 0.7) !important; } .yellow-400.text-hint, .yellow-400 .text-hint, .yellow-400.text-disabled, .yellow-400 .text-disabled { color: rgba(#633112, 0.38) !important; } .yellow-400.divider, .yellow-400 .divider { color: rgba(#633112, 0.12) !important; } .text-yellow-400.text-secondary, .text-yellow-400 .text-secondary { color: rgba(#E3A008, 0.7) !important; } .text-yellow-400.text-hint, .text-yellow-400 .text-hint, .text-yellow-400.text-disabled, .text-yellow-400 .text-disabled { color: rgba(#E3A008, 0.38) !important; } .text-yellow-400.divider, .text-yellow-400 .divider { color: rgba(#E3A008, 0.12) !important; } .yellow-500 { background-color: #C27803 !important; color: #633112 !important; } .yellow-500.mat-icon, .yellow-500 .mat-icon { color: #633112 !important; } .yellow-500.text-secondary, .yellow-500 .text-secondary { color: rgba(#633112, 0.7) !important; } .yellow-500.text-hint, .yellow-500 .text-hint, .yellow-500.text-disabled, .yellow-500 .text-disabled { color: rgba(#633112, 0.38) !important; } .yellow-500.divider, .yellow-500 .divider { color: rgba(#633112, 0.12) !important; } .text-yellow-500.text-secondary, .text-yellow-500 .text-secondary { color: rgba(#C27803, 0.7) !important; } .text-yellow-500.text-hint, .text-yellow-500 .text-hint, .text-yellow-500.text-disabled, .text-yellow-500 .text-disabled { color: rgba(#C27803, 0.38) !important; } .text-yellow-500.divider, .text-yellow-500 .divider { color: rgba(#C27803, 0.12) !important; } .yellow-600 { background-color: #9F580A !important; color: #FDFDEA !important; } .yellow-600.mat-icon, .yellow-600 .mat-icon { color: #FDFDEA !important; } .yellow-600.text-secondary, .yellow-600 .text-secondary { color: rgba(#FDFDEA, 0.7) !important; } .yellow-600.text-hint, .yellow-600 .text-hint, .yellow-600.text-disabled, .yellow-600 .text-disabled { color: rgba(#FDFDEA, 0.38) !important; } .yellow-600.divider, .yellow-600 .divider { color: rgba(#FDFDEA, 0.12) !important; } .text-yellow-600.text-secondary, .text-yellow-600 .text-secondary { color: rgba(#9F580A, 0.7) !important; } .text-yellow-600.text-hint, .text-yellow-600 .text-hint, .text-yellow-600.text-disabled, .text-yellow-600 .text-disabled { color: rgba(#9F580A, 0.38) !important; } .text-yellow-600.divider, .text-yellow-600 .divider { color: rgba(#9F580A, 0.12) !important; } .yellow-700 { background-color: #8E4B10 !important; color: #FDFDEA !important; } .yellow-700.mat-icon, .yellow-700 .mat-icon { color: #FDFDEA !important; } .yellow-700.text-secondary, .yellow-700 .text-secondary { color: rgba(#FDFDEA, 0.7) !important; } .yellow-700.text-hint, .yellow-700 .text-hint, .yellow-700.text-disabled, .yellow-700 .text-disabled { color: rgba(#FDFDEA, 0.38) !important; } .yellow-700.divider, .yellow-700 .divider { color: rgba(#FDFDEA, 0.12) !important; } .text-yellow-700.text-secondary, .text-yellow-700 .text-secondary { color: rgba(#8E4B10, 0.7) !important; } .text-yellow-700.text-hint, .text-yellow-700 .text-hint, .text-yellow-700.text-disabled, .text-yellow-700 .text-disabled { color: rgba(#8E4B10, 0.38) !important; } .text-yellow-700.divider, .text-yellow-700 .divider { color: rgba(#8E4B10, 0.12) !important; } .yellow-800 { background-color: #723B13 !important; color: #FDFDEA !important; } .yellow-800.mat-icon, .yellow-800 .mat-icon { color: #FDFDEA !important; } .yellow-800.text-secondary, .yellow-800 .text-secondary { color: rgba(#FDFDEA, 0.7) !important; } .yellow-800.text-hint, .yellow-800 .text-hint, .yellow-800.text-disabled, .yellow-800 .text-disabled { color: rgba(#FDFDEA, 0.38) !important; } .yellow-800.divider, .yellow-800 .divider { color: rgba(#FDFDEA, 0.12) !important; } .text-yellow-800.text-secondary, .text-yellow-800 .text-secondary { color: rgba(#723B13, 0.7) !important; } .text-yellow-800.text-hint, .text-yellow-800 .text-hint, .text-yellow-800.text-disabled, .text-yellow-800 .text-disabled { color: rgba(#723B13, 0.38) !important; } .text-yellow-800.divider, .text-yellow-800 .divider { color: rgba(#723B13, 0.12) !important; } .yellow-900 { background-color: #633112 !important; color: #FDFDEA !important; } .yellow-900.mat-icon, .yellow-900 .mat-icon { color: #FDFDEA !important; } .yellow-900.text-secondary, .yellow-900 .text-secondary { color: rgba(#FDFDEA, 0.7) !important; } .yellow-900.text-hint, .yellow-900 .text-hint, .yellow-900.text-disabled, .yellow-900 .text-disabled { color: rgba(#FDFDEA, 0.38) !important; } .yellow-900.divider, .yellow-900 .divider { color: rgba(#FDFDEA, 0.12) !important; } .text-yellow-900.text-secondary, .text-yellow-900 .text-secondary { color: rgba(#633112, 0.7) !important; } .text-yellow-900.text-hint, .text-yellow-900 .text-hint, .text-yellow-900.text-disabled, .text-yellow-900 .text-disabled { color: rgba(#633112, 0.38) !important; } .text-yellow-900.divider, .text-yellow-900 .divider { color: rgba(#633112, 0.12) !important; } .yellow { background-color: #C27803 !important; color: #633112 !important; } .yellow.mat-icon, .yellow .mat-icon { color: #633112 !important; } .yellow.text-secondary, .yellow .text-secondary { color: rgba(#633112, 0.7) !important; } .yellow.text-hint, .yellow .text-hint, .yellow.text-disabled, .yellow .text-disabled { color: rgba(#633112, 0.38) !important; } .yellow.divider, .yellow .divider { color: rgba(#633112, 0.12) !important; } .text-yellow.text-secondary, .text-yellow .text-secondary { color: rgba(#C27803, 0.7) !important; } .text-yellow.text-hint, .text-yellow .text-hint, .text-yellow.text-disabled, .text-yellow .text-disabled { color: rgba(#C27803, 0.38) !important; } .text-yellow.divider, .text-yellow .divider { color: rgba(#C27803, 0.12) !important; } .green-50 { background-color: #F3FAF7 !important; color: #014737 !important; } .green-50.mat-icon, .green-50 .mat-icon { color: #014737 !important; } .green-50.text-secondary, .green-50 .text-secondary { color: rgba(#014737, 0.7) !important; } .green-50.text-hint, .green-50 .text-hint, .green-50.text-disabled, .green-50 .text-disabled { color: rgba(#014737, 0.38) !important; } .green-50.divider, .green-50 .divider { color: rgba(#014737, 0.12) !important; } .text-green-50.text-secondary, .text-green-50 .text-secondary { color: rgba(#F3FAF7, 0.7) !important; } .text-green-50.text-hint, .text-green-50 .text-hint, .text-green-50.text-disabled, .text-green-50 .text-disabled { color: rgba(#F3FAF7, 0.38) !important; } .text-green-50.divider, .text-green-50 .divider { color: rgba(#F3FAF7, 0.12) !important; } .green-100 { background-color: #DEF7EC !important; color: #014737 !important; } .green-100.mat-icon, .green-100 .mat-icon { color: #014737 !important; } .green-100.text-secondary, .green-100 .text-secondary { color: rgba(#014737, 0.7) !important; } .green-100.text-hint, .green-100 .text-hint, .green-100.text-disabled, .green-100 .text-disabled { color: rgba(#014737, 0.38) !important; } .green-100.divider, .green-100 .divider { color: rgba(#014737, 0.12) !important; } .text-green-100.text-secondary, .text-green-100 .text-secondary { color: rgba(#DEF7EC, 0.7) !important; } .text-green-100.text-hint, .text-green-100 .text-hint, .text-green-100.text-disabled, .text-green-100 .text-disabled { color: rgba(#DEF7EC, 0.38) !important; } .text-green-100.divider, .text-green-100 .divider { color: rgba(#DEF7EC, 0.12) !important; } .green-200 { background-color: #BCF0DA !important; color: #014737 !important; } .green-200.mat-icon, .green-200 .mat-icon { color: #014737 !important; } .green-200.text-secondary, .green-200 .text-secondary { color: rgba(#014737, 0.7) !important; } .green-200.text-hint, .green-200 .text-hint, .green-200.text-disabled, .green-200 .text-disabled { color: rgba(#014737, 0.38) !important; } .green-200.divider, .green-200 .divider { color: rgba(#014737, 0.12) !important; } .text-green-200.text-secondary, .text-green-200 .text-secondary { color: rgba(#BCF0DA, 0.7) !important; } .text-green-200.text-hint, .text-green-200 .text-hint, .text-green-200.text-disabled, .text-green-200 .text-disabled { color: rgba(#BCF0DA, 0.38) !important; } .text-green-200.divider, .text-green-200 .divider { color: rgba(#BCF0DA, 0.12) !important; } .green-300 { background-color: #84E1BC !important; color: #014737 !important; } .green-300.mat-icon, .green-300 .mat-icon { color: #014737 !important; } .green-300.text-secondary, .green-300 .text-secondary { color: rgba(#014737, 0.7) !important; } .green-300.text-hint, .green-300 .text-hint, .green-300.text-disabled, .green-300 .text-disabled { color: rgba(#014737, 0.38) !important; } .green-300.divider, .green-300 .divider { color: rgba(#014737, 0.12) !important; } .text-green-300.text-secondary, .text-green-300 .text-secondary { color: rgba(#84E1BC, 0.7) !important; } .text-green-300.text-hint, .text-green-300 .text-hint, .text-green-300.text-disabled, .text-green-300 .text-disabled { color: rgba(#84E1BC, 0.38) !important; } .text-green-300.divider, .text-green-300 .divider { color: rgba(#84E1BC, 0.12) !important; } .green-400 { background-color: #31C48D !important; color: #014737 !important; } .green-400.mat-icon, .green-400 .mat-icon { color: #014737 !important; } .green-400.text-secondary, .green-400 .text-secondary { color: rgba(#014737, 0.7) !important; } .green-400.text-hint, .green-400 .text-hint, .green-400.text-disabled, .green-400 .text-disabled { color: rgba(#014737, 0.38) !important; } .green-400.divider, .green-400 .divider { color: rgba(#014737, 0.12) !important; } .text-green-400.text-secondary, .text-green-400 .text-secondary { color: rgba(#31C48D, 0.7) !important; } .text-green-400.text-hint, .text-green-400 .text-hint, .text-green-400.text-disabled, .text-green-400 .text-disabled { color: rgba(#31C48D, 0.38) !important; } .text-green-400.divider, .text-green-400 .divider { color: rgba(#31C48D, 0.12) !important; } .green-500 { background-color: #0E9F6E !important; color: #F3FAF7 !important; } .green-500.mat-icon, .green-500 .mat-icon { color: #F3FAF7 !important; } .green-500.text-secondary, .green-500 .text-secondary { color: rgba(#F3FAF7, 0.7) !important; } .green-500.text-hint, .green-500 .text-hint, .green-500.text-disabled, .green-500 .text-disabled { color: rgba(#F3FAF7, 0.38) !important; } .green-500.divider, .green-500 .divider { color: rgba(#F3FAF7, 0.12) !important; } .text-green-500.text-secondary, .text-green-500 .text-secondary { color: rgba(#0E9F6E, 0.7) !important; } .text-green-500.text-hint, .text-green-500 .text-hint, .text-green-500.text-disabled, .text-green-500 .text-disabled { color: rgba(#0E9F6E, 0.38) !important; } .text-green-500.divider, .text-green-500 .divider { color: rgba(#0E9F6E, 0.12) !important; } .green-600 { background-color: #057A55 !important; color: #F3FAF7 !important; } .green-600.mat-icon, .green-600 .mat-icon { color: #F3FAF7 !important; } .green-600.text-secondary, .green-600 .text-secondary { color: rgba(#F3FAF7, 0.7) !important; } .green-600.text-hint, .green-600 .text-hint, .green-600.text-disabled, .green-600 .text-disabled { color: rgba(#F3FAF7, 0.38) !important; } .green-600.divider, .green-600 .divider { color: rgba(#F3FAF7, 0.12) !important; } .text-green-600.text-secondary, .text-green-600 .text-secondary { color: rgba(#057A55, 0.7) !important; } .text-green-600.text-hint, .text-green-600 .text-hint, .text-green-600.text-disabled, .text-green-600 .text-disabled { color: rgba(#057A55, 0.38) !important; } .text-green-600.divider, .text-green-600 .divider { color: rgba(#057A55, 0.12) !important; } .green-700 { background-color: #046C4E !important; color: #F3FAF7 !important; } .green-700.mat-icon, .green-700 .mat-icon { color: #F3FAF7 !important; } .green-700.text-secondary, .green-700 .text-secondary { color: rgba(#F3FAF7, 0.7) !important; } .green-700.text-hint, .green-700 .text-hint, .green-700.text-disabled, .green-700 .text-disabled { color: rgba(#F3FAF7, 0.38) !important; } .green-700.divider, .green-700 .divider { color: rgba(#F3FAF7, 0.12) !important; } .text-green-700.text-secondary, .text-green-700 .text-secondary { color: rgba(#046C4E, 0.7) !important; } .text-green-700.text-hint, .text-green-700 .text-hint, .text-green-700.text-disabled, .text-green-700 .text-disabled { color: rgba(#046C4E, 0.38) !important; } .text-green-700.divider, .text-green-700 .divider { color: rgba(#046C4E, 0.12) !important; } .green-800 { background-color: #03543F !important; color: #F3FAF7 !important; } .green-800.mat-icon, .green-800 .mat-icon { color: #F3FAF7 !important; } .green-800.text-secondary, .green-800 .text-secondary { color: rgba(#F3FAF7, 0.7) !important; } .green-800.text-hint, .green-800 .text-hint, .green-800.text-disabled, .green-800 .text-disabled { color: rgba(#F3FAF7, 0.38) !important; } .green-800.divider, .green-800 .divider { color: rgba(#F3FAF7, 0.12) !important; } .text-green-800.text-secondary, .text-green-800 .text-secondary { color: rgba(#03543F, 0.7) !important; } .text-green-800.text-hint, .text-green-800 .text-hint, .text-green-800.text-disabled, .text-green-800 .text-disabled { color: rgba(#03543F, 0.38) !important; } .text-green-800.divider, .text-green-800 .divider { color: rgba(#03543F, 0.12) !important; } .green-900 { background-color: #014737 !important; color: #F3FAF7 !important; } .green-900.mat-icon, .green-900 .mat-icon { color: #F3FAF7 !important; } .green-900.text-secondary, .green-900 .text-secondary { color: rgba(#F3FAF7, 0.7) !important; } .green-900.text-hint, .green-900 .text-hint, .green-900.text-disabled, .green-900 .text-disabled { color: rgba(#F3FAF7, 0.38) !important; } .green-900.divider, .green-900 .divider { color: rgba(#F3FAF7, 0.12) !important; } .text-green-900.text-secondary, .text-green-900 .text-secondary { color: rgba(#014737, 0.7) !important; } .text-green-900.text-hint, .text-green-900 .text-hint, .text-green-900.text-disabled, .text-green-900 .text-disabled { color: rgba(#014737, 0.38) !important; } .text-green-900.divider, .text-green-900 .divider { color: rgba(#014737, 0.12) !important; } .green { background-color: #0E9F6E !important; color: #F3FAF7 !important; } .green.mat-icon, .green .mat-icon { color: #F3FAF7 !important; } .green.text-secondary, .green .text-secondary { color: rgba(#F3FAF7, 0.7) !important; } .green.text-hint, .green .text-hint, .green.text-disabled, .green .text-disabled { color: rgba(#F3FAF7, 0.38) !important; } .green.divider, .green .divider { color: rgba(#F3FAF7, 0.12) !important; } .text-green.text-secondary, .text-green .text-secondary { color: rgba(#0E9F6E, 0.7) !important; } .text-green.text-hint, .text-green .text-hint, .text-green.text-disabled, .text-green .text-disabled { color: rgba(#0E9F6E, 0.38) !important; } .text-green.divider, .text-green .divider { color: rgba(#0E9F6E, 0.12) !important; } .teal-50 { background-color: #EDFAFA !important; color: #014451 !important; } .teal-50.mat-icon, .teal-50 .mat-icon { color: #014451 !important; } .teal-50.text-secondary, .teal-50 .text-secondary { color: rgba(#014451, 0.7) !important; } .teal-50.text-hint, .teal-50 .text-hint, .teal-50.text-disabled, .teal-50 .text-disabled { color: rgba(#014451, 0.38) !important; } .teal-50.divider, .teal-50 .divider { color: rgba(#014451, 0.12) !important; } .text-teal-50.text-secondary, .text-teal-50 .text-secondary { color: rgba(#EDFAFA, 0.7) !important; } .text-teal-50.text-hint, .text-teal-50 .text-hint, .text-teal-50.text-disabled, .text-teal-50 .text-disabled { color: rgba(#EDFAFA, 0.38) !important; } .text-teal-50.divider, .text-teal-50 .divider { color: rgba(#EDFAFA, 0.12) !important; } .teal-100 { background-color: #D5F5F6 !important; color: #014451 !important; } .teal-100.mat-icon, .teal-100 .mat-icon { color: #014451 !important; } .teal-100.text-secondary, .teal-100 .text-secondary { color: rgba(#014451, 0.7) !important; } .teal-100.text-hint, .teal-100 .text-hint, .teal-100.text-disabled, .teal-100 .text-disabled { color: rgba(#014451, 0.38) !important; } .teal-100.divider, .teal-100 .divider { color: rgba(#014451, 0.12) !important; } .text-teal-100.text-secondary, .text-teal-100 .text-secondary { color: rgba(#D5F5F6, 0.7) !important; } .text-teal-100.text-hint, .text-teal-100 .text-hint, .text-teal-100.text-disabled, .text-teal-100 .text-disabled { color: rgba(#D5F5F6, 0.38) !important; } .text-teal-100.divider, .text-teal-100 .divider { color: rgba(#D5F5F6, 0.12) !important; } .teal-200 { background-color: #AFECEF !important; color: #014451 !important; } .teal-200.mat-icon, .teal-200 .mat-icon { color: #014451 !important; } .teal-200.text-secondary, .teal-200 .text-secondary { color: rgba(#014451, 0.7) !important; } .teal-200.text-hint, .teal-200 .text-hint, .teal-200.text-disabled, .teal-200 .text-disabled { color: rgba(#014451, 0.38) !important; } .teal-200.divider, .teal-200 .divider { color: rgba(#014451, 0.12) !important; } .text-teal-200.text-secondary, .text-teal-200 .text-secondary { color: rgba(#AFECEF, 0.7) !important; } .text-teal-200.text-hint, .text-teal-200 .text-hint, .text-teal-200.text-disabled, .text-teal-200 .text-disabled { color: rgba(#AFECEF, 0.38) !important; } .text-teal-200.divider, .text-teal-200 .divider { color: rgba(#AFECEF, 0.12) !important; } .teal-300 { background-color: #7EDCE2 !important; color: #014451 !important; } .teal-300.mat-icon, .teal-300 .mat-icon { color: #014451 !important; } .teal-300.text-secondary, .teal-300 .text-secondary { color: rgba(#014451, 0.7) !important; } .teal-300.text-hint, .teal-300 .text-hint, .teal-300.text-disabled, .teal-300 .text-disabled { color: rgba(#014451, 0.38) !important; } .teal-300.divider, .teal-300 .divider { color: rgba(#014451, 0.12) !important; } .text-teal-300.text-secondary, .text-teal-300 .text-secondary { color: rgba(#7EDCE2, 0.7) !important; } .text-teal-300.text-hint, .text-teal-300 .text-hint, .text-teal-300.text-disabled, .text-teal-300 .text-disabled { color: rgba(#7EDCE2, 0.38) !important; } .text-teal-300.divider, .text-teal-300 .divider { color: rgba(#7EDCE2, 0.12) !important; } .teal-400 { background-color: #16BDCA !important; color: #014451 !important; } .teal-400.mat-icon, .teal-400 .mat-icon { color: #014451 !important; } .teal-400.text-secondary, .teal-400 .text-secondary { color: rgba(#014451, 0.7) !important; } .teal-400.text-hint, .teal-400 .text-hint, .teal-400.text-disabled, .teal-400 .text-disabled { color: rgba(#014451, 0.38) !important; } .teal-400.divider, .teal-400 .divider { color: rgba(#014451, 0.12) !important; } .text-teal-400.text-secondary, .text-teal-400 .text-secondary { color: rgba(#16BDCA, 0.7) !important; } .text-teal-400.text-hint, .text-teal-400 .text-hint, .text-teal-400.text-disabled, .text-teal-400 .text-disabled { color: rgba(#16BDCA, 0.38) !important; } .text-teal-400.divider, .text-teal-400 .divider { color: rgba(#16BDCA, 0.12) !important; } .teal-500 { background-color: #0694A2 !important; color: #EDFAFA !important; } .teal-500.mat-icon, .teal-500 .mat-icon { color: #EDFAFA !important; } .teal-500.text-secondary, .teal-500 .text-secondary { color: rgba(#EDFAFA, 0.7) !important; } .teal-500.text-hint, .teal-500 .text-hint, .teal-500.text-disabled, .teal-500 .text-disabled { color: rgba(#EDFAFA, 0.38) !important; } .teal-500.divider, .teal-500 .divider { color: rgba(#EDFAFA, 0.12) !important; } .text-teal-500.text-secondary, .text-teal-500 .text-secondary { color: rgba(#0694A2, 0.7) !important; } .text-teal-500.text-hint, .text-teal-500 .text-hint, .text-teal-500.text-disabled, .text-teal-500 .text-disabled { color: rgba(#0694A2, 0.38) !important; } .text-teal-500.divider, .text-teal-500 .divider { color: rgba(#0694A2, 0.12) !important; } .teal-600 { background-color: #047481 !important; color: #EDFAFA !important; } .teal-600.mat-icon, .teal-600 .mat-icon { color: #EDFAFA !important; } .teal-600.text-secondary, .teal-600 .text-secondary { color: rgba(#EDFAFA, 0.7) !important; } .teal-600.text-hint, .teal-600 .text-hint, .teal-600.text-disabled, .teal-600 .text-disabled { color: rgba(#EDFAFA, 0.38) !important; } .teal-600.divider, .teal-600 .divider { color: rgba(#EDFAFA, 0.12) !important; } .text-teal-600.text-secondary, .text-teal-600 .text-secondary { color: rgba(#047481, 0.7) !important; } .text-teal-600.text-hint, .text-teal-600 .text-hint, .text-teal-600.text-disabled, .text-teal-600 .text-disabled { color: rgba(#047481, 0.38) !important; } .text-teal-600.divider, .text-teal-600 .divider { color: rgba(#047481, 0.12) !important; } .teal-700 { background-color: #036672 !important; color: #EDFAFA !important; } .teal-700.mat-icon, .teal-700 .mat-icon { color: #EDFAFA !important; } .teal-700.text-secondary, .teal-700 .text-secondary { color: rgba(#EDFAFA, 0.7) !important; } .teal-700.text-hint, .teal-700 .text-hint, .teal-700.text-disabled, .teal-700 .text-disabled { color: rgba(#EDFAFA, 0.38) !important; } .teal-700.divider, .teal-700 .divider { color: rgba(#EDFAFA, 0.12) !important; } .text-teal-700.text-secondary, .text-teal-700 .text-secondary { color: rgba(#036672, 0.7) !important; } .text-teal-700.text-hint, .text-teal-700 .text-hint, .text-teal-700.text-disabled, .text-teal-700 .text-disabled { color: rgba(#036672, 0.38) !important; } .text-teal-700.divider, .text-teal-700 .divider { color: rgba(#036672, 0.12) !important; } .teal-800 { background-color: #05505C !important; color: #EDFAFA !important; } .teal-800.mat-icon, .teal-800 .mat-icon { color: #EDFAFA !important; } .teal-800.text-secondary, .teal-800 .text-secondary { color: rgba(#EDFAFA, 0.7) !important; } .teal-800.text-hint, .teal-800 .text-hint, .teal-800.text-disabled, .teal-800 .text-disabled { color: rgba(#EDFAFA, 0.38) !important; } .teal-800.divider, .teal-800 .divider { color: rgba(#EDFAFA, 0.12) !important; } .text-teal-800.text-secondary, .text-teal-800 .text-secondary { color: rgba(#05505C, 0.7) !important; } .text-teal-800.text-hint, .text-teal-800 .text-hint, .text-teal-800.text-disabled, .text-teal-800 .text-disabled { color: rgba(#05505C, 0.38) !important; } .text-teal-800.divider, .text-teal-800 .divider { color: rgba(#05505C, 0.12) !important; } .teal-900 { background-color: #014451 !important; color: #EDFAFA !important; } .teal-900.mat-icon, .teal-900 .mat-icon { color: #EDFAFA !important; } .teal-900.text-secondary, .teal-900 .text-secondary { color: rgba(#EDFAFA, 0.7) !important; } .teal-900.text-hint, .teal-900 .text-hint, .teal-900.text-disabled, .teal-900 .text-disabled { color: rgba(#EDFAFA, 0.38) !important; } .teal-900.divider, .teal-900 .divider { color: rgba(#EDFAFA, 0.12) !important; } .text-teal-900.text-secondary, .text-teal-900 .text-secondary { color: rgba(#014451, 0.7) !important; } .text-teal-900.text-hint, .text-teal-900 .text-hint, .text-teal-900.text-disabled, .text-teal-900 .text-disabled { color: rgba(#014451, 0.38) !important; } .text-teal-900.divider, .text-teal-900 .divider { color: rgba(#014451, 0.12) !important; } .teal { background-color: #0694A2 !important; color: #EDFAFA !important; } .teal.mat-icon, .teal .mat-icon { color: #EDFAFA !important; } .teal.text-secondary, .teal .text-secondary { color: rgba(#EDFAFA, 0.7) !important; } .teal.text-hint, .teal .text-hint, .teal.text-disabled, .teal .text-disabled { color: rgba(#EDFAFA, 0.38) !important; } .teal.divider, .teal .divider { color: rgba(#EDFAFA, 0.12) !important; } .text-teal.text-secondary, .text-teal .text-secondary { color: rgba(#0694A2, 0.7) !important; } .text-teal.text-hint, .text-teal .text-hint, .text-teal.text-disabled, .text-teal .text-disabled { color: rgba(#0694A2, 0.38) !important; } .text-teal.divider, .text-teal .divider { color: rgba(#0694A2, 0.12) !important; } .blue-50 { background-color: #EBF5FF !important; color: #233876 !important; } .blue-50.mat-icon, .blue-50 .mat-icon { color: #233876 !important; } .blue-50.text-secondary, .blue-50 .text-secondary { color: rgba(#233876, 0.7) !important; } .blue-50.text-hint, .blue-50 .text-hint, .blue-50.text-disabled, .blue-50 .text-disabled { color: rgba(#233876, 0.38) !important; } .blue-50.divider, .blue-50 .divider { color: rgba(#233876, 0.12) !important; } .text-blue-50.text-secondary, .text-blue-50 .text-secondary { color: rgba(#EBF5FF, 0.7) !important; } .text-blue-50.text-hint, .text-blue-50 .text-hint, .text-blue-50.text-disabled, .text-blue-50 .text-disabled { color: rgba(#EBF5FF, 0.38) !important; } .text-blue-50.divider, .text-blue-50 .divider { color: rgba(#EBF5FF, 0.12) !important; } .blue-100 { background-color: #E1EFFE !important; color: #233876 !important; } .blue-100.mat-icon, .blue-100 .mat-icon { color: #233876 !important; } .blue-100.text-secondary, .blue-100 .text-secondary { color: rgba(#233876, 0.7) !important; } .blue-100.text-hint, .blue-100 .text-hint, .blue-100.text-disabled, .blue-100 .text-disabled { color: rgba(#233876, 0.38) !important; } .blue-100.divider, .blue-100 .divider { color: rgba(#233876, 0.12) !important; } .text-blue-100.text-secondary, .text-blue-100 .text-secondary { color: rgba(#E1EFFE, 0.7) !important; } .text-blue-100.text-hint, .text-blue-100 .text-hint, .text-blue-100.text-disabled, .text-blue-100 .text-disabled { color: rgba(#E1EFFE, 0.38) !important; } .text-blue-100.divider, .text-blue-100 .divider { color: rgba(#E1EFFE, 0.12) !important; } .blue-200 { background-color: #C3DDFD !important; color: #233876 !important; } .blue-200.mat-icon, .blue-200 .mat-icon { color: #233876 !important; } .blue-200.text-secondary, .blue-200 .text-secondary { color: rgba(#233876, 0.7) !important; } .blue-200.text-hint, .blue-200 .text-hint, .blue-200.text-disabled, .blue-200 .text-disabled { color: rgba(#233876, 0.38) !important; } .blue-200.divider, .blue-200 .divider { color: rgba(#233876, 0.12) !important; } .text-blue-200.text-secondary, .text-blue-200 .text-secondary { color: rgba(#C3DDFD, 0.7) !important; } .text-blue-200.text-hint, .text-blue-200 .text-hint, .text-blue-200.text-disabled, .text-blue-200 .text-disabled { color: rgba(#C3DDFD, 0.38) !important; } .text-blue-200.divider, .text-blue-200 .divider { color: rgba(#C3DDFD, 0.12) !important; } .blue-300 { background-color: #A4CAFE !important; color: #233876 !important; } .blue-300.mat-icon, .blue-300 .mat-icon { color: #233876 !important; } .blue-300.text-secondary, .blue-300 .text-secondary { color: rgba(#233876, 0.7) !important; } .blue-300.text-hint, .blue-300 .text-hint, .blue-300.text-disabled, .blue-300 .text-disabled { color: rgba(#233876, 0.38) !important; } .blue-300.divider, .blue-300 .divider { color: rgba(#233876, 0.12) !important; } .text-blue-300.text-secondary, .text-blue-300 .text-secondary { color: rgba(#A4CAFE, 0.7) !important; } .text-blue-300.text-hint, .text-blue-300 .text-hint, .text-blue-300.text-disabled, .text-blue-300 .text-disabled { color: rgba(#A4CAFE, 0.38) !important; } .text-blue-300.divider, .text-blue-300 .divider { color: rgba(#A4CAFE, 0.12) !important; } .blue-400 { background-color: #76A9FA !important; color: #233876 !important; } .blue-400.mat-icon, .blue-400 .mat-icon { color: #233876 !important; } .blue-400.text-secondary, .blue-400 .text-secondary { color: rgba(#233876, 0.7) !important; } .blue-400.text-hint, .blue-400 .text-hint, .blue-400.text-disabled, .blue-400 .text-disabled { color: rgba(#233876, 0.38) !important; } .blue-400.divider, .blue-400 .divider { color: rgba(#233876, 0.12) !important; } .text-blue-400.text-secondary, .text-blue-400 .text-secondary { color: rgba(#76A9FA, 0.7) !important; } .text-blue-400.text-hint, .text-blue-400 .text-hint, .text-blue-400.text-disabled, .text-blue-400 .text-disabled { color: rgba(#76A9FA, 0.38) !important; } .text-blue-400.divider, .text-blue-400 .divider { color: rgba(#76A9FA, 0.12) !important; } .blue-500 { background-color: #3F83F8 !important; color: #EBF5FF !important; } .blue-500.mat-icon, .blue-500 .mat-icon { color: #EBF5FF !important; } .blue-500.text-secondary, .blue-500 .text-secondary { color: rgba(#EBF5FF, 0.7) !important; } .blue-500.text-hint, .blue-500 .text-hint, .blue-500.text-disabled, .blue-500 .text-disabled { color: rgba(#EBF5FF, 0.38) !important; } .blue-500.divider, .blue-500 .divider { color: rgba(#EBF5FF, 0.12) !important; } .text-blue-500.text-secondary, .text-blue-500 .text-secondary { color: rgba(#3F83F8, 0.7) !important; } .text-blue-500.text-hint, .text-blue-500 .text-hint, .text-blue-500.text-disabled, .text-blue-500 .text-disabled { color: rgba(#3F83F8, 0.38) !important; } .text-blue-500.divider, .text-blue-500 .divider { color: rgba(#3F83F8, 0.12) !important; } .blue-600 { background-color: #1C64F2 !important; color: #EBF5FF !important; } .blue-600.mat-icon, .blue-600 .mat-icon { color: #EBF5FF !important; } .blue-600.text-secondary, .blue-600 .text-secondary { color: rgba(#EBF5FF, 0.7) !important; } .blue-600.text-hint, .blue-600 .text-hint, .blue-600.text-disabled, .blue-600 .text-disabled { color: rgba(#EBF5FF, 0.38) !important; } .blue-600.divider, .blue-600 .divider { color: rgba(#EBF5FF, 0.12) !important; } .text-blue-600.text-secondary, .text-blue-600 .text-secondary { color: rgba(#1C64F2, 0.7) !important; } .text-blue-600.text-hint, .text-blue-600 .text-hint, .text-blue-600.text-disabled, .text-blue-600 .text-disabled { color: rgba(#1C64F2, 0.38) !important; } .text-blue-600.divider, .text-blue-600 .divider { color: rgba(#1C64F2, 0.12) !important; } .blue-700 { background-color: #1A56DB !important; color: #EBF5FF !important; } .blue-700.mat-icon, .blue-700 .mat-icon { color: #EBF5FF !important; } .blue-700.text-secondary, .blue-700 .text-secondary { color: rgba(#EBF5FF, 0.7) !important; } .blue-700.text-hint, .blue-700 .text-hint, .blue-700.text-disabled, .blue-700 .text-disabled { color: rgba(#EBF5FF, 0.38) !important; } .blue-700.divider, .blue-700 .divider { color: rgba(#EBF5FF, 0.12) !important; } .text-blue-700.text-secondary, .text-blue-700 .text-secondary { color: rgba(#1A56DB, 0.7) !important; } .text-blue-700.text-hint, .text-blue-700 .text-hint, .text-blue-700.text-disabled, .text-blue-700 .text-disabled { color: rgba(#1A56DB, 0.38) !important; } .text-blue-700.divider, .text-blue-700 .divider { color: rgba(#1A56DB, 0.12) !important; } .blue-800 { background-color: #1E429F !important; color: #EBF5FF !important; } .blue-800.mat-icon, .blue-800 .mat-icon { color: #EBF5FF !important; } .blue-800.text-secondary, .blue-800 .text-secondary { color: rgba(#EBF5FF, 0.7) !important; } .blue-800.text-hint, .blue-800 .text-hint, .blue-800.text-disabled, .blue-800 .text-disabled { color: rgba(#EBF5FF, 0.38) !important; } .blue-800.divider, .blue-800 .divider { color: rgba(#EBF5FF, 0.12) !important; } .text-blue-800.text-secondary, .text-blue-800 .text-secondary { color: rgba(#1E429F, 0.7) !important; } .text-blue-800.text-hint, .text-blue-800 .text-hint, .text-blue-800.text-disabled, .text-blue-800 .text-disabled { color: rgba(#1E429F, 0.38) !important; } .text-blue-800.divider, .text-blue-800 .divider { color: rgba(#1E429F, 0.12) !important; } .blue-900 { background-color: #233876 !important; color: #EBF5FF !important; } .blue-900.mat-icon, .blue-900 .mat-icon { color: #EBF5FF !important; } .blue-900.text-secondary, .blue-900 .text-secondary { color: rgba(#EBF5FF, 0.7) !important; } .blue-900.text-hint, .blue-900 .text-hint, .blue-900.text-disabled, .blue-900 .text-disabled { color: rgba(#EBF5FF, 0.38) !important; } .blue-900.divider, .blue-900 .divider { color: rgba(#EBF5FF, 0.12) !important; } .text-blue-900.text-secondary, .text-blue-900 .text-secondary { color: rgba(#233876, 0.7) !important; } .text-blue-900.text-hint, .text-blue-900 .text-hint, .text-blue-900.text-disabled, .text-blue-900 .text-disabled { color: rgba(#233876, 0.38) !important; } .text-blue-900.divider, .text-blue-900 .divider { color: rgba(#233876, 0.12) !important; } .blue { background-color: #3F83F8 !important; color: #EBF5FF !important; } .blue.mat-icon, .blue .mat-icon { color: #EBF5FF !important; } .blue.text-secondary, .blue .text-secondary { color: rgba(#EBF5FF, 0.7) !important; } .blue.text-hint, .blue .text-hint, .blue.text-disabled, .blue .text-disabled { color: rgba(#EBF5FF, 0.38) !important; } .blue.divider, .blue .divider { color: rgba(#EBF5FF, 0.12) !important; } .text-blue.text-secondary, .text-blue .text-secondary { color: rgba(#3F83F8, 0.7) !important; } .text-blue.text-hint, .text-blue .text-hint, .text-blue.text-disabled, .text-blue .text-disabled { color: rgba(#3F83F8, 0.38) !important; } .text-blue.divider, .text-blue .divider { color: rgba(#3F83F8, 0.12) !important; } .indigo-50 { background-color: #F0F5FF !important; color: #362F78 !important; } .indigo-50.mat-icon, .indigo-50 .mat-icon { color: #362F78 !important; } .indigo-50.text-secondary, .indigo-50 .text-secondary { color: rgba(#362F78, 0.7) !important; } .indigo-50.text-hint, .indigo-50 .text-hint, .indigo-50.text-disabled, .indigo-50 .text-disabled { color: rgba(#362F78, 0.38) !important; } .indigo-50.divider, .indigo-50 .divider { color: rgba(#362F78, 0.12) !important; } .text-indigo-50.text-secondary, .text-indigo-50 .text-secondary { color: rgba(#F0F5FF, 0.7) !important; } .text-indigo-50.text-hint, .text-indigo-50 .text-hint, .text-indigo-50.text-disabled, .text-indigo-50 .text-disabled { color: rgba(#F0F5FF, 0.38) !important; } .text-indigo-50.divider, .text-indigo-50 .divider { color: rgba(#F0F5FF, 0.12) !important; } .indigo-100 { background-color: #E5EDFF !important; color: #362F78 !important; } .indigo-100.mat-icon, .indigo-100 .mat-icon { color: #362F78 !important; } .indigo-100.text-secondary, .indigo-100 .text-secondary { color: rgba(#362F78, 0.7) !important; } .indigo-100.text-hint, .indigo-100 .text-hint, .indigo-100.text-disabled, .indigo-100 .text-disabled { color: rgba(#362F78, 0.38) !important; } .indigo-100.divider, .indigo-100 .divider { color: rgba(#362F78, 0.12) !important; } .text-indigo-100.text-secondary, .text-indigo-100 .text-secondary { color: rgba(#E5EDFF, 0.7) !important; } .text-indigo-100.text-hint, .text-indigo-100 .text-hint, .text-indigo-100.text-disabled, .text-indigo-100 .text-disabled { color: rgba(#E5EDFF, 0.38) !important; } .text-indigo-100.divider, .text-indigo-100 .divider { color: rgba(#E5EDFF, 0.12) !important; } .indigo-200 { background-color: #CDDBFE !important; color: #362F78 !important; } .indigo-200.mat-icon, .indigo-200 .mat-icon { color: #362F78 !important; } .indigo-200.text-secondary, .indigo-200 .text-secondary { color: rgba(#362F78, 0.7) !important; } .indigo-200.text-hint, .indigo-200 .text-hint, .indigo-200.text-disabled, .indigo-200 .text-disabled { color: rgba(#362F78, 0.38) !important; } .indigo-200.divider, .indigo-200 .divider { color: rgba(#362F78, 0.12) !important; } .text-indigo-200.text-secondary, .text-indigo-200 .text-secondary { color: rgba(#CDDBFE, 0.7) !important; } .text-indigo-200.text-hint, .text-indigo-200 .text-hint, .text-indigo-200.text-disabled, .text-indigo-200 .text-disabled { color: rgba(#CDDBFE, 0.38) !important; } .text-indigo-200.divider, .text-indigo-200 .divider { color: rgba(#CDDBFE, 0.12) !important; } .indigo-300 { background-color: #B4C6FC !important; color: #362F78 !important; } .indigo-300.mat-icon, .indigo-300 .mat-icon { color: #362F78 !important; } .indigo-300.text-secondary, .indigo-300 .text-secondary { color: rgba(#362F78, 0.7) !important; } .indigo-300.text-hint, .indigo-300 .text-hint, .indigo-300.text-disabled, .indigo-300 .text-disabled { color: rgba(#362F78, 0.38) !important; } .indigo-300.divider, .indigo-300 .divider { color: rgba(#362F78, 0.12) !important; } .text-indigo-300.text-secondary, .text-indigo-300 .text-secondary { color: rgba(#B4C6FC, 0.7) !important; } .text-indigo-300.text-hint, .text-indigo-300 .text-hint, .text-indigo-300.text-disabled, .text-indigo-300 .text-disabled { color: rgba(#B4C6FC, 0.38) !important; } .text-indigo-300.divider, .text-indigo-300 .divider { color: rgba(#B4C6FC, 0.12) !important; } .indigo-400 { background-color: #8DA2FB !important; color: #362F78 !important; } .indigo-400.mat-icon, .indigo-400 .mat-icon { color: #362F78 !important; } .indigo-400.text-secondary, .indigo-400 .text-secondary { color: rgba(#362F78, 0.7) !important; } .indigo-400.text-hint, .indigo-400 .text-hint, .indigo-400.text-disabled, .indigo-400 .text-disabled { color: rgba(#362F78, 0.38) !important; } .indigo-400.divider, .indigo-400 .divider { color: rgba(#362F78, 0.12) !important; } .text-indigo-400.text-secondary, .text-indigo-400 .text-secondary { color: rgba(#8DA2FB, 0.7) !important; } .text-indigo-400.text-hint, .text-indigo-400 .text-hint, .text-indigo-400.text-disabled, .text-indigo-400 .text-disabled { color: rgba(#8DA2FB, 0.38) !important; } .text-indigo-400.divider, .text-indigo-400 .divider { color: rgba(#8DA2FB, 0.12) !important; } .indigo-500 { background-color: #6875F5 !important; color: #F0F5FF !important; } .indigo-500.mat-icon, .indigo-500 .mat-icon { color: #F0F5FF !important; } .indigo-500.text-secondary, .indigo-500 .text-secondary { color: rgba(#F0F5FF, 0.7) !important; } .indigo-500.text-hint, .indigo-500 .text-hint, .indigo-500.text-disabled, .indigo-500 .text-disabled { color: rgba(#F0F5FF, 0.38) !important; } .indigo-500.divider, .indigo-500 .divider { color: rgba(#F0F5FF, 0.12) !important; } .text-indigo-500.text-secondary, .text-indigo-500 .text-secondary { color: rgba(#6875F5, 0.7) !important; } .text-indigo-500.text-hint, .text-indigo-500 .text-hint, .text-indigo-500.text-disabled, .text-indigo-500 .text-disabled { color: rgba(#6875F5, 0.38) !important; } .text-indigo-500.divider, .text-indigo-500 .divider { color: rgba(#6875F5, 0.12) !important; } .indigo-600 { background-color: #5850EC !important; color: #F0F5FF !important; } .indigo-600.mat-icon, .indigo-600 .mat-icon { color: #F0F5FF !important; } .indigo-600.text-secondary, .indigo-600 .text-secondary { color: rgba(#F0F5FF, 0.7) !important; } .indigo-600.text-hint, .indigo-600 .text-hint, .indigo-600.text-disabled, .indigo-600 .text-disabled { color: rgba(#F0F5FF, 0.38) !important; } .indigo-600.divider, .indigo-600 .divider { color: rgba(#F0F5FF, 0.12) !important; } .text-indigo-600.text-secondary, .text-indigo-600 .text-secondary { color: rgba(#5850EC, 0.7) !important; } .text-indigo-600.text-hint, .text-indigo-600 .text-hint, .text-indigo-600.text-disabled, .text-indigo-600 .text-disabled { color: rgba(#5850EC, 0.38) !important; } .text-indigo-600.divider, .text-indigo-600 .divider { color: rgba(#5850EC, 0.12) !important; } .indigo-700 { background-color: #5145CD !important; color: #F0F5FF !important; } .indigo-700.mat-icon, .indigo-700 .mat-icon { color: #F0F5FF !important; } .indigo-700.text-secondary, .indigo-700 .text-secondary { color: rgba(#F0F5FF, 0.7) !important; } .indigo-700.text-hint, .indigo-700 .text-hint, .indigo-700.text-disabled, .indigo-700 .text-disabled { color: rgba(#F0F5FF, 0.38) !important; } .indigo-700.divider, .indigo-700 .divider { color: rgba(#F0F5FF, 0.12) !important; } .text-indigo-700.text-secondary, .text-indigo-700 .text-secondary { color: rgba(#5145CD, 0.7) !important; } .text-indigo-700.text-hint, .text-indigo-700 .text-hint, .text-indigo-700.text-disabled, .text-indigo-700 .text-disabled { color: rgba(#5145CD, 0.38) !important; } .text-indigo-700.divider, .text-indigo-700 .divider { color: rgba(#5145CD, 0.12) !important; } .indigo-800 { background-color: #42389D !important; color: #F0F5FF !important; } .indigo-800.mat-icon, .indigo-800 .mat-icon { color: #F0F5FF !important; } .indigo-800.text-secondary, .indigo-800 .text-secondary { color: rgba(#F0F5FF, 0.7) !important; } .indigo-800.text-hint, .indigo-800 .text-hint, .indigo-800.text-disabled, .indigo-800 .text-disabled { color: rgba(#F0F5FF, 0.38) !important; } .indigo-800.divider, .indigo-800 .divider { color: rgba(#F0F5FF, 0.12) !important; } .text-indigo-800.text-secondary, .text-indigo-800 .text-secondary { color: rgba(#42389D, 0.7) !important; } .text-indigo-800.text-hint, .text-indigo-800 .text-hint, .text-indigo-800.text-disabled, .text-indigo-800 .text-disabled { color: rgba(#42389D, 0.38) !important; } .text-indigo-800.divider, .text-indigo-800 .divider { color: rgba(#42389D, 0.12) !important; } .indigo-900 { background-color: #362F78 !important; color: #F0F5FF !important; } .indigo-900.mat-icon, .indigo-900 .mat-icon { color: #F0F5FF !important; } .indigo-900.text-secondary, .indigo-900 .text-secondary { color: rgba(#F0F5FF, 0.7) !important; } .indigo-900.text-hint, .indigo-900 .text-hint, .indigo-900.text-disabled, .indigo-900 .text-disabled { color: rgba(#F0F5FF, 0.38) !important; } .indigo-900.divider, .indigo-900 .divider { color: rgba(#F0F5FF, 0.12) !important; } .text-indigo-900.text-secondary, .text-indigo-900 .text-secondary { color: rgba(#362F78, 0.7) !important; } .text-indigo-900.text-hint, .text-indigo-900 .text-hint, .text-indigo-900.text-disabled, .text-indigo-900 .text-disabled { color: rgba(#362F78, 0.38) !important; } .text-indigo-900.divider, .text-indigo-900 .divider { color: rgba(#362F78, 0.12) !important; } .indigo { background-color: #6875F5 !important; color: #F0F5FF !important; } .indigo.mat-icon, .indigo .mat-icon { color: #F0F5FF !important; } .indigo.text-secondary, .indigo .text-secondary { color: rgba(#F0F5FF, 0.7) !important; } .indigo.text-hint, .indigo .text-hint, .indigo.text-disabled, .indigo .text-disabled { color: rgba(#F0F5FF, 0.38) !important; } .indigo.divider, .indigo .divider { color: rgba(#F0F5FF, 0.12) !important; } .text-indigo.text-secondary, .text-indigo .text-secondary { color: rgba(#6875F5, 0.7) !important; } .text-indigo.text-hint, .text-indigo .text-hint, .text-indigo.text-disabled, .text-indigo .text-disabled { color: rgba(#6875F5, 0.38) !important; } .text-indigo.divider, .text-indigo .divider { color: rgba(#6875F5, 0.12) !important; } .purple-50 { background-color: #F6F5FF !important; color: #4A1D96 !important; } .purple-50.mat-icon, .purple-50 .mat-icon { color: #4A1D96 !important; } .purple-50.text-secondary, .purple-50 .text-secondary { color: rgba(#4A1D96, 0.7) !important; } .purple-50.text-hint, .purple-50 .text-hint, .purple-50.text-disabled, .purple-50 .text-disabled { color: rgba(#4A1D96, 0.38) !important; } .purple-50.divider, .purple-50 .divider { color: rgba(#4A1D96, 0.12) !important; } .text-purple-50.text-secondary, .text-purple-50 .text-secondary { color: rgba(#F6F5FF, 0.7) !important; } .text-purple-50.text-hint, .text-purple-50 .text-hint, .text-purple-50.text-disabled, .text-purple-50 .text-disabled { color: rgba(#F6F5FF, 0.38) !important; } .text-purple-50.divider, .text-purple-50 .divider { color: rgba(#F6F5FF, 0.12) !important; } .purple-100 { background-color: #EDEBFE !important; color: #4A1D96 !important; } .purple-100.mat-icon, .purple-100 .mat-icon { color: #4A1D96 !important; } .purple-100.text-secondary, .purple-100 .text-secondary { color: rgba(#4A1D96, 0.7) !important; } .purple-100.text-hint, .purple-100 .text-hint, .purple-100.text-disabled, .purple-100 .text-disabled { color: rgba(#4A1D96, 0.38) !important; } .purple-100.divider, .purple-100 .divider { color: rgba(#4A1D96, 0.12) !important; } .text-purple-100.text-secondary, .text-purple-100 .text-secondary { color: rgba(#EDEBFE, 0.7) !important; } .text-purple-100.text-hint, .text-purple-100 .text-hint, .text-purple-100.text-disabled, .text-purple-100 .text-disabled { color: rgba(#EDEBFE, 0.38) !important; } .text-purple-100.divider, .text-purple-100 .divider { color: rgba(#EDEBFE, 0.12) !important; } .purple-200 { background-color: #DCD7FE !important; color: #4A1D96 !important; } .purple-200.mat-icon, .purple-200 .mat-icon { color: #4A1D96 !important; } .purple-200.text-secondary, .purple-200 .text-secondary { color: rgba(#4A1D96, 0.7) !important; } .purple-200.text-hint, .purple-200 .text-hint, .purple-200.text-disabled, .purple-200 .text-disabled { color: rgba(#4A1D96, 0.38) !important; } .purple-200.divider, .purple-200 .divider { color: rgba(#4A1D96, 0.12) !important; } .text-purple-200.text-secondary, .text-purple-200 .text-secondary { color: rgba(#DCD7FE, 0.7) !important; } .text-purple-200.text-hint, .text-purple-200 .text-hint, .text-purple-200.text-disabled, .text-purple-200 .text-disabled { color: rgba(#DCD7FE, 0.38) !important; } .text-purple-200.divider, .text-purple-200 .divider { color: rgba(#DCD7FE, 0.12) !important; } .purple-300 { background-color: #CABFFD !important; color: #4A1D96 !important; } .purple-300.mat-icon, .purple-300 .mat-icon { color: #4A1D96 !important; } .purple-300.text-secondary, .purple-300 .text-secondary { color: rgba(#4A1D96, 0.7) !important; } .purple-300.text-hint, .purple-300 .text-hint, .purple-300.text-disabled, .purple-300 .text-disabled { color: rgba(#4A1D96, 0.38) !important; } .purple-300.divider, .purple-300 .divider { color: rgba(#4A1D96, 0.12) !important; } .text-purple-300.text-secondary, .text-purple-300 .text-secondary { color: rgba(#CABFFD, 0.7) !important; } .text-purple-300.text-hint, .text-purple-300 .text-hint, .text-purple-300.text-disabled, .text-purple-300 .text-disabled { color: rgba(#CABFFD, 0.38) !important; } .text-purple-300.divider, .text-purple-300 .divider { color: rgba(#CABFFD, 0.12) !important; } .purple-400 { background-color: #AC94FA !important; color: #4A1D96 !important; } .purple-400.mat-icon, .purple-400 .mat-icon { color: #4A1D96 !important; } .purple-400.text-secondary, .purple-400 .text-secondary { color: rgba(#4A1D96, 0.7) !important; } .purple-400.text-hint, .purple-400 .text-hint, .purple-400.text-disabled, .purple-400 .text-disabled { color: rgba(#4A1D96, 0.38) !important; } .purple-400.divider, .purple-400 .divider { color: rgba(#4A1D96, 0.12) !important; } .text-purple-400.text-secondary, .text-purple-400 .text-secondary { color: rgba(#AC94FA, 0.7) !important; } .text-purple-400.text-hint, .text-purple-400 .text-hint, .text-purple-400.text-disabled, .text-purple-400 .text-disabled { color: rgba(#AC94FA, 0.38) !important; } .text-purple-400.divider, .text-purple-400 .divider { color: rgba(#AC94FA, 0.12) !important; } .purple-500 { background-color: #9061F9 !important; color: #F6F5FF !important; } .purple-500.mat-icon, .purple-500 .mat-icon { color: #F6F5FF !important; } .purple-500.text-secondary, .purple-500 .text-secondary { color: rgba(#F6F5FF, 0.7) !important; } .purple-500.text-hint, .purple-500 .text-hint, .purple-500.text-disabled, .purple-500 .text-disabled { color: rgba(#F6F5FF, 0.38) !important; } .purple-500.divider, .purple-500 .divider { color: rgba(#F6F5FF, 0.12) !important; } .text-purple-500.text-secondary, .text-purple-500 .text-secondary { color: rgba(#9061F9, 0.7) !important; } .text-purple-500.text-hint, .text-purple-500 .text-hint, .text-purple-500.text-disabled, .text-purple-500 .text-disabled { color: rgba(#9061F9, 0.38) !important; } .text-purple-500.divider, .text-purple-500 .divider { color: rgba(#9061F9, 0.12) !important; } .purple-600 { background-color: #7E3AF2 !important; color: #F6F5FF !important; } .purple-600.mat-icon, .purple-600 .mat-icon { color: #F6F5FF !important; } .purple-600.text-secondary, .purple-600 .text-secondary { color: rgba(#F6F5FF, 0.7) !important; } .purple-600.text-hint, .purple-600 .text-hint, .purple-600.text-disabled, .purple-600 .text-disabled { color: rgba(#F6F5FF, 0.38) !important; } .purple-600.divider, .purple-600 .divider { color: rgba(#F6F5FF, 0.12) !important; } .text-purple-600.text-secondary, .text-purple-600 .text-secondary { color: rgba(#7E3AF2, 0.7) !important; } .text-purple-600.text-hint, .text-purple-600 .text-hint, .text-purple-600.text-disabled, .text-purple-600 .text-disabled { color: rgba(#7E3AF2, 0.38) !important; } .text-purple-600.divider, .text-purple-600 .divider { color: rgba(#7E3AF2, 0.12) !important; } .purple-700 { background-color: #6C2BD9 !important; color: #F6F5FF !important; } .purple-700.mat-icon, .purple-700 .mat-icon { color: #F6F5FF !important; } .purple-700.text-secondary, .purple-700 .text-secondary { color: rgba(#F6F5FF, 0.7) !important; } .purple-700.text-hint, .purple-700 .text-hint, .purple-700.text-disabled, .purple-700 .text-disabled { color: rgba(#F6F5FF, 0.38) !important; } .purple-700.divider, .purple-700 .divider { color: rgba(#F6F5FF, 0.12) !important; } .text-purple-700.text-secondary, .text-purple-700 .text-secondary { color: rgba(#6C2BD9, 0.7) !important; } .text-purple-700.text-hint, .text-purple-700 .text-hint, .text-purple-700.text-disabled, .text-purple-700 .text-disabled { color: rgba(#6C2BD9, 0.38) !important; } .text-purple-700.divider, .text-purple-700 .divider { color: rgba(#6C2BD9, 0.12) !important; } .purple-800 { background-color: #5521B5 !important; color: #F6F5FF !important; } .purple-800.mat-icon, .purple-800 .mat-icon { color: #F6F5FF !important; } .purple-800.text-secondary, .purple-800 .text-secondary { color: rgba(#F6F5FF, 0.7) !important; } .purple-800.text-hint, .purple-800 .text-hint, .purple-800.text-disabled, .purple-800 .text-disabled { color: rgba(#F6F5FF, 0.38) !important; } .purple-800.divider, .purple-800 .divider { color: rgba(#F6F5FF, 0.12) !important; } .text-purple-800.text-secondary, .text-purple-800 .text-secondary { color: rgba(#5521B5, 0.7) !important; } .text-purple-800.text-hint, .text-purple-800 .text-hint, .text-purple-800.text-disabled, .text-purple-800 .text-disabled { color: rgba(#5521B5, 0.38) !important; } .text-purple-800.divider, .text-purple-800 .divider { color: rgba(#5521B5, 0.12) !important; } .purple-900 { background-color: #4A1D96 !important; color: #F6F5FF !important; } .purple-900.mat-icon, .purple-900 .mat-icon { color: #F6F5FF !important; } .purple-900.text-secondary, .purple-900 .text-secondary { color: rgba(#F6F5FF, 0.7) !important; } .purple-900.text-hint, .purple-900 .text-hint, .purple-900.text-disabled, .purple-900 .text-disabled { color: rgba(#F6F5FF, 0.38) !important; } .purple-900.divider, .purple-900 .divider { color: rgba(#F6F5FF, 0.12) !important; } .text-purple-900.text-secondary, .text-purple-900 .text-secondary { color: rgba(#4A1D96, 0.7) !important; } .text-purple-900.text-hint, .text-purple-900 .text-hint, .text-purple-900.text-disabled, .text-purple-900 .text-disabled { color: rgba(#4A1D96, 0.38) !important; } .text-purple-900.divider, .text-purple-900 .divider { color: rgba(#4A1D96, 0.12) !important; } .purple { background-color: #9061F9 !important; color: #F6F5FF !important; } .purple.mat-icon, .purple .mat-icon { color: #F6F5FF !important; } .purple.text-secondary, .purple .text-secondary { color: rgba(#F6F5FF, 0.7) !important; } .purple.text-hint, .purple .text-hint, .purple.text-disabled, .purple .text-disabled { color: rgba(#F6F5FF, 0.38) !important; } .purple.divider, .purple .divider { color: rgba(#F6F5FF, 0.12) !important; } .text-purple.text-secondary, .text-purple .text-secondary { color: rgba(#9061F9, 0.7) !important; } .text-purple.text-hint, .text-purple .text-hint, .text-purple.text-disabled, .text-purple .text-disabled { color: rgba(#9061F9, 0.38) !important; } .text-purple.divider, .text-purple .divider { color: rgba(#9061F9, 0.12) !important; } .pink-50 { background-color: #FDF2F8 !important; color: #751A3D !important; } .pink-50.mat-icon, .pink-50 .mat-icon { color: #751A3D !important; } .pink-50.text-secondary, .pink-50 .text-secondary { color: rgba(#751A3D, 0.7) !important; } .pink-50.text-hint, .pink-50 .text-hint, .pink-50.text-disabled, .pink-50 .text-disabled { color: rgba(#751A3D, 0.38) !important; } .pink-50.divider, .pink-50 .divider { color: rgba(#751A3D, 0.12) !important; } .text-pink-50.text-secondary, .text-pink-50 .text-secondary { color: rgba(#FDF2F8, 0.7) !important; } .text-pink-50.text-hint, .text-pink-50 .text-hint, .text-pink-50.text-disabled, .text-pink-50 .text-disabled { color: rgba(#FDF2F8, 0.38) !important; } .text-pink-50.divider, .text-pink-50 .divider { color: rgba(#FDF2F8, 0.12) !important; } .pink-100 { background-color: #FCE8F3 !important; color: #751A3D !important; } .pink-100.mat-icon, .pink-100 .mat-icon { color: #751A3D !important; } .pink-100.text-secondary, .pink-100 .text-secondary { color: rgba(#751A3D, 0.7) !important; } .pink-100.text-hint, .pink-100 .text-hint, .pink-100.text-disabled, .pink-100 .text-disabled { color: rgba(#751A3D, 0.38) !important; } .pink-100.divider, .pink-100 .divider { color: rgba(#751A3D, 0.12) !important; } .text-pink-100.text-secondary, .text-pink-100 .text-secondary { color: rgba(#FCE8F3, 0.7) !important; } .text-pink-100.text-hint, .text-pink-100 .text-hint, .text-pink-100.text-disabled, .text-pink-100 .text-disabled { color: rgba(#FCE8F3, 0.38) !important; } .text-pink-100.divider, .text-pink-100 .divider { color: rgba(#FCE8F3, 0.12) !important; } .pink-200 { background-color: #FAD1E8 !important; color: #751A3D !important; } .pink-200.mat-icon, .pink-200 .mat-icon { color: #751A3D !important; } .pink-200.text-secondary, .pink-200 .text-secondary { color: rgba(#751A3D, 0.7) !important; } .pink-200.text-hint, .pink-200 .text-hint, .pink-200.text-disabled, .pink-200 .text-disabled { color: rgba(#751A3D, 0.38) !important; } .pink-200.divider, .pink-200 .divider { color: rgba(#751A3D, 0.12) !important; } .text-pink-200.text-secondary, .text-pink-200 .text-secondary { color: rgba(#FAD1E8, 0.7) !important; } .text-pink-200.text-hint, .text-pink-200 .text-hint, .text-pink-200.text-disabled, .text-pink-200 .text-disabled { color: rgba(#FAD1E8, 0.38) !important; } .text-pink-200.divider, .text-pink-200 .divider { color: rgba(#FAD1E8, 0.12) !important; } .pink-300 { background-color: #F8B4D9 !important; color: #751A3D !important; } .pink-300.mat-icon, .pink-300 .mat-icon { color: #751A3D !important; } .pink-300.text-secondary, .pink-300 .text-secondary { color: rgba(#751A3D, 0.7) !important; } .pink-300.text-hint, .pink-300 .text-hint, .pink-300.text-disabled, .pink-300 .text-disabled { color: rgba(#751A3D, 0.38) !important; } .pink-300.divider, .pink-300 .divider { color: rgba(#751A3D, 0.12) !important; } .text-pink-300.text-secondary, .text-pink-300 .text-secondary { color: rgba(#F8B4D9, 0.7) !important; } .text-pink-300.text-hint, .text-pink-300 .text-hint, .text-pink-300.text-disabled, .text-pink-300 .text-disabled { color: rgba(#F8B4D9, 0.38) !important; } .text-pink-300.divider, .text-pink-300 .divider { color: rgba(#F8B4D9, 0.12) !important; } .pink-400 { background-color: #F17EB8 !important; color: #751A3D !important; } .pink-400.mat-icon, .pink-400 .mat-icon { color: #751A3D !important; } .pink-400.text-secondary, .pink-400 .text-secondary { color: rgba(#751A3D, 0.7) !important; } .pink-400.text-hint, .pink-400 .text-hint, .pink-400.text-disabled, .pink-400 .text-disabled { color: rgba(#751A3D, 0.38) !important; } .pink-400.divider, .pink-400 .divider { color: rgba(#751A3D, 0.12) !important; } .text-pink-400.text-secondary, .text-pink-400 .text-secondary { color: rgba(#F17EB8, 0.7) !important; } .text-pink-400.text-hint, .text-pink-400 .text-hint, .text-pink-400.text-disabled, .text-pink-400 .text-disabled { color: rgba(#F17EB8, 0.38) !important; } .text-pink-400.divider, .text-pink-400 .divider { color: rgba(#F17EB8, 0.12) !important; } .pink-500 { background-color: #E74694 !important; color: #FDF2F8 !important; } .pink-500.mat-icon, .pink-500 .mat-icon { color: #FDF2F8 !important; } .pink-500.text-secondary, .pink-500 .text-secondary { color: rgba(#FDF2F8, 0.7) !important; } .pink-500.text-hint, .pink-500 .text-hint, .pink-500.text-disabled, .pink-500 .text-disabled { color: rgba(#FDF2F8, 0.38) !important; } .pink-500.divider, .pink-500 .divider { color: rgba(#FDF2F8, 0.12) !important; } .text-pink-500.text-secondary, .text-pink-500 .text-secondary { color: rgba(#E74694, 0.7) !important; } .text-pink-500.text-hint, .text-pink-500 .text-hint, .text-pink-500.text-disabled, .text-pink-500 .text-disabled { color: rgba(#E74694, 0.38) !important; } .text-pink-500.divider, .text-pink-500 .divider { color: rgba(#E74694, 0.12) !important; } .pink-600 { background-color: #D61F69 !important; color: #FDF2F8 !important; } .pink-600.mat-icon, .pink-600 .mat-icon { color: #FDF2F8 !important; } .pink-600.text-secondary, .pink-600 .text-secondary { color: rgba(#FDF2F8, 0.7) !important; } .pink-600.text-hint, .pink-600 .text-hint, .pink-600.text-disabled, .pink-600 .text-disabled { color: rgba(#FDF2F8, 0.38) !important; } .pink-600.divider, .pink-600 .divider { color: rgba(#FDF2F8, 0.12) !important; } .text-pink-600.text-secondary, .text-pink-600 .text-secondary { color: rgba(#D61F69, 0.7) !important; } .text-pink-600.text-hint, .text-pink-600 .text-hint, .text-pink-600.text-disabled, .text-pink-600 .text-disabled { color: rgba(#D61F69, 0.38) !important; } .text-pink-600.divider, .text-pink-600 .divider { color: rgba(#D61F69, 0.12) !important; } .pink-700 { background-color: #BF125D !important; color: #FDF2F8 !important; } .pink-700.mat-icon, .pink-700 .mat-icon { color: #FDF2F8 !important; } .pink-700.text-secondary, .pink-700 .text-secondary { color: rgba(#FDF2F8, 0.7) !important; } .pink-700.text-hint, .pink-700 .text-hint, .pink-700.text-disabled, .pink-700 .text-disabled { color: rgba(#FDF2F8, 0.38) !important; } .pink-700.divider, .pink-700 .divider { color: rgba(#FDF2F8, 0.12) !important; } .text-pink-700.text-secondary, .text-pink-700 .text-secondary { color: rgba(#BF125D, 0.7) !important; } .text-pink-700.text-hint, .text-pink-700 .text-hint, .text-pink-700.text-disabled, .text-pink-700 .text-disabled { color: rgba(#BF125D, 0.38) !important; } .text-pink-700.divider, .text-pink-700 .divider { color: rgba(#BF125D, 0.12) !important; } .pink-800 { background-color: #99154B !important; color: #FDF2F8 !important; } .pink-800.mat-icon, .pink-800 .mat-icon { color: #FDF2F8 !important; } .pink-800.text-secondary, .pink-800 .text-secondary { color: rgba(#FDF2F8, 0.7) !important; } .pink-800.text-hint, .pink-800 .text-hint, .pink-800.text-disabled, .pink-800 .text-disabled { color: rgba(#FDF2F8, 0.38) !important; } .pink-800.divider, .pink-800 .divider { color: rgba(#FDF2F8, 0.12) !important; } .text-pink-800.text-secondary, .text-pink-800 .text-secondary { color: rgba(#99154B, 0.7) !important; } .text-pink-800.text-hint, .text-pink-800 .text-hint, .text-pink-800.text-disabled, .text-pink-800 .text-disabled { color: rgba(#99154B, 0.38) !important; } .text-pink-800.divider, .text-pink-800 .divider { color: rgba(#99154B, 0.12) !important; } .pink-900 { background-color: #751A3D !important; color: #FDF2F8 !important; } .pink-900.mat-icon, .pink-900 .mat-icon { color: #FDF2F8 !important; } .pink-900.text-secondary, .pink-900 .text-secondary { color: rgba(#FDF2F8, 0.7) !important; } .pink-900.text-hint, .pink-900 .text-hint, .pink-900.text-disabled, .pink-900 .text-disabled { color: rgba(#FDF2F8, 0.38) !important; } .pink-900.divider, .pink-900 .divider { color: rgba(#FDF2F8, 0.12) !important; } .text-pink-900.text-secondary, .text-pink-900 .text-secondary { color: rgba(#751A3D, 0.7) !important; } .text-pink-900.text-hint, .text-pink-900 .text-hint, .text-pink-900.text-disabled, .text-pink-900 .text-disabled { color: rgba(#751A3D, 0.38) !important; } .text-pink-900.divider, .text-pink-900 .divider { color: rgba(#751A3D, 0.12) !important; } .pink { background-color: #E74694 !important; color: #FDF2F8 !important; } .pink.mat-icon, .pink .mat-icon { color: #FDF2F8 !important; } .pink.text-secondary, .pink .text-secondary { color: rgba(#FDF2F8, 0.7) !important; } .pink.text-hint, .pink .text-hint, .pink.text-disabled, .pink .text-disabled { color: rgba(#FDF2F8, 0.38) !important; } .pink.divider, .pink .divider { color: rgba(#FDF2F8, 0.12) !important; } .text-pink.text-secondary, .text-pink .text-secondary { color: rgba(#E74694, 0.7) !important; } .text-pink.text-hint, .text-pink .text-hint, .text-pink.text-disabled, .text-pink .text-disabled { color: rgba(#E74694, 0.38) !important; } .text-pink.divider, .text-pink .divider { color: rgba(#E74694, 0.12) !important; } .icon-current .mat-icon { color: currentColor !important; } .icon-transparent .mat-icon { color: transparent !important; } .icon-white .mat-icon { color: #FFFFFF !important; } .icon-black .mat-icon { color: #000000 !important; } .icon-gray-50 .mat-icon { color: #F9FAFB !important; } .icon-gray-100 .mat-icon { color: #F4F5F7 !important; } .icon-gray-200 .mat-icon { color: #E5E7EB !important; } .icon-gray-300 .mat-icon { color: #D2D6DC !important; } .icon-gray-400 .mat-icon { color: #9FA6B2 !important; } .icon-gray-500 .mat-icon { color: #6B7280 !important; } .icon-gray-600 .mat-icon { color: #4B5563 !important; } .icon-gray-700 .mat-icon { color: #374151 !important; } .icon-gray-800 .mat-icon { color: #252F3F !important; } .icon-gray-900 .mat-icon { color: #161E2E !important; } .icon-gray .mat-icon { color: #6B7280 !important; } .icon-cool-gray-50 .mat-icon { color: #FBFDFE !important; } .icon-cool-gray-100 .mat-icon { color: #F1F5F9 !important; } .icon-cool-gray-200 .mat-icon { color: #E2E8F0 !important; } .icon-cool-gray-300 .mat-icon { color: #CFD8E3 !important; } .icon-cool-gray-400 .mat-icon { color: #97A6BA !important; } .icon-cool-gray-500 .mat-icon { color: #64748B !important; } .icon-cool-gray-600 .mat-icon { color: #475569 !important; } .icon-cool-gray-700 .mat-icon { color: #364152 !important; } .icon-cool-gray-800 .mat-icon { color: #27303F !important; } .icon-cool-gray-900 .mat-icon { color: #1A202E !important; } .icon-cool-gray .mat-icon { color: #64748B !important; } .icon-red-50 .mat-icon { color: #FDF2F2 !important; } .icon-red-100 .mat-icon { color: #FDE8E8 !important; } .icon-red-200 .mat-icon { color: #FBD5D5 !important; } .icon-red-300 .mat-icon { color: #F8B4B4 !important; } .icon-red-400 .mat-icon { color: #F98080 !important; } .icon-red-500 .mat-icon { color: #F05252 !important; } .icon-red-600 .mat-icon { color: #E02424 !important; } .icon-red-700 .mat-icon { color: #C81E1E !important; } .icon-red-800 .mat-icon { color: #9B1C1C !important; } .icon-red-900 .mat-icon { color: #771D1D !important; } .icon-red .mat-icon { color: #F05252 !important; } .icon-orange-50 .mat-icon { color: #FFF8F1 !important; } .icon-orange-100 .mat-icon { color: #FEECDC !important; } .icon-orange-200 .mat-icon { color: #FCD9BD !important; } .icon-orange-300 .mat-icon { color: #FDBA8C !important; } .icon-orange-400 .mat-icon { color: #FF8A4C !important; } .icon-orange-500 .mat-icon { color: #FF5A1F !important; } .icon-orange-600 .mat-icon { color: #D03801 !important; } .icon-orange-700 .mat-icon { color: #B43403 !important; } .icon-orange-800 .mat-icon { color: #8A2C0D !important; } .icon-orange-900 .mat-icon { color: #771D1D !important; } .icon-orange .mat-icon { color: #FF5A1F !important; } .icon-yellow-50 .mat-icon { color: #FDFDEA !important; } .icon-yellow-100 .mat-icon { color: #FDF6B2 !important; } .icon-yellow-200 .mat-icon { color: #FCE96A !important; } .icon-yellow-300 .mat-icon { color: #FACA15 !important; } .icon-yellow-400 .mat-icon { color: #E3A008 !important; } .icon-yellow-500 .mat-icon { color: #C27803 !important; } .icon-yellow-600 .mat-icon { color: #9F580A !important; } .icon-yellow-700 .mat-icon { color: #8E4B10 !important; } .icon-yellow-800 .mat-icon { color: #723B13 !important; } .icon-yellow-900 .mat-icon { color: #633112 !important; } .icon-yellow .mat-icon { color: #C27803 !important; } .icon-green-50 .mat-icon { color: #F3FAF7 !important; } .icon-green-100 .mat-icon { color: #DEF7EC !important; } .icon-green-200 .mat-icon { color: #BCF0DA !important; } .icon-green-300 .mat-icon { color: #84E1BC !important; } .icon-green-400 .mat-icon { color: #31C48D !important; } .icon-green-500 .mat-icon { color: #0E9F6E !important; } .icon-green-600 .mat-icon { color: #057A55 !important; } .icon-green-700 .mat-icon { color: #046C4E !important; } .icon-green-800 .mat-icon { color: #03543F !important; } .icon-green-900 .mat-icon { color: #014737 !important; } .icon-green .mat-icon { color: #0E9F6E !important; } .icon-teal-50 .mat-icon { color: #EDFAFA !important; } .icon-teal-100 .mat-icon { color: #D5F5F6 !important; } .icon-teal-200 .mat-icon { color: #AFECEF !important; } .icon-teal-300 .mat-icon { color: #7EDCE2 !important; } .icon-teal-400 .mat-icon { color: #16BDCA !important; } .icon-teal-500 .mat-icon { color: #0694A2 !important; } .icon-teal-600 .mat-icon { color: #047481 !important; } .icon-teal-700 .mat-icon { color: #036672 !important; } .icon-teal-800 .mat-icon { color: #05505C !important; } .icon-teal-900 .mat-icon { color: #014451 !important; } .icon-teal .mat-icon { color: #0694A2 !important; } .icon-blue-50 .mat-icon { color: #EBF5FF !important; } .icon-blue-100 .mat-icon { color: #E1EFFE !important; } .icon-blue-200 .mat-icon { color: #C3DDFD !important; } .icon-blue-300 .mat-icon { color: #A4CAFE !important; } .icon-blue-400 .mat-icon { color: #76A9FA !important; } .icon-blue-500 .mat-icon { color: #3F83F8 !important; } .icon-blue-600 .mat-icon { color: #1C64F2 !important; } .icon-blue-700 .mat-icon { color: #1A56DB !important; } .icon-blue-800 .mat-icon { color: #1E429F !important; } .icon-blue-900 .mat-icon { color: #233876 !important; } .icon-blue .mat-icon { color: #3F83F8 !important; } .icon-indigo-50 .mat-icon { color: #F0F5FF !important; } .icon-indigo-100 .mat-icon { color: #E5EDFF !important; } .icon-indigo-200 .mat-icon { color: #CDDBFE !important; } .icon-indigo-300 .mat-icon { color: #B4C6FC !important; } .icon-indigo-400 .mat-icon { color: #8DA2FB !important; } .icon-indigo-500 .mat-icon { color: #6875F5 !important; } .icon-indigo-600 .mat-icon { color: #5850EC !important; } .icon-indigo-700 .mat-icon { color: #5145CD !important; } .icon-indigo-800 .mat-icon { color: #42389D !important; } .icon-indigo-900 .mat-icon { color: #362F78 !important; } .icon-indigo .mat-icon { color: #6875F5 !important; } .icon-purple-50 .mat-icon { color: #F6F5FF !important; } .icon-purple-100 .mat-icon { color: #EDEBFE !important; } .icon-purple-200 .mat-icon { color: #DCD7FE !important; } .icon-purple-300 .mat-icon { color: #CABFFD !important; } .icon-purple-400 .mat-icon { color: #AC94FA !important; } .icon-purple-500 .mat-icon { color: #9061F9 !important; } .icon-purple-600 .mat-icon { color: #7E3AF2 !important; } .icon-purple-700 .mat-icon { color: #6C2BD9 !important; } .icon-purple-800 .mat-icon { color: #5521B5 !important; } .icon-purple-900 .mat-icon { color: #4A1D96 !important; } .icon-purple .mat-icon { color: #9061F9 !important; } .icon-pink-50 .mat-icon { color: #FDF2F8 !important; } .icon-pink-100 .mat-icon { color: #FCE8F3 !important; } .icon-pink-200 .mat-icon { color: #FAD1E8 !important; } .icon-pink-300 .mat-icon { color: #F8B4D9 !important; } .icon-pink-400 .mat-icon { color: #F17EB8 !important; } .icon-pink-500 .mat-icon { color: #E74694 !important; } .icon-pink-600 .mat-icon { color: #D61F69 !important; } .icon-pink-700 .mat-icon { color: #BF125D !important; } .icon-pink-800 .mat-icon { color: #99154B !important; } .icon-pink-900 .mat-icon { color: #751A3D !important; } .icon-pink .mat-icon { color: #E74694 !important; } .icon-size-12 { width: 12px !important; height: 12px !important; min-width: 12px !important; min-height: 12px !important; font-size: 12px !important; line-height: 12px !important; } .icon-size-12 svg { width: 12px !important; height: 12px !important; } .icon-size-14 { width: 14px !important; height: 14px !important; min-width: 14px !important; min-height: 14px !important; font-size: 14px !important; line-height: 14px !important; } .icon-size-14 svg { width: 14px !important; height: 14px !important; } .icon-size-16 { width: 16px !important; height: 16px !important; min-width: 16px !important; min-height: 16px !important; font-size: 16px !important; line-height: 16px !important; } .icon-size-16 svg { width: 16px !important; height: 16px !important; } .icon-size-18 { width: 18px !important; height: 18px !important; min-width: 18px !important; min-height: 18px !important; font-size: 18px !important; line-height: 18px !important; } .icon-size-18 svg { width: 18px !important; height: 18px !important; } .icon-size-20 { width: 20px !important; height: 20px !important; min-width: 20px !important; min-height: 20px !important; font-size: 20px !important; line-height: 20px !important; } .icon-size-20 svg { width: 20px !important; height: 20px !important; } .icon-size-24 { width: 24px !important; height: 24px !important; min-width: 24px !important; min-height: 24px !important; font-size: 24px !important; line-height: 24px !important; } .icon-size-24 svg { width: 24px !important; height: 24px !important; } .icon-size-32 { width: 32px !important; height: 32px !important; min-width: 32px !important; min-height: 32px !important; font-size: 32px !important; line-height: 32px !important; } .icon-size-32 svg { width: 32px !important; height: 32px !important; } .icon-size-40 { width: 40px !important; height: 40px !important; min-width: 40px !important; min-height: 40px !important; font-size: 40px !important; line-height: 40px !important; } .icon-size-40 svg { width: 40px !important; height: 40px !important; } .icon-size-48 { width: 48px !important; height: 48px !important; min-width: 48px !important; min-height: 48px !important; font-size: 48px !important; line-height: 48px !important; } .icon-size-48 svg { width: 48px !important; height: 48px !important; } .icon-size-56 { width: 56px !important; height: 56px !important; min-width: 56px !important; min-height: 56px !important; font-size: 56px !important; line-height: 56px !important; } .icon-size-56 svg { width: 56px !important; height: 56px !important; } .icon-size-64 { width: 64px !important; height: 64px !important; min-width: 64px !important; min-height: 64px !important; font-size: 64px !important; line-height: 64px !important; } .icon-size-64 svg { width: 64px !important; height: 64px !important; } .icon-size-72 { width: 72px !important; height: 72px !important; min-width: 72px !important; min-height: 72px !important; font-size: 72px !important; line-height: 72px !important; } .icon-size-72 svg { width: 72px !important; height: 72px !important; } .icon-size-80 { width: 80px !important; height: 80px !important; min-width: 80px !important; min-height: 80px !important; font-size: 80px !important; line-height: 80px !important; } .icon-size-80 svg { width: 80px !important; height: 80px !important; } .icon-size-88 { width: 88px !important; height: 88px !important; min-width: 88px !important; min-height: 88px !important; font-size: 88px !important; line-height: 88px !important; } .icon-size-88 svg { width: 88px !important; height: 88px !important; } .icon-size-96 { width: 96px !important; height: 96px !important; min-width: 96px !important; min-height: 96px !important; font-size: 96px !important; line-height: 96px !important; } .icon-size-96 svg { width: 96px !important; height: 96px !important; } .mirror { transform: scale(-1, 1) !important; } .mirror-vertical { transform: scale(1, -1) !important; } /* ----------------------------------------------------------------------------------------------------- */ /* Use custom @variant directives here to build them. /* ----------------------------------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------------------------------- */ /* Use this directive to control where Tailwind injects the responsive variations of each utility. /* If omitted, Tailwind will append these classes to the very end of your stylesheet by default. /* ----------------------------------------------------------------------------------------------------- */ @media (min-width: 0) and (max-width: 599px) { .xs\:space-y-0 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0px * var(--space-y-reverse)) !important; } .xs\:space-x-0 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0px * var(--space-x-reverse)) !important; margin-left: calc(0px * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.25rem * var(--space-y-reverse)) !important; } .xs\:space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.25rem * var(--space-x-reverse)) !important; margin-left: calc(0.25rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.5rem * var(--space-y-reverse)) !important; } .xs\:space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.5rem * var(--space-x-reverse)) !important; margin-left: calc(0.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.75rem * var(--space-y-reverse)) !important; } .xs\:space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.75rem * var(--space-x-reverse)) !important; margin-left: calc(0.75rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1rem * var(--space-y-reverse)) !important; } .xs\:space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1rem * var(--space-x-reverse)) !important; margin-left: calc(1rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.25rem * var(--space-y-reverse)) !important; } .xs\:space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.25rem * var(--space-x-reverse)) !important; margin-left: calc(1.25rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.5rem * var(--space-y-reverse)) !important; } .xs\:space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.5rem * var(--space-x-reverse)) !important; margin-left: calc(1.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2rem * var(--space-y-reverse)) !important; } .xs\:space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2rem * var(--space-x-reverse)) !important; margin-left: calc(2rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2.5rem * var(--space-y-reverse)) !important; } .xs\:space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2.5rem * var(--space-x-reverse)) !important; margin-left: calc(2.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3rem * var(--space-y-reverse)) !important; } .xs\:space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3rem * var(--space-x-reverse)) !important; margin-left: calc(3rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3.5rem * var(--space-y-reverse)) !important; } .xs\:space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3.5rem * var(--space-x-reverse)) !important; margin-left: calc(3.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4rem * var(--space-y-reverse)) !important; } .xs\:space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4rem * var(--space-x-reverse)) !important; margin-left: calc(4rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4.5rem * var(--space-y-reverse)) !important; } .xs\:space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4.5rem * var(--space-x-reverse)) !important; margin-left: calc(4.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5rem * var(--space-y-reverse)) !important; } .xs\:space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5rem * var(--space-x-reverse)) !important; margin-left: calc(5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5.5rem * var(--space-y-reverse)) !important; } .xs\:space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5.5rem * var(--space-x-reverse)) !important; margin-left: calc(5.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6rem * var(--space-y-reverse)) !important; } .xs\:space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6rem * var(--space-x-reverse)) !important; margin-left: calc(6rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6.5rem * var(--space-y-reverse)) !important; } .xs\:space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6.5rem * var(--space-x-reverse)) !important; margin-left: calc(6.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7rem * var(--space-y-reverse)) !important; } .xs\:space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7rem * var(--space-x-reverse)) !important; margin-left: calc(7rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7.5rem * var(--space-y-reverse)) !important; } .xs\:space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7.5rem * var(--space-x-reverse)) !important; margin-left: calc(7.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(8rem * var(--space-y-reverse)) !important; } .xs\:space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(8rem * var(--space-x-reverse)) !important; margin-left: calc(8rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(9rem * var(--space-y-reverse)) !important; } .xs\:space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(9rem * var(--space-x-reverse)) !important; margin-left: calc(9rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(10rem * var(--space-y-reverse)) !important; } .xs\:space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(10rem * var(--space-x-reverse)) !important; margin-left: calc(10rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(12rem * var(--space-y-reverse)) !important; } .xs\:space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(12rem * var(--space-x-reverse)) !important; margin-left: calc(12rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(14rem * var(--space-y-reverse)) !important; } .xs\:space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(14rem * var(--space-x-reverse)) !important; margin-left: calc(14rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(16rem * var(--space-y-reverse)) !important; } .xs\:space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(16rem * var(--space-x-reverse)) !important; margin-left: calc(16rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1px * var(--space-y-reverse)) !important; } .xs\:space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1px * var(--space-x-reverse)) !important; margin-left: calc(1px * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2px * var(--space-y-reverse)) !important; } .xs\:space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2px * var(--space-x-reverse)) !important; margin-left: calc(2px * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.25rem * var(--space-y-reverse)) !important; } .xs\:-space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.25rem * var(--space-x-reverse)) !important; margin-left: calc(-0.25rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.5rem * var(--space-y-reverse)) !important; } .xs\:-space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.5rem * var(--space-x-reverse)) !important; margin-left: calc(-0.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.75rem * var(--space-y-reverse)) !important; } .xs\:-space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.75rem * var(--space-x-reverse)) !important; margin-left: calc(-0.75rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1rem * var(--space-y-reverse)) !important; } .xs\:-space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1rem * var(--space-x-reverse)) !important; margin-left: calc(-1rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.25rem * var(--space-y-reverse)) !important; } .xs\:-space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.25rem * var(--space-x-reverse)) !important; margin-left: calc(-1.25rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.5rem * var(--space-y-reverse)) !important; } .xs\:-space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.5rem * var(--space-x-reverse)) !important; margin-left: calc(-1.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2rem * var(--space-y-reverse)) !important; } .xs\:-space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2rem * var(--space-x-reverse)) !important; margin-left: calc(-2rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2.5rem * var(--space-y-reverse)) !important; } .xs\:-space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2.5rem * var(--space-x-reverse)) !important; margin-left: calc(-2.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3rem * var(--space-y-reverse)) !important; } .xs\:-space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3rem * var(--space-x-reverse)) !important; margin-left: calc(-3rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3.5rem * var(--space-y-reverse)) !important; } .xs\:-space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3.5rem * var(--space-x-reverse)) !important; margin-left: calc(-3.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4rem * var(--space-y-reverse)) !important; } .xs\:-space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4rem * var(--space-x-reverse)) !important; margin-left: calc(-4rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4.5rem * var(--space-y-reverse)) !important; } .xs\:-space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4.5rem * var(--space-x-reverse)) !important; margin-left: calc(-4.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5rem * var(--space-y-reverse)) !important; } .xs\:-space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5rem * var(--space-x-reverse)) !important; margin-left: calc(-5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5.5rem * var(--space-y-reverse)) !important; } .xs\:-space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5.5rem * var(--space-x-reverse)) !important; margin-left: calc(-5.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6rem * var(--space-y-reverse)) !important; } .xs\:-space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6rem * var(--space-x-reverse)) !important; margin-left: calc(-6rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6.5rem * var(--space-y-reverse)) !important; } .xs\:-space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6.5rem * var(--space-x-reverse)) !important; margin-left: calc(-6.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7rem * var(--space-y-reverse)) !important; } .xs\:-space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7rem * var(--space-x-reverse)) !important; margin-left: calc(-7rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7.5rem * var(--space-y-reverse)) !important; } .xs\:-space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7.5rem * var(--space-x-reverse)) !important; margin-left: calc(-7.5rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-8rem * var(--space-y-reverse)) !important; } .xs\:-space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-8rem * var(--space-x-reverse)) !important; margin-left: calc(-8rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-9rem * var(--space-y-reverse)) !important; } .xs\:-space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-9rem * var(--space-x-reverse)) !important; margin-left: calc(-9rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-10rem * var(--space-y-reverse)) !important; } .xs\:-space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-10rem * var(--space-x-reverse)) !important; margin-left: calc(-10rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-12rem * var(--space-y-reverse)) !important; } .xs\:-space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-12rem * var(--space-x-reverse)) !important; margin-left: calc(-12rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-14rem * var(--space-y-reverse)) !important; } .xs\:-space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-14rem * var(--space-x-reverse)) !important; margin-left: calc(-14rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-16rem * var(--space-y-reverse)) !important; } .xs\:-space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-16rem * var(--space-x-reverse)) !important; margin-left: calc(-16rem * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1px * var(--space-y-reverse)) !important; } .xs\:-space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1px * var(--space-x-reverse)) !important; margin-left: calc(-1px * calc(1 - var(--space-x-reverse))) !important; } .xs\:-space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2px * var(--space-y-reverse)) !important; } .xs\:-space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2px * var(--space-x-reverse)) !important; margin-left: calc(-2px * calc(1 - var(--space-x-reverse))) !important; } .xs\:space-y-reverse > :not(template) ~ :not(template) { --space-y-reverse: 1 !important; } .xs\:space-x-reverse > :not(template) ~ :not(template) { --space-x-reverse: 1 !important; } .xs\:divide-y-0 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(0px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(0px * var(--divide-y-reverse)) !important; } .xs\:divide-x-0 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(0px * var(--divide-x-reverse)) !important; border-left-width: calc(0px * calc(1 - var(--divide-x-reverse))) !important; } .xs\:divide-y-2 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(2px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(2px * var(--divide-y-reverse)) !important; } .xs\:divide-x-2 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(2px * var(--divide-x-reverse)) !important; border-left-width: calc(2px * calc(1 - var(--divide-x-reverse))) !important; } .xs\:divide-y-4 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(4px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(4px * var(--divide-y-reverse)) !important; } .xs\:divide-x-4 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(4px * var(--divide-x-reverse)) !important; border-left-width: calc(4px * calc(1 - var(--divide-x-reverse))) !important; } .xs\:divide-y-8 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(8px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(8px * var(--divide-y-reverse)) !important; } .xs\:divide-x-8 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(8px * var(--divide-x-reverse)) !important; border-left-width: calc(8px * calc(1 - var(--divide-x-reverse))) !important; } .xs\:divide-y > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(1px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(1px * var(--divide-y-reverse)) !important; } .xs\:divide-x > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(1px * var(--divide-x-reverse)) !important; border-left-width: calc(1px * calc(1 - var(--divide-x-reverse))) !important; } .xs\:divide-y-reverse > :not(template) ~ :not(template) { --divide-y-reverse: 1 !important; } .xs\:divide-x-reverse > :not(template) ~ :not(template) { --divide-x-reverse: 1 !important; } .xs\:divide-current > :not(template) ~ :not(template) { border-color: currentColor !important; } .xs\:divide-transparent > :not(template) ~ :not(template) { border-color: transparent !important; } .xs\:divide-white > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFFFFF !important; border-color: rgba(255, 255, 255, var(--divide-opacity)) !important; } .xs\:divide-black > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #000000 !important; border-color: rgba(0, 0, 0, var(--divide-opacity)) !important; } .xs\:divide-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F9FAFB !important; border-color: rgba(249, 250, 251, var(--divide-opacity)) !important; } .xs\:divide-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F4F5F7 !important; border-color: rgba(244, 245, 247, var(--divide-opacity)) !important; } .xs\:divide-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5E7EB !important; border-color: rgba(229, 231, 235, var(--divide-opacity)) !important; } .xs\:divide-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D2D6DC !important; border-color: rgba(210, 214, 220, var(--divide-opacity)) !important; } .xs\:divide-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9FA6B2 !important; border-color: rgba(159, 166, 178, var(--divide-opacity)) !important; } .xs\:divide-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .xs\:divide-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4B5563 !important; border-color: rgba(75, 85, 99, var(--divide-opacity)) !important; } .xs\:divide-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #374151 !important; border-color: rgba(55, 65, 81, var(--divide-opacity)) !important; } .xs\:divide-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #252F3F !important; border-color: rgba(37, 47, 63, var(--divide-opacity)) !important; } .xs\:divide-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #161E2E !important; border-color: rgba(22, 30, 46, var(--divide-opacity)) !important; } .xs\:divide-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .xs\:divide-cool-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBFDFE !important; border-color: rgba(251, 253, 254, var(--divide-opacity)) !important; } .xs\:divide-cool-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F1F5F9 !important; border-color: rgba(241, 245, 249, var(--divide-opacity)) !important; } .xs\:divide-cool-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E2E8F0 !important; border-color: rgba(226, 232, 240, var(--divide-opacity)) !important; } .xs\:divide-cool-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CFD8E3 !important; border-color: rgba(207, 216, 227, var(--divide-opacity)) !important; } .xs\:divide-cool-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #97A6BA !important; border-color: rgba(151, 166, 186, var(--divide-opacity)) !important; } .xs\:divide-cool-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .xs\:divide-cool-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #475569 !important; border-color: rgba(71, 85, 105, var(--divide-opacity)) !important; } .xs\:divide-cool-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #364152 !important; border-color: rgba(54, 65, 82, var(--divide-opacity)) !important; } .xs\:divide-cool-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #27303F !important; border-color: rgba(39, 48, 63, var(--divide-opacity)) !important; } .xs\:divide-cool-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A202E !important; border-color: rgba(26, 32, 46, var(--divide-opacity)) !important; } .xs\:divide-cool-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .xs\:divide-red-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F2 !important; border-color: rgba(253, 242, 242, var(--divide-opacity)) !important; } .xs\:divide-red-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDE8E8 !important; border-color: rgba(253, 232, 232, var(--divide-opacity)) !important; } .xs\:divide-red-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBD5D5 !important; border-color: rgba(251, 213, 213, var(--divide-opacity)) !important; } .xs\:divide-red-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4B4 !important; border-color: rgba(248, 180, 180, var(--divide-opacity)) !important; } .xs\:divide-red-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F98080 !important; border-color: rgba(249, 128, 128, var(--divide-opacity)) !important; } .xs\:divide-red-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .xs\:divide-red-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E02424 !important; border-color: rgba(224, 36, 36, var(--divide-opacity)) !important; } .xs\:divide-red-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C81E1E !important; border-color: rgba(200, 30, 30, var(--divide-opacity)) !important; } .xs\:divide-red-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9B1C1C !important; border-color: rgba(155, 28, 28, var(--divide-opacity)) !important; } .xs\:divide-red-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .xs\:divide-red > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .xs\:divide-orange-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFF8F1 !important; border-color: rgba(255, 248, 241, var(--divide-opacity)) !important; } .xs\:divide-orange-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FEECDC !important; border-color: rgba(254, 236, 220, var(--divide-opacity)) !important; } .xs\:divide-orange-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCD9BD !important; border-color: rgba(252, 217, 189, var(--divide-opacity)) !important; } .xs\:divide-orange-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDBA8C !important; border-color: rgba(253, 186, 140, var(--divide-opacity)) !important; } .xs\:divide-orange-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF8A4C !important; border-color: rgba(255, 138, 76, var(--divide-opacity)) !important; } .xs\:divide-orange-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .xs\:divide-orange-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D03801 !important; border-color: rgba(208, 56, 1, var(--divide-opacity)) !important; } .xs\:divide-orange-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B43403 !important; border-color: rgba(180, 52, 3, var(--divide-opacity)) !important; } .xs\:divide-orange-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8A2C0D !important; border-color: rgba(138, 44, 13, var(--divide-opacity)) !important; } .xs\:divide-orange-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .xs\:divide-orange > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .xs\:divide-yellow-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDFDEA !important; border-color: rgba(253, 253, 234, var(--divide-opacity)) !important; } .xs\:divide-yellow-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF6B2 !important; border-color: rgba(253, 246, 178, var(--divide-opacity)) !important; } .xs\:divide-yellow-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE96A !important; border-color: rgba(252, 233, 106, var(--divide-opacity)) !important; } .xs\:divide-yellow-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FACA15 !important; border-color: rgba(250, 202, 21, var(--divide-opacity)) !important; } .xs\:divide-yellow-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E3A008 !important; border-color: rgba(227, 160, 8, var(--divide-opacity)) !important; } .xs\:divide-yellow-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .xs\:divide-yellow-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9F580A !important; border-color: rgba(159, 88, 10, var(--divide-opacity)) !important; } .xs\:divide-yellow-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8E4B10 !important; border-color: rgba(142, 75, 16, var(--divide-opacity)) !important; } .xs\:divide-yellow-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #723B13 !important; border-color: rgba(114, 59, 19, var(--divide-opacity)) !important; } .xs\:divide-yellow-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #633112 !important; border-color: rgba(99, 49, 18, var(--divide-opacity)) !important; } .xs\:divide-yellow > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .xs\:divide-green-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F3FAF7 !important; border-color: rgba(243, 250, 247, var(--divide-opacity)) !important; } .xs\:divide-green-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DEF7EC !important; border-color: rgba(222, 247, 236, var(--divide-opacity)) !important; } .xs\:divide-green-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BCF0DA !important; border-color: rgba(188, 240, 218, var(--divide-opacity)) !important; } .xs\:divide-green-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #84E1BC !important; border-color: rgba(132, 225, 188, var(--divide-opacity)) !important; } .xs\:divide-green-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #31C48D !important; border-color: rgba(49, 196, 141, var(--divide-opacity)) !important; } .xs\:divide-green-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .xs\:divide-green-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #057A55 !important; border-color: rgba(5, 122, 85, var(--divide-opacity)) !important; } .xs\:divide-green-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #046C4E !important; border-color: rgba(4, 108, 78, var(--divide-opacity)) !important; } .xs\:divide-green-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #03543F !important; border-color: rgba(3, 84, 63, var(--divide-opacity)) !important; } .xs\:divide-green-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014737 !important; border-color: rgba(1, 71, 55, var(--divide-opacity)) !important; } .xs\:divide-green > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .xs\:divide-teal-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDFAFA !important; border-color: rgba(237, 250, 250, var(--divide-opacity)) !important; } .xs\:divide-teal-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D5F5F6 !important; border-color: rgba(213, 245, 246, var(--divide-opacity)) !important; } .xs\:divide-teal-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AFECEF !important; border-color: rgba(175, 236, 239, var(--divide-opacity)) !important; } .xs\:divide-teal-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7EDCE2 !important; border-color: rgba(126, 220, 226, var(--divide-opacity)) !important; } .xs\:divide-teal-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #16BDCA !important; border-color: rgba(22, 189, 202, var(--divide-opacity)) !important; } .xs\:divide-teal-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .xs\:divide-teal-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #047481 !important; border-color: rgba(4, 116, 129, var(--divide-opacity)) !important; } .xs\:divide-teal-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #036672 !important; border-color: rgba(3, 102, 114, var(--divide-opacity)) !important; } .xs\:divide-teal-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #05505C !important; border-color: rgba(5, 80, 92, var(--divide-opacity)) !important; } .xs\:divide-teal-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014451 !important; border-color: rgba(1, 68, 81, var(--divide-opacity)) !important; } .xs\:divide-teal > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .xs\:divide-blue-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EBF5FF !important; border-color: rgba(235, 245, 255, var(--divide-opacity)) !important; } .xs\:divide-blue-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E1EFFE !important; border-color: rgba(225, 239, 254, var(--divide-opacity)) !important; } .xs\:divide-blue-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C3DDFD !important; border-color: rgba(195, 221, 253, var(--divide-opacity)) !important; } .xs\:divide-blue-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #A4CAFE !important; border-color: rgba(164, 202, 254, var(--divide-opacity)) !important; } .xs\:divide-blue-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #76A9FA !important; border-color: rgba(118, 169, 250, var(--divide-opacity)) !important; } .xs\:divide-blue-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .xs\:divide-blue-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1C64F2 !important; border-color: rgba(28, 100, 242, var(--divide-opacity)) !important; } .xs\:divide-blue-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A56DB !important; border-color: rgba(26, 86, 219, var(--divide-opacity)) !important; } .xs\:divide-blue-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1E429F !important; border-color: rgba(30, 66, 159, var(--divide-opacity)) !important; } .xs\:divide-blue-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #233876 !important; border-color: rgba(35, 56, 118, var(--divide-opacity)) !important; } .xs\:divide-blue > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .xs\:divide-indigo-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F0F5FF !important; border-color: rgba(240, 245, 255, var(--divide-opacity)) !important; } .xs\:divide-indigo-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5EDFF !important; border-color: rgba(229, 237, 255, var(--divide-opacity)) !important; } .xs\:divide-indigo-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CDDBFE !important; border-color: rgba(205, 219, 254, var(--divide-opacity)) !important; } .xs\:divide-indigo-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B4C6FC !important; border-color: rgba(180, 198, 252, var(--divide-opacity)) !important; } .xs\:divide-indigo-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8DA2FB !important; border-color: rgba(141, 162, 251, var(--divide-opacity)) !important; } .xs\:divide-indigo-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .xs\:divide-indigo-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5850EC !important; border-color: rgba(88, 80, 236, var(--divide-opacity)) !important; } .xs\:divide-indigo-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5145CD !important; border-color: rgba(81, 69, 205, var(--divide-opacity)) !important; } .xs\:divide-indigo-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #42389D !important; border-color: rgba(66, 56, 157, var(--divide-opacity)) !important; } .xs\:divide-indigo-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #362F78 !important; border-color: rgba(54, 47, 120, var(--divide-opacity)) !important; } .xs\:divide-indigo > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .xs\:divide-purple-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F6F5FF !important; border-color: rgba(246, 245, 255, var(--divide-opacity)) !important; } .xs\:divide-purple-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDEBFE !important; border-color: rgba(237, 235, 254, var(--divide-opacity)) !important; } .xs\:divide-purple-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DCD7FE !important; border-color: rgba(220, 215, 254, var(--divide-opacity)) !important; } .xs\:divide-purple-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CABFFD !important; border-color: rgba(202, 191, 253, var(--divide-opacity)) !important; } .xs\:divide-purple-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AC94FA !important; border-color: rgba(172, 148, 250, var(--divide-opacity)) !important; } .xs\:divide-purple-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .xs\:divide-purple-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7E3AF2 !important; border-color: rgba(126, 58, 242, var(--divide-opacity)) !important; } .xs\:divide-purple-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6C2BD9 !important; border-color: rgba(108, 43, 217, var(--divide-opacity)) !important; } .xs\:divide-purple-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5521B5 !important; border-color: rgba(85, 33, 181, var(--divide-opacity)) !important; } .xs\:divide-purple-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4A1D96 !important; border-color: rgba(74, 29, 150, var(--divide-opacity)) !important; } .xs\:divide-purple > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .xs\:divide-pink-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F8 !important; border-color: rgba(253, 242, 248, var(--divide-opacity)) !important; } .xs\:divide-pink-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE8F3 !important; border-color: rgba(252, 232, 243, var(--divide-opacity)) !important; } .xs\:divide-pink-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FAD1E8 !important; border-color: rgba(250, 209, 232, var(--divide-opacity)) !important; } .xs\:divide-pink-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4D9 !important; border-color: rgba(248, 180, 217, var(--divide-opacity)) !important; } .xs\:divide-pink-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F17EB8 !important; border-color: rgba(241, 126, 184, var(--divide-opacity)) !important; } .xs\:divide-pink-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .xs\:divide-pink-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D61F69 !important; border-color: rgba(214, 31, 105, var(--divide-opacity)) !important; } .xs\:divide-pink-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BF125D !important; border-color: rgba(191, 18, 93, var(--divide-opacity)) !important; } .xs\:divide-pink-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #99154B !important; border-color: rgba(153, 21, 75, var(--divide-opacity)) !important; } .xs\:divide-pink-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #751A3D !important; border-color: rgba(117, 26, 61, var(--divide-opacity)) !important; } .xs\:divide-pink > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .xs\:divide-opacity-0 > :not(template) ~ :not(template) { --divide-opacity: 0 !important; } .xs\:divide-opacity-12 > :not(template) ~ :not(template) { --divide-opacity: 0.12 !important; } .xs\:divide-opacity-25 > :not(template) ~ :not(template) { --divide-opacity: 0.25 !important; } .xs\:divide-opacity-38 > :not(template) ~ :not(template) { --divide-opacity: 0.38 !important; } .xs\:divide-opacity-50 > :not(template) ~ :not(template) { --divide-opacity: 0.5 !important; } .xs\:divide-opacity-54 > :not(template) ~ :not(template) { --divide-opacity: 0.54 !important; } .xs\:divide-opacity-70 > :not(template) ~ :not(template) { --divide-opacity: 0.70 !important; } .xs\:divide-opacity-75 > :not(template) ~ :not(template) { --divide-opacity: 0.75 !important; } .xs\:divide-opacity-84 > :not(template) ~ :not(template) { --divide-opacity: 0.84 !important; } .xs\:divide-opacity-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; } .xs\:sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .xs\:not-sr-only { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .xs\:focus\:sr-only:focus { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .xs\:focus\:not-sr-only:focus { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .xs\:appearance-none { -webkit-appearance: none !important; -moz-appearance: none !important; appearance: none !important; } .xs\:bg-fixed { background-attachment: fixed !important; } .xs\:bg-local { background-attachment: local !important; } .xs\:bg-scroll { background-attachment: scroll !important; } .xs\:bg-opacity-0 { --bg-opacity: 0 !important; } .xs\:bg-opacity-12 { --bg-opacity: 0.12 !important; } .xs\:bg-opacity-25 { --bg-opacity: 0.25 !important; } .xs\:bg-opacity-38 { --bg-opacity: 0.38 !important; } .xs\:bg-opacity-50 { --bg-opacity: 0.5 !important; } .xs\:bg-opacity-54 { --bg-opacity: 0.54 !important; } .xs\:bg-opacity-70 { --bg-opacity: 0.70 !important; } .xs\:bg-opacity-75 { --bg-opacity: 0.75 !important; } .xs\:bg-opacity-84 { --bg-opacity: 0.84 !important; } .xs\:bg-opacity-100 { --bg-opacity: 1 !important; } .xs\:hover\:bg-opacity-0:hover { --bg-opacity: 0 !important; } .xs\:hover\:bg-opacity-12:hover { --bg-opacity: 0.12 !important; } .xs\:hover\:bg-opacity-25:hover { --bg-opacity: 0.25 !important; } .xs\:hover\:bg-opacity-38:hover { --bg-opacity: 0.38 !important; } .xs\:hover\:bg-opacity-50:hover { --bg-opacity: 0.5 !important; } .xs\:hover\:bg-opacity-54:hover { --bg-opacity: 0.54 !important; } .xs\:hover\:bg-opacity-70:hover { --bg-opacity: 0.70 !important; } .xs\:hover\:bg-opacity-75:hover { --bg-opacity: 0.75 !important; } .xs\:hover\:bg-opacity-84:hover { --bg-opacity: 0.84 !important; } .xs\:hover\:bg-opacity-100:hover { --bg-opacity: 1 !important; } .xs\:focus\:bg-opacity-0:focus { --bg-opacity: 0 !important; } .xs\:focus\:bg-opacity-12:focus { --bg-opacity: 0.12 !important; } .xs\:focus\:bg-opacity-25:focus { --bg-opacity: 0.25 !important; } .xs\:focus\:bg-opacity-38:focus { --bg-opacity: 0.38 !important; } .xs\:focus\:bg-opacity-50:focus { --bg-opacity: 0.5 !important; } .xs\:focus\:bg-opacity-54:focus { --bg-opacity: 0.54 !important; } .xs\:focus\:bg-opacity-70:focus { --bg-opacity: 0.70 !important; } .xs\:focus\:bg-opacity-75:focus { --bg-opacity: 0.75 !important; } .xs\:focus\:bg-opacity-84:focus { --bg-opacity: 0.84 !important; } .xs\:focus\:bg-opacity-100:focus { --bg-opacity: 1 !important; } .xs\:bg-bottom { background-position: bottom !important; } .xs\:bg-center { background-position: center !important; } .xs\:bg-left { background-position: left !important; } .xs\:bg-left-bottom { background-position: left bottom !important; } .xs\:bg-left-top { background-position: left top !important; } .xs\:bg-right { background-position: right !important; } .xs\:bg-right-bottom { background-position: right bottom !important; } .xs\:bg-right-top { background-position: right top !important; } .xs\:bg-top { background-position: top !important; } .xs\:bg-repeat { background-repeat: repeat !important; } .xs\:bg-no-repeat { background-repeat: no-repeat !important; } .xs\:bg-repeat-x { background-repeat: repeat-x !important; } .xs\:bg-repeat-y { background-repeat: repeat-y !important; } .xs\:bg-repeat-round { background-repeat: round !important; } .xs\:bg-repeat-space { background-repeat: space !important; } .xs\:bg-auto { background-size: auto !important; } .xs\:bg-cover { background-size: cover !important; } .xs\:bg-contain { background-size: contain !important; } .xs\:border-collapse { border-collapse: collapse !important; } .xs\:border-separate { border-collapse: separate !important; } .xs\:border-opacity-0 { --border-opacity: 0 !important; } .xs\:border-opacity-12 { --border-opacity: 0.12 !important; } .xs\:border-opacity-25 { --border-opacity: 0.25 !important; } .xs\:border-opacity-38 { --border-opacity: 0.38 !important; } .xs\:border-opacity-50 { --border-opacity: 0.5 !important; } .xs\:border-opacity-54 { --border-opacity: 0.54 !important; } .xs\:border-opacity-70 { --border-opacity: 0.70 !important; } .xs\:border-opacity-75 { --border-opacity: 0.75 !important; } .xs\:border-opacity-84 { --border-opacity: 0.84 !important; } .xs\:border-opacity-100 { --border-opacity: 1 !important; } .xs\:hover\:border-opacity-0:hover { --border-opacity: 0 !important; } .xs\:hover\:border-opacity-12:hover { --border-opacity: 0.12 !important; } .xs\:hover\:border-opacity-25:hover { --border-opacity: 0.25 !important; } .xs\:hover\:border-opacity-38:hover { --border-opacity: 0.38 !important; } .xs\:hover\:border-opacity-50:hover { --border-opacity: 0.5 !important; } .xs\:hover\:border-opacity-54:hover { --border-opacity: 0.54 !important; } .xs\:hover\:border-opacity-70:hover { --border-opacity: 0.70 !important; } .xs\:hover\:border-opacity-75:hover { --border-opacity: 0.75 !important; } .xs\:hover\:border-opacity-84:hover { --border-opacity: 0.84 !important; } .xs\:hover\:border-opacity-100:hover { --border-opacity: 1 !important; } .xs\:focus\:border-opacity-0:focus { --border-opacity: 0 !important; } .xs\:focus\:border-opacity-12:focus { --border-opacity: 0.12 !important; } .xs\:focus\:border-opacity-25:focus { --border-opacity: 0.25 !important; } .xs\:focus\:border-opacity-38:focus { --border-opacity: 0.38 !important; } .xs\:focus\:border-opacity-50:focus { --border-opacity: 0.5 !important; } .xs\:focus\:border-opacity-54:focus { --border-opacity: 0.54 !important; } .xs\:focus\:border-opacity-70:focus { --border-opacity: 0.70 !important; } .xs\:focus\:border-opacity-75:focus { --border-opacity: 0.75 !important; } .xs\:focus\:border-opacity-84:focus { --border-opacity: 0.84 !important; } .xs\:focus\:border-opacity-100:focus { --border-opacity: 1 !important; } .xs\:rounded-none { border-radius: 0 !important; } .xs\:rounded-sm { border-radius: 0.125rem !important; } .xs\:rounded { border-radius: 0.25rem !important; } .xs\:rounded-md { border-radius: 0.375rem !important; } .xs\:rounded-lg { border-radius: 0.5rem !important; } .xs\:rounded-full { border-radius: 9999px !important; } .xs\:rounded-t-none { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } .xs\:rounded-r-none { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } .xs\:rounded-b-none { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } .xs\:rounded-l-none { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; } .xs\:rounded-t-sm { border-top-left-radius: 0.125rem !important; border-top-right-radius: 0.125rem !important; } .xs\:rounded-r-sm { border-top-right-radius: 0.125rem !important; border-bottom-right-radius: 0.125rem !important; } .xs\:rounded-b-sm { border-bottom-right-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .xs\:rounded-l-sm { border-top-left-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .xs\:rounded-t { border-top-left-radius: 0.25rem !important; border-top-right-radius: 0.25rem !important; } .xs\:rounded-r { border-top-right-radius: 0.25rem !important; border-bottom-right-radius: 0.25rem !important; } .xs\:rounded-b { border-bottom-right-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .xs\:rounded-l { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .xs\:rounded-t-md { border-top-left-radius: 0.375rem !important; border-top-right-radius: 0.375rem !important; } .xs\:rounded-r-md { border-top-right-radius: 0.375rem !important; border-bottom-right-radius: 0.375rem !important; } .xs\:rounded-b-md { border-bottom-right-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .xs\:rounded-l-md { border-top-left-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .xs\:rounded-t-lg { border-top-left-radius: 0.5rem !important; border-top-right-radius: 0.5rem !important; } .xs\:rounded-r-lg { border-top-right-radius: 0.5rem !important; border-bottom-right-radius: 0.5rem !important; } .xs\:rounded-b-lg { border-bottom-right-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .xs\:rounded-l-lg { border-top-left-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .xs\:rounded-t-full { border-top-left-radius: 9999px !important; border-top-right-radius: 9999px !important; } .xs\:rounded-r-full { border-top-right-radius: 9999px !important; border-bottom-right-radius: 9999px !important; } .xs\:rounded-b-full { border-bottom-right-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .xs\:rounded-l-full { border-top-left-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .xs\:rounded-tl-none { border-top-left-radius: 0 !important; } .xs\:rounded-tr-none { border-top-right-radius: 0 !important; } .xs\:rounded-br-none { border-bottom-right-radius: 0 !important; } .xs\:rounded-bl-none { border-bottom-left-radius: 0 !important; } .xs\:rounded-tl-sm { border-top-left-radius: 0.125rem !important; } .xs\:rounded-tr-sm { border-top-right-radius: 0.125rem !important; } .xs\:rounded-br-sm { border-bottom-right-radius: 0.125rem !important; } .xs\:rounded-bl-sm { border-bottom-left-radius: 0.125rem !important; } .xs\:rounded-tl { border-top-left-radius: 0.25rem !important; } .xs\:rounded-tr { border-top-right-radius: 0.25rem !important; } .xs\:rounded-br { border-bottom-right-radius: 0.25rem !important; } .xs\:rounded-bl { border-bottom-left-radius: 0.25rem !important; } .xs\:rounded-tl-md { border-top-left-radius: 0.375rem !important; } .xs\:rounded-tr-md { border-top-right-radius: 0.375rem !important; } .xs\:rounded-br-md { border-bottom-right-radius: 0.375rem !important; } .xs\:rounded-bl-md { border-bottom-left-radius: 0.375rem !important; } .xs\:rounded-tl-lg { border-top-left-radius: 0.5rem !important; } .xs\:rounded-tr-lg { border-top-right-radius: 0.5rem !important; } .xs\:rounded-br-lg { border-bottom-right-radius: 0.5rem !important; } .xs\:rounded-bl-lg { border-bottom-left-radius: 0.5rem !important; } .xs\:rounded-tl-full { border-top-left-radius: 9999px !important; } .xs\:rounded-tr-full { border-top-right-radius: 9999px !important; } .xs\:rounded-br-full { border-bottom-right-radius: 9999px !important; } .xs\:rounded-bl-full { border-bottom-left-radius: 9999px !important; } .xs\:border-solid { border-style: solid !important; } .xs\:border-dashed { border-style: dashed !important; } .xs\:border-dotted { border-style: dotted !important; } .xs\:border-double { border-style: double !important; } .xs\:border-none { border-style: none !important; } .xs\:border-0 { border-width: 0 !important; } .xs\:border-2 { border-width: 2px !important; } .xs\:border-4 { border-width: 4px !important; } .xs\:border-8 { border-width: 8px !important; } .xs\:border { border-width: 1px !important; } .xs\:border-t-0 { border-top-width: 0 !important; } .xs\:border-r-0 { border-right-width: 0 !important; } .xs\:border-b-0 { border-bottom-width: 0 !important; } .xs\:border-l-0 { border-left-width: 0 !important; } .xs\:border-t-2 { border-top-width: 2px !important; } .xs\:border-r-2 { border-right-width: 2px !important; } .xs\:border-b-2 { border-bottom-width: 2px !important; } .xs\:border-l-2 { border-left-width: 2px !important; } .xs\:border-t-4 { border-top-width: 4px !important; } .xs\:border-r-4 { border-right-width: 4px !important; } .xs\:border-b-4 { border-bottom-width: 4px !important; } .xs\:border-l-4 { border-left-width: 4px !important; } .xs\:border-t-8 { border-top-width: 8px !important; } .xs\:border-r-8 { border-right-width: 8px !important; } .xs\:border-b-8 { border-bottom-width: 8px !important; } .xs\:border-l-8 { border-left-width: 8px !important; } .xs\:border-t { border-top-width: 1px !important; } .xs\:border-r { border-right-width: 1px !important; } .xs\:border-b { border-bottom-width: 1px !important; } .xs\:border-l { border-left-width: 1px !important; } .xs\:first\:border-0:first-child { border-width: 0 !important; } .xs\:first\:border-2:first-child { border-width: 2px !important; } .xs\:first\:border-4:first-child { border-width: 4px !important; } .xs\:first\:border-8:first-child { border-width: 8px !important; } .xs\:first\:border:first-child { border-width: 1px !important; } .xs\:first\:border-t-0:first-child { border-top-width: 0 !important; } .xs\:first\:border-r-0:first-child { border-right-width: 0 !important; } .xs\:first\:border-b-0:first-child { border-bottom-width: 0 !important; } .xs\:first\:border-l-0:first-child { border-left-width: 0 !important; } .xs\:first\:border-t-2:first-child { border-top-width: 2px !important; } .xs\:first\:border-r-2:first-child { border-right-width: 2px !important; } .xs\:first\:border-b-2:first-child { border-bottom-width: 2px !important; } .xs\:first\:border-l-2:first-child { border-left-width: 2px !important; } .xs\:first\:border-t-4:first-child { border-top-width: 4px !important; } .xs\:first\:border-r-4:first-child { border-right-width: 4px !important; } .xs\:first\:border-b-4:first-child { border-bottom-width: 4px !important; } .xs\:first\:border-l-4:first-child { border-left-width: 4px !important; } .xs\:first\:border-t-8:first-child { border-top-width: 8px !important; } .xs\:first\:border-r-8:first-child { border-right-width: 8px !important; } .xs\:first\:border-b-8:first-child { border-bottom-width: 8px !important; } .xs\:first\:border-l-8:first-child { border-left-width: 8px !important; } .xs\:first\:border-t:first-child { border-top-width: 1px !important; } .xs\:first\:border-r:first-child { border-right-width: 1px !important; } .xs\:first\:border-b:first-child { border-bottom-width: 1px !important; } .xs\:first\:border-l:first-child { border-left-width: 1px !important; } .xs\:last\:border-0:last-child { border-width: 0 !important; } .xs\:last\:border-2:last-child { border-width: 2px !important; } .xs\:last\:border-4:last-child { border-width: 4px !important; } .xs\:last\:border-8:last-child { border-width: 8px !important; } .xs\:last\:border:last-child { border-width: 1px !important; } .xs\:last\:border-t-0:last-child { border-top-width: 0 !important; } .xs\:last\:border-r-0:last-child { border-right-width: 0 !important; } .xs\:last\:border-b-0:last-child { border-bottom-width: 0 !important; } .xs\:last\:border-l-0:last-child { border-left-width: 0 !important; } .xs\:last\:border-t-2:last-child { border-top-width: 2px !important; } .xs\:last\:border-r-2:last-child { border-right-width: 2px !important; } .xs\:last\:border-b-2:last-child { border-bottom-width: 2px !important; } .xs\:last\:border-l-2:last-child { border-left-width: 2px !important; } .xs\:last\:border-t-4:last-child { border-top-width: 4px !important; } .xs\:last\:border-r-4:last-child { border-right-width: 4px !important; } .xs\:last\:border-b-4:last-child { border-bottom-width: 4px !important; } .xs\:last\:border-l-4:last-child { border-left-width: 4px !important; } .xs\:last\:border-t-8:last-child { border-top-width: 8px !important; } .xs\:last\:border-r-8:last-child { border-right-width: 8px !important; } .xs\:last\:border-b-8:last-child { border-bottom-width: 8px !important; } .xs\:last\:border-l-8:last-child { border-left-width: 8px !important; } .xs\:last\:border-t:last-child { border-top-width: 1px !important; } .xs\:last\:border-r:last-child { border-right-width: 1px !important; } .xs\:last\:border-b:last-child { border-bottom-width: 1px !important; } .xs\:last\:border-l:last-child { border-left-width: 1px !important; } .xs\:box-border { box-sizing: border-box !important; } .xs\:box-content { box-sizing: content-box !important; } .xs\:block { display: block !important; } .xs\:inline-block { display: inline-block !important; } .xs\:inline { display: inline !important; } .xs\:flex { display: flex !important; } .xs\:inline-flex { display: inline-flex !important; } .xs\:table { display: table !important; } .xs\:table-caption { display: table-caption !important; } .xs\:table-cell { display: table-cell !important; } .xs\:table-column { display: table-column !important; } .xs\:table-column-group { display: table-column-group !important; } .xs\:table-footer-group { display: table-footer-group !important; } .xs\:table-header-group { display: table-header-group !important; } .xs\:table-row-group { display: table-row-group !important; } .xs\:table-row { display: table-row !important; } .xs\:flow-root { display: flow-root !important; } .xs\:grid { display: grid !important; } .xs\:inline-grid { display: inline-grid !important; } .xs\:hidden { display: none !important; } .xs\:flex-row { flex-direction: row !important; } .xs\:flex-row-reverse { flex-direction: row-reverse !important; } .xs\:flex-col { flex-direction: column !important; } .xs\:flex-col-reverse { flex-direction: column-reverse !important; } .xs\:flex-wrap { flex-wrap: wrap !important; } .xs\:flex-wrap-reverse { flex-wrap: wrap-reverse !important; } .xs\:flex-no-wrap { flex-wrap: nowrap !important; } .xs\:items-start { align-items: flex-start !important; } .xs\:items-end { align-items: flex-end !important; } .xs\:items-center { align-items: center !important; } .xs\:items-baseline { align-items: baseline !important; } .xs\:items-stretch { align-items: stretch !important; } .xs\:self-auto { align-self: auto !important; } .xs\:self-start { align-self: flex-start !important; } .xs\:self-end { align-self: flex-end !important; } .xs\:self-center { align-self: center !important; } .xs\:self-stretch { align-self: stretch !important; } .xs\:justify-start { justify-content: flex-start !important; } .xs\:justify-end { justify-content: flex-end !important; } .xs\:justify-center { justify-content: center !important; } .xs\:justify-between { justify-content: space-between !important; } .xs\:justify-around { justify-content: space-around !important; } .xs\:justify-evenly { justify-content: space-evenly !important; } .xs\:content-center { align-content: center !important; } .xs\:content-start { align-content: flex-start !important; } .xs\:content-end { align-content: flex-end !important; } .xs\:content-between { align-content: space-between !important; } .xs\:content-around { align-content: space-around !important; } .xs\:flex-0 { flex: 0 0 auto !important; } .xs\:flex-1 { flex: 1 1 0% !important; } .xs\:flex-auto { flex: 1 1 auto !important; } .xs\:flex-initial { flex: 0 1 auto !important; } .xs\:flex-none { flex: none !important; } .xs\:flex-grow-0 { flex-grow: 0 !important; } .xs\:flex-grow { flex-grow: 1 !important; } .xs\:flex-shrink-0 { flex-shrink: 0 !important; } .xs\:flex-shrink { flex-shrink: 1 !important; } .xs\:order-1 { order: 1 !important; } .xs\:order-2 { order: 2 !important; } .xs\:order-3 { order: 3 !important; } .xs\:order-4 { order: 4 !important; } .xs\:order-5 { order: 5 !important; } .xs\:order-6 { order: 6 !important; } .xs\:order-7 { order: 7 !important; } .xs\:order-8 { order: 8 !important; } .xs\:order-9 { order: 9 !important; } .xs\:order-10 { order: 10 !important; } .xs\:order-11 { order: 11 !important; } .xs\:order-12 { order: 12 !important; } .xs\:order-first { order: -9999 !important; } .xs\:order-last { order: 9999 !important; } .xs\:order-none { order: 0 !important; } .xs\:font-hairline { font-weight: 100 !important; } .xs\:font-thin { font-weight: 200 !important; } .xs\:font-light { font-weight: 300 !important; } .xs\:font-normal { font-weight: 400 !important; } .xs\:font-medium { font-weight: 500 !important; } .xs\:font-semibold { font-weight: 600 !important; } .xs\:font-bold { font-weight: 700 !important; } .xs\:font-extrabold { font-weight: 800 !important; } .xs\:font-black { font-weight: 900 !important; } .xs\:h-0 { height: 0 !important; } .xs\:h-1 { height: 0.25rem !important; } .xs\:h-2 { height: 0.5rem !important; } .xs\:h-3 { height: 0.75rem !important; } .xs\:h-4 { height: 1rem !important; } .xs\:h-5 { height: 1.25rem !important; } .xs\:h-6 { height: 1.5rem !important; } .xs\:h-8 { height: 2rem !important; } .xs\:h-10 { height: 2.5rem !important; } .xs\:h-12 { height: 3rem !important; } .xs\:h-14 { height: 3.5rem !important; } .xs\:h-16 { height: 4rem !important; } .xs\:h-18 { height: 4.5rem !important; } .xs\:h-20 { height: 5rem !important; } .xs\:h-22 { height: 5.5rem !important; } .xs\:h-24 { height: 6rem !important; } .xs\:h-26 { height: 6.5rem !important; } .xs\:h-28 { height: 7rem !important; } .xs\:h-30 { height: 7.5rem !important; } .xs\:h-32 { height: 8rem !important; } .xs\:h-36 { height: 9rem !important; } .xs\:h-40 { height: 10rem !important; } .xs\:h-48 { height: 12rem !important; } .xs\:h-50 { height: 12.5rem !important; } .xs\:h-56 { height: 14rem !important; } .xs\:h-60 { height: 15rem !important; } .xs\:h-64 { height: 16rem !important; } .xs\:h-80 { height: 20rem !important; } .xs\:h-90 { height: 24rem !important; } .xs\:h-100 { height: 25rem !important; } .xs\:h-120 { height: 30rem !important; } .xs\:h-128 { height: 32rem !important; } .xs\:h-140 { height: 35rem !important; } .xs\:h-160 { height: 40rem !important; } .xs\:h-180 { height: 45rem !important; } .xs\:h-192 { height: 48rem !important; } .xs\:h-200 { height: 50rem !important; } .xs\:h-240 { height: 60rem !important; } .xs\:h-256 { height: 64rem !important; } .xs\:h-280 { height: 70rem !important; } .xs\:h-320 { height: 80rem !important; } .xs\:h-360 { height: 90rem !important; } .xs\:h-400 { height: 100rem !important; } .xs\:h-480 { height: 120rem !important; } .xs\:h-auto { height: auto !important; } .xs\:h-px { height: 1px !important; } .xs\:h-2px { height: 2px !important; } .xs\:h-full { height: 100% !important; } .xs\:h-screen { height: 100vh !important; } .xs\:h-1\/2 { height: 50% !important; } .xs\:h-1\/3 { height: 33.33333% !important; } .xs\:h-2\/3 { height: 66.66667% !important; } .xs\:h-1\/4 { height: 25% !important; } .xs\:h-2\/4 { height: 50% !important; } .xs\:h-3\/4 { height: 75% !important; } .xs\:h-1\/5 { height: 20% !important; } .xs\:h-2\/5 { height: 40% !important; } .xs\:h-3\/5 { height: 60% !important; } .xs\:h-4\/5 { height: 80% !important; } .xs\:h-1\/12 { height: 8.33333% !important; } .xs\:h-2\/12 { height: 16.66667% !important; } .xs\:h-3\/12 { height: 25% !important; } .xs\:h-4\/12 { height: 33.33333% !important; } .xs\:h-5\/12 { height: 41.66667% !important; } .xs\:h-6\/12 { height: 50% !important; } .xs\:h-7\/12 { height: 58.33333% !important; } .xs\:h-8\/12 { height: 66.66667% !important; } .xs\:h-9\/12 { height: 75% !important; } .xs\:h-10\/12 { height: 83.33333% !important; } .xs\:h-11\/12 { height: 91.66667% !important; } .xs\:text-xs { font-size: 0.625rem !important; } .xs\:text-sm { font-size: 0.75rem !important; } .xs\:text-md { font-size: 0.8125rem !important; } .xs\:text-base { font-size: 0.875rem !important; } .xs\:text-lg { font-size: 1rem !important; } .xs\:text-xl { font-size: 1.125rem !important; } .xs\:text-2xl { font-size: 1.25rem !important; } .xs\:text-3xl { font-size: 1.5rem !important; } .xs\:text-4xl { font-size: 2rem !important; } .xs\:text-5xl { font-size: 2.25rem !important; } .xs\:text-6xl { font-size: 2.5rem !important; } .xs\:text-7xl { font-size: 3rem !important; } .xs\:text-8xl { font-size: 4rem !important; } .xs\:text-9xl { font-size: 6rem !important; } .xs\:text-10xl { font-size: 8rem !important; } .xs\:leading-3 { line-height: .75rem !important; } .xs\:leading-4 { line-height: 1rem !important; } .xs\:leading-5 { line-height: 1.25rem !important; } .xs\:leading-6 { line-height: 1.5rem !important; } .xs\:leading-7 { line-height: 1.75rem !important; } .xs\:leading-8 { line-height: 2rem !important; } .xs\:leading-9 { line-height: 2.25rem !important; } .xs\:leading-10 { line-height: 2.5rem !important; } .xs\:leading-none { line-height: 1 !important; } .xs\:leading-tight { line-height: 1.25 !important; } .xs\:leading-snug { line-height: 1.375 !important; } .xs\:leading-normal { line-height: 1.5 !important; } .xs\:leading-relaxed { line-height: 1.625 !important; } .xs\:leading-loose { line-height: 2 !important; } .xs\:list-inside { list-style-position: inside !important; } .xs\:list-outside { list-style-position: outside !important; } .xs\:list-none { list-style-type: none !important; } .xs\:list-disc { list-style-type: disc !important; } .xs\:list-decimal { list-style-type: decimal !important; } .xs\:m-0 { margin: 0 !important; } .xs\:m-1 { margin: 0.25rem !important; } .xs\:m-2 { margin: 0.5rem !important; } .xs\:m-3 { margin: 0.75rem !important; } .xs\:m-4 { margin: 1rem !important; } .xs\:m-5 { margin: 1.25rem !important; } .xs\:m-6 { margin: 1.5rem !important; } .xs\:m-8 { margin: 2rem !important; } .xs\:m-10 { margin: 2.5rem !important; } .xs\:m-12 { margin: 3rem !important; } .xs\:m-14 { margin: 3.5rem !important; } .xs\:m-16 { margin: 4rem !important; } .xs\:m-18 { margin: 4.5rem !important; } .xs\:m-20 { margin: 5rem !important; } .xs\:m-22 { margin: 5.5rem !important; } .xs\:m-24 { margin: 6rem !important; } .xs\:m-26 { margin: 6.5rem !important; } .xs\:m-28 { margin: 7rem !important; } .xs\:m-30 { margin: 7.5rem !important; } .xs\:m-32 { margin: 8rem !important; } .xs\:m-36 { margin: 9rem !important; } .xs\:m-40 { margin: 10rem !important; } .xs\:m-48 { margin: 12rem !important; } .xs\:m-56 { margin: 14rem !important; } .xs\:m-64 { margin: 16rem !important; } .xs\:m-auto { margin: auto !important; } .xs\:m-px { margin: 1px !important; } .xs\:m-2px { margin: 2px !important; } .xs\:-m-1 { margin: -0.25rem !important; } .xs\:-m-2 { margin: -0.5rem !important; } .xs\:-m-3 { margin: -0.75rem !important; } .xs\:-m-4 { margin: -1rem !important; } .xs\:-m-5 { margin: -1.25rem !important; } .xs\:-m-6 { margin: -1.5rem !important; } .xs\:-m-8 { margin: -2rem !important; } .xs\:-m-10 { margin: -2.5rem !important; } .xs\:-m-12 { margin: -3rem !important; } .xs\:-m-14 { margin: -3.5rem !important; } .xs\:-m-16 { margin: -4rem !important; } .xs\:-m-18 { margin: -4.5rem !important; } .xs\:-m-20 { margin: -5rem !important; } .xs\:-m-22 { margin: -5.5rem !important; } .xs\:-m-24 { margin: -6rem !important; } .xs\:-m-26 { margin: -6.5rem !important; } .xs\:-m-28 { margin: -7rem !important; } .xs\:-m-30 { margin: -7.5rem !important; } .xs\:-m-32 { margin: -8rem !important; } .xs\:-m-36 { margin: -9rem !important; } .xs\:-m-40 { margin: -10rem !important; } .xs\:-m-48 { margin: -12rem !important; } .xs\:-m-56 { margin: -14rem !important; } .xs\:-m-64 { margin: -16rem !important; } .xs\:-m-px { margin: -1px !important; } .xs\:-m-2px { margin: -2px !important; } .xs\:my-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .xs\:mx-0 { margin-left: 0 !important; margin-right: 0 !important; } .xs\:my-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .xs\:mx-1 { margin-left: 0.25rem !important; margin-right: 0.25rem !important; } .xs\:my-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .xs\:mx-2 { margin-left: 0.5rem !important; margin-right: 0.5rem !important; } .xs\:my-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .xs\:mx-3 { margin-left: 0.75rem !important; margin-right: 0.75rem !important; } .xs\:my-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .xs\:mx-4 { margin-left: 1rem !important; margin-right: 1rem !important; } .xs\:my-5 { margin-top: 1.25rem !important; margin-bottom: 1.25rem !important; } .xs\:mx-5 { margin-left: 1.25rem !important; margin-right: 1.25rem !important; } .xs\:my-6 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .xs\:mx-6 { margin-left: 1.5rem !important; margin-right: 1.5rem !important; } .xs\:my-8 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .xs\:mx-8 { margin-left: 2rem !important; margin-right: 2rem !important; } .xs\:my-10 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .xs\:mx-10 { margin-left: 2.5rem !important; margin-right: 2.5rem !important; } .xs\:my-12 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .xs\:mx-12 { margin-left: 3rem !important; margin-right: 3rem !important; } .xs\:my-14 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .xs\:mx-14 { margin-left: 3.5rem !important; margin-right: 3.5rem !important; } .xs\:my-16 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .xs\:mx-16 { margin-left: 4rem !important; margin-right: 4rem !important; } .xs\:my-18 { margin-top: 4.5rem !important; margin-bottom: 4.5rem !important; } .xs\:mx-18 { margin-left: 4.5rem !important; margin-right: 4.5rem !important; } .xs\:my-20 { margin-top: 5rem !important; margin-bottom: 5rem !important; } .xs\:mx-20 { margin-left: 5rem !important; margin-right: 5rem !important; } .xs\:my-22 { margin-top: 5.5rem !important; margin-bottom: 5.5rem !important; } .xs\:mx-22 { margin-left: 5.5rem !important; margin-right: 5.5rem !important; } .xs\:my-24 { margin-top: 6rem !important; margin-bottom: 6rem !important; } .xs\:mx-24 { margin-left: 6rem !important; margin-right: 6rem !important; } .xs\:my-26 { margin-top: 6.5rem !important; margin-bottom: 6.5rem !important; } .xs\:mx-26 { margin-left: 6.5rem !important; margin-right: 6.5rem !important; } .xs\:my-28 { margin-top: 7rem !important; margin-bottom: 7rem !important; } .xs\:mx-28 { margin-left: 7rem !important; margin-right: 7rem !important; } .xs\:my-30 { margin-top: 7.5rem !important; margin-bottom: 7.5rem !important; } .xs\:mx-30 { margin-left: 7.5rem !important; margin-right: 7.5rem !important; } .xs\:my-32 { margin-top: 8rem !important; margin-bottom: 8rem !important; } .xs\:mx-32 { margin-left: 8rem !important; margin-right: 8rem !important; } .xs\:my-36 { margin-top: 9rem !important; margin-bottom: 9rem !important; } .xs\:mx-36 { margin-left: 9rem !important; margin-right: 9rem !important; } .xs\:my-40 { margin-top: 10rem !important; margin-bottom: 10rem !important; } .xs\:mx-40 { margin-left: 10rem !important; margin-right: 10rem !important; } .xs\:my-48 { margin-top: 12rem !important; margin-bottom: 12rem !important; } .xs\:mx-48 { margin-left: 12rem !important; margin-right: 12rem !important; } .xs\:my-56 { margin-top: 14rem !important; margin-bottom: 14rem !important; } .xs\:mx-56 { margin-left: 14rem !important; margin-right: 14rem !important; } .xs\:my-64 { margin-top: 16rem !important; margin-bottom: 16rem !important; } .xs\:mx-64 { margin-left: 16rem !important; margin-right: 16rem !important; } .xs\:my-auto { margin-top: auto !important; margin-bottom: auto !important; } .xs\:mx-auto { margin-left: auto !important; margin-right: auto !important; } .xs\:my-px { margin-top: 1px !important; margin-bottom: 1px !important; } .xs\:mx-px { margin-left: 1px !important; margin-right: 1px !important; } .xs\:my-2px { margin-top: 2px !important; margin-bottom: 2px !important; } .xs\:mx-2px { margin-left: 2px !important; margin-right: 2px !important; } .xs\:-my-1 { margin-top: -0.25rem !important; margin-bottom: -0.25rem !important; } .xs\:-mx-1 { margin-left: -0.25rem !important; margin-right: -0.25rem !important; } .xs\:-my-2 { margin-top: -0.5rem !important; margin-bottom: -0.5rem !important; } .xs\:-mx-2 { margin-left: -0.5rem !important; margin-right: -0.5rem !important; } .xs\:-my-3 { margin-top: -0.75rem !important; margin-bottom: -0.75rem !important; } .xs\:-mx-3 { margin-left: -0.75rem !important; margin-right: -0.75rem !important; } .xs\:-my-4 { margin-top: -1rem !important; margin-bottom: -1rem !important; } .xs\:-mx-4 { margin-left: -1rem !important; margin-right: -1rem !important; } .xs\:-my-5 { margin-top: -1.25rem !important; margin-bottom: -1.25rem !important; } .xs\:-mx-5 { margin-left: -1.25rem !important; margin-right: -1.25rem !important; } .xs\:-my-6 { margin-top: -1.5rem !important; margin-bottom: -1.5rem !important; } .xs\:-mx-6 { margin-left: -1.5rem !important; margin-right: -1.5rem !important; } .xs\:-my-8 { margin-top: -2rem !important; margin-bottom: -2rem !important; } .xs\:-mx-8 { margin-left: -2rem !important; margin-right: -2rem !important; } .xs\:-my-10 { margin-top: -2.5rem !important; margin-bottom: -2.5rem !important; } .xs\:-mx-10 { margin-left: -2.5rem !important; margin-right: -2.5rem !important; } .xs\:-my-12 { margin-top: -3rem !important; margin-bottom: -3rem !important; } .xs\:-mx-12 { margin-left: -3rem !important; margin-right: -3rem !important; } .xs\:-my-14 { margin-top: -3.5rem !important; margin-bottom: -3.5rem !important; } .xs\:-mx-14 { margin-left: -3.5rem !important; margin-right: -3.5rem !important; } .xs\:-my-16 { margin-top: -4rem !important; margin-bottom: -4rem !important; } .xs\:-mx-16 { margin-left: -4rem !important; margin-right: -4rem !important; } .xs\:-my-18 { margin-top: -4.5rem !important; margin-bottom: -4.5rem !important; } .xs\:-mx-18 { margin-left: -4.5rem !important; margin-right: -4.5rem !important; } .xs\:-my-20 { margin-top: -5rem !important; margin-bottom: -5rem !important; } .xs\:-mx-20 { margin-left: -5rem !important; margin-right: -5rem !important; } .xs\:-my-22 { margin-top: -5.5rem !important; margin-bottom: -5.5rem !important; } .xs\:-mx-22 { margin-left: -5.5rem !important; margin-right: -5.5rem !important; } .xs\:-my-24 { margin-top: -6rem !important; margin-bottom: -6rem !important; } .xs\:-mx-24 { margin-left: -6rem !important; margin-right: -6rem !important; } .xs\:-my-26 { margin-top: -6.5rem !important; margin-bottom: -6.5rem !important; } .xs\:-mx-26 { margin-left: -6.5rem !important; margin-right: -6.5rem !important; } .xs\:-my-28 { margin-top: -7rem !important; margin-bottom: -7rem !important; } .xs\:-mx-28 { margin-left: -7rem !important; margin-right: -7rem !important; } .xs\:-my-30 { margin-top: -7.5rem !important; margin-bottom: -7.5rem !important; } .xs\:-mx-30 { margin-left: -7.5rem !important; margin-right: -7.5rem !important; } .xs\:-my-32 { margin-top: -8rem !important; margin-bottom: -8rem !important; } .xs\:-mx-32 { margin-left: -8rem !important; margin-right: -8rem !important; } .xs\:-my-36 { margin-top: -9rem !important; margin-bottom: -9rem !important; } .xs\:-mx-36 { margin-left: -9rem !important; margin-right: -9rem !important; } .xs\:-my-40 { margin-top: -10rem !important; margin-bottom: -10rem !important; } .xs\:-mx-40 { margin-left: -10rem !important; margin-right: -10rem !important; } .xs\:-my-48 { margin-top: -12rem !important; margin-bottom: -12rem !important; } .xs\:-mx-48 { margin-left: -12rem !important; margin-right: -12rem !important; } .xs\:-my-56 { margin-top: -14rem !important; margin-bottom: -14rem !important; } .xs\:-mx-56 { margin-left: -14rem !important; margin-right: -14rem !important; } .xs\:-my-64 { margin-top: -16rem !important; margin-bottom: -16rem !important; } .xs\:-mx-64 { margin-left: -16rem !important; margin-right: -16rem !important; } .xs\:-my-px { margin-top: -1px !important; margin-bottom: -1px !important; } .xs\:-mx-px { margin-left: -1px !important; margin-right: -1px !important; } .xs\:-my-2px { margin-top: -2px !important; margin-bottom: -2px !important; } .xs\:-mx-2px { margin-left: -2px !important; margin-right: -2px !important; } .xs\:mt-0 { margin-top: 0 !important; } .xs\:mr-0 { margin-right: 0 !important; } .xs\:mb-0 { margin-bottom: 0 !important; } .xs\:ml-0 { margin-left: 0 !important; } .xs\:mt-1 { margin-top: 0.25rem !important; } .xs\:mr-1 { margin-right: 0.25rem !important; } .xs\:mb-1 { margin-bottom: 0.25rem !important; } .xs\:ml-1 { margin-left: 0.25rem !important; } .xs\:mt-2 { margin-top: 0.5rem !important; } .xs\:mr-2 { margin-right: 0.5rem !important; } .xs\:mb-2 { margin-bottom: 0.5rem !important; } .xs\:ml-2 { margin-left: 0.5rem !important; } .xs\:mt-3 { margin-top: 0.75rem !important; } .xs\:mr-3 { margin-right: 0.75rem !important; } .xs\:mb-3 { margin-bottom: 0.75rem !important; } .xs\:ml-3 { margin-left: 0.75rem !important; } .xs\:mt-4 { margin-top: 1rem !important; } .xs\:mr-4 { margin-right: 1rem !important; } .xs\:mb-4 { margin-bottom: 1rem !important; } .xs\:ml-4 { margin-left: 1rem !important; } .xs\:mt-5 { margin-top: 1.25rem !important; } .xs\:mr-5 { margin-right: 1.25rem !important; } .xs\:mb-5 { margin-bottom: 1.25rem !important; } .xs\:ml-5 { margin-left: 1.25rem !important; } .xs\:mt-6 { margin-top: 1.5rem !important; } .xs\:mr-6 { margin-right: 1.5rem !important; } .xs\:mb-6 { margin-bottom: 1.5rem !important; } .xs\:ml-6 { margin-left: 1.5rem !important; } .xs\:mt-8 { margin-top: 2rem !important; } .xs\:mr-8 { margin-right: 2rem !important; } .xs\:mb-8 { margin-bottom: 2rem !important; } .xs\:ml-8 { margin-left: 2rem !important; } .xs\:mt-10 { margin-top: 2.5rem !important; } .xs\:mr-10 { margin-right: 2.5rem !important; } .xs\:mb-10 { margin-bottom: 2.5rem !important; } .xs\:ml-10 { margin-left: 2.5rem !important; } .xs\:mt-12 { margin-top: 3rem !important; } .xs\:mr-12 { margin-right: 3rem !important; } .xs\:mb-12 { margin-bottom: 3rem !important; } .xs\:ml-12 { margin-left: 3rem !important; } .xs\:mt-14 { margin-top: 3.5rem !important; } .xs\:mr-14 { margin-right: 3.5rem !important; } .xs\:mb-14 { margin-bottom: 3.5rem !important; } .xs\:ml-14 { margin-left: 3.5rem !important; } .xs\:mt-16 { margin-top: 4rem !important; } .xs\:mr-16 { margin-right: 4rem !important; } .xs\:mb-16 { margin-bottom: 4rem !important; } .xs\:ml-16 { margin-left: 4rem !important; } .xs\:mt-18 { margin-top: 4.5rem !important; } .xs\:mr-18 { margin-right: 4.5rem !important; } .xs\:mb-18 { margin-bottom: 4.5rem !important; } .xs\:ml-18 { margin-left: 4.5rem !important; } .xs\:mt-20 { margin-top: 5rem !important; } .xs\:mr-20 { margin-right: 5rem !important; } .xs\:mb-20 { margin-bottom: 5rem !important; } .xs\:ml-20 { margin-left: 5rem !important; } .xs\:mt-22 { margin-top: 5.5rem !important; } .xs\:mr-22 { margin-right: 5.5rem !important; } .xs\:mb-22 { margin-bottom: 5.5rem !important; } .xs\:ml-22 { margin-left: 5.5rem !important; } .xs\:mt-24 { margin-top: 6rem !important; } .xs\:mr-24 { margin-right: 6rem !important; } .xs\:mb-24 { margin-bottom: 6rem !important; } .xs\:ml-24 { margin-left: 6rem !important; } .xs\:mt-26 { margin-top: 6.5rem !important; } .xs\:mr-26 { margin-right: 6.5rem !important; } .xs\:mb-26 { margin-bottom: 6.5rem !important; } .xs\:ml-26 { margin-left: 6.5rem !important; } .xs\:mt-28 { margin-top: 7rem !important; } .xs\:mr-28 { margin-right: 7rem !important; } .xs\:mb-28 { margin-bottom: 7rem !important; } .xs\:ml-28 { margin-left: 7rem !important; } .xs\:mt-30 { margin-top: 7.5rem !important; } .xs\:mr-30 { margin-right: 7.5rem !important; } .xs\:mb-30 { margin-bottom: 7.5rem !important; } .xs\:ml-30 { margin-left: 7.5rem !important; } .xs\:mt-32 { margin-top: 8rem !important; } .xs\:mr-32 { margin-right: 8rem !important; } .xs\:mb-32 { margin-bottom: 8rem !important; } .xs\:ml-32 { margin-left: 8rem !important; } .xs\:mt-36 { margin-top: 9rem !important; } .xs\:mr-36 { margin-right: 9rem !important; } .xs\:mb-36 { margin-bottom: 9rem !important; } .xs\:ml-36 { margin-left: 9rem !important; } .xs\:mt-40 { margin-top: 10rem !important; } .xs\:mr-40 { margin-right: 10rem !important; } .xs\:mb-40 { margin-bottom: 10rem !important; } .xs\:ml-40 { margin-left: 10rem !important; } .xs\:mt-48 { margin-top: 12rem !important; } .xs\:mr-48 { margin-right: 12rem !important; } .xs\:mb-48 { margin-bottom: 12rem !important; } .xs\:ml-48 { margin-left: 12rem !important; } .xs\:mt-56 { margin-top: 14rem !important; } .xs\:mr-56 { margin-right: 14rem !important; } .xs\:mb-56 { margin-bottom: 14rem !important; } .xs\:ml-56 { margin-left: 14rem !important; } .xs\:mt-64 { margin-top: 16rem !important; } .xs\:mr-64 { margin-right: 16rem !important; } .xs\:mb-64 { margin-bottom: 16rem !important; } .xs\:ml-64 { margin-left: 16rem !important; } .xs\:mt-auto { margin-top: auto !important; } .xs\:mr-auto { margin-right: auto !important; } .xs\:mb-auto { margin-bottom: auto !important; } .xs\:ml-auto { margin-left: auto !important; } .xs\:mt-px { margin-top: 1px !important; } .xs\:mr-px { margin-right: 1px !important; } .xs\:mb-px { margin-bottom: 1px !important; } .xs\:ml-px { margin-left: 1px !important; } .xs\:mt-2px { margin-top: 2px !important; } .xs\:mr-2px { margin-right: 2px !important; } .xs\:mb-2px { margin-bottom: 2px !important; } .xs\:ml-2px { margin-left: 2px !important; } .xs\:-mt-1 { margin-top: -0.25rem !important; } .xs\:-mr-1 { margin-right: -0.25rem !important; } .xs\:-mb-1 { margin-bottom: -0.25rem !important; } .xs\:-ml-1 { margin-left: -0.25rem !important; } .xs\:-mt-2 { margin-top: -0.5rem !important; } .xs\:-mr-2 { margin-right: -0.5rem !important; } .xs\:-mb-2 { margin-bottom: -0.5rem !important; } .xs\:-ml-2 { margin-left: -0.5rem !important; } .xs\:-mt-3 { margin-top: -0.75rem !important; } .xs\:-mr-3 { margin-right: -0.75rem !important; } .xs\:-mb-3 { margin-bottom: -0.75rem !important; } .xs\:-ml-3 { margin-left: -0.75rem !important; } .xs\:-mt-4 { margin-top: -1rem !important; } .xs\:-mr-4 { margin-right: -1rem !important; } .xs\:-mb-4 { margin-bottom: -1rem !important; } .xs\:-ml-4 { margin-left: -1rem !important; } .xs\:-mt-5 { margin-top: -1.25rem !important; } .xs\:-mr-5 { margin-right: -1.25rem !important; } .xs\:-mb-5 { margin-bottom: -1.25rem !important; } .xs\:-ml-5 { margin-left: -1.25rem !important; } .xs\:-mt-6 { margin-top: -1.5rem !important; } .xs\:-mr-6 { margin-right: -1.5rem !important; } .xs\:-mb-6 { margin-bottom: -1.5rem !important; } .xs\:-ml-6 { margin-left: -1.5rem !important; } .xs\:-mt-8 { margin-top: -2rem !important; } .xs\:-mr-8 { margin-right: -2rem !important; } .xs\:-mb-8 { margin-bottom: -2rem !important; } .xs\:-ml-8 { margin-left: -2rem !important; } .xs\:-mt-10 { margin-top: -2.5rem !important; } .xs\:-mr-10 { margin-right: -2.5rem !important; } .xs\:-mb-10 { margin-bottom: -2.5rem !important; } .xs\:-ml-10 { margin-left: -2.5rem !important; } .xs\:-mt-12 { margin-top: -3rem !important; } .xs\:-mr-12 { margin-right: -3rem !important; } .xs\:-mb-12 { margin-bottom: -3rem !important; } .xs\:-ml-12 { margin-left: -3rem !important; } .xs\:-mt-14 { margin-top: -3.5rem !important; } .xs\:-mr-14 { margin-right: -3.5rem !important; } .xs\:-mb-14 { margin-bottom: -3.5rem !important; } .xs\:-ml-14 { margin-left: -3.5rem !important; } .xs\:-mt-16 { margin-top: -4rem !important; } .xs\:-mr-16 { margin-right: -4rem !important; } .xs\:-mb-16 { margin-bottom: -4rem !important; } .xs\:-ml-16 { margin-left: -4rem !important; } .xs\:-mt-18 { margin-top: -4.5rem !important; } .xs\:-mr-18 { margin-right: -4.5rem !important; } .xs\:-mb-18 { margin-bottom: -4.5rem !important; } .xs\:-ml-18 { margin-left: -4.5rem !important; } .xs\:-mt-20 { margin-top: -5rem !important; } .xs\:-mr-20 { margin-right: -5rem !important; } .xs\:-mb-20 { margin-bottom: -5rem !important; } .xs\:-ml-20 { margin-left: -5rem !important; } .xs\:-mt-22 { margin-top: -5.5rem !important; } .xs\:-mr-22 { margin-right: -5.5rem !important; } .xs\:-mb-22 { margin-bottom: -5.5rem !important; } .xs\:-ml-22 { margin-left: -5.5rem !important; } .xs\:-mt-24 { margin-top: -6rem !important; } .xs\:-mr-24 { margin-right: -6rem !important; } .xs\:-mb-24 { margin-bottom: -6rem !important; } .xs\:-ml-24 { margin-left: -6rem !important; } .xs\:-mt-26 { margin-top: -6.5rem !important; } .xs\:-mr-26 { margin-right: -6.5rem !important; } .xs\:-mb-26 { margin-bottom: -6.5rem !important; } .xs\:-ml-26 { margin-left: -6.5rem !important; } .xs\:-mt-28 { margin-top: -7rem !important; } .xs\:-mr-28 { margin-right: -7rem !important; } .xs\:-mb-28 { margin-bottom: -7rem !important; } .xs\:-ml-28 { margin-left: -7rem !important; } .xs\:-mt-30 { margin-top: -7.5rem !important; } .xs\:-mr-30 { margin-right: -7.5rem !important; } .xs\:-mb-30 { margin-bottom: -7.5rem !important; } .xs\:-ml-30 { margin-left: -7.5rem !important; } .xs\:-mt-32 { margin-top: -8rem !important; } .xs\:-mr-32 { margin-right: -8rem !important; } .xs\:-mb-32 { margin-bottom: -8rem !important; } .xs\:-ml-32 { margin-left: -8rem !important; } .xs\:-mt-36 { margin-top: -9rem !important; } .xs\:-mr-36 { margin-right: -9rem !important; } .xs\:-mb-36 { margin-bottom: -9rem !important; } .xs\:-ml-36 { margin-left: -9rem !important; } .xs\:-mt-40 { margin-top: -10rem !important; } .xs\:-mr-40 { margin-right: -10rem !important; } .xs\:-mb-40 { margin-bottom: -10rem !important; } .xs\:-ml-40 { margin-left: -10rem !important; } .xs\:-mt-48 { margin-top: -12rem !important; } .xs\:-mr-48 { margin-right: -12rem !important; } .xs\:-mb-48 { margin-bottom: -12rem !important; } .xs\:-ml-48 { margin-left: -12rem !important; } .xs\:-mt-56 { margin-top: -14rem !important; } .xs\:-mr-56 { margin-right: -14rem !important; } .xs\:-mb-56 { margin-bottom: -14rem !important; } .xs\:-ml-56 { margin-left: -14rem !important; } .xs\:-mt-64 { margin-top: -16rem !important; } .xs\:-mr-64 { margin-right: -16rem !important; } .xs\:-mb-64 { margin-bottom: -16rem !important; } .xs\:-ml-64 { margin-left: -16rem !important; } .xs\:-mt-px { margin-top: -1px !important; } .xs\:-mr-px { margin-right: -1px !important; } .xs\:-mb-px { margin-bottom: -1px !important; } .xs\:-ml-px { margin-left: -1px !important; } .xs\:-mt-2px { margin-top: -2px !important; } .xs\:-mr-2px { margin-right: -2px !important; } .xs\:-mb-2px { margin-bottom: -2px !important; } .xs\:-ml-2px { margin-left: -2px !important; } .xs\:max-h-0 { max-height: 0 !important; } .xs\:max-h-1 { max-height: 0.25rem !important; } .xs\:max-h-2 { max-height: 0.5rem !important; } .xs\:max-h-3 { max-height: 0.75rem !important; } .xs\:max-h-4 { max-height: 1rem !important; } .xs\:max-h-5 { max-height: 1.25rem !important; } .xs\:max-h-6 { max-height: 1.5rem !important; } .xs\:max-h-8 { max-height: 2rem !important; } .xs\:max-h-10 { max-height: 2.5rem !important; } .xs\:max-h-12 { max-height: 3rem !important; } .xs\:max-h-14 { max-height: 3.5rem !important; } .xs\:max-h-16 { max-height: 4rem !important; } .xs\:max-h-18 { max-height: 4.5rem !important; } .xs\:max-h-20 { max-height: 5rem !important; } .xs\:max-h-22 { max-height: 5.5rem !important; } .xs\:max-h-24 { max-height: 6rem !important; } .xs\:max-h-26 { max-height: 6.5rem !important; } .xs\:max-h-28 { max-height: 7rem !important; } .xs\:max-h-30 { max-height: 7.5rem !important; } .xs\:max-h-32 { max-height: 8rem !important; } .xs\:max-h-36 { max-height: 9rem !important; } .xs\:max-h-40 { max-height: 10rem !important; } .xs\:max-h-48 { max-height: 12rem !important; } .xs\:max-h-50 { max-height: 12.5rem !important; } .xs\:max-h-56 { max-height: 14rem !important; } .xs\:max-h-60 { max-height: 15rem !important; } .xs\:max-h-64 { max-height: 16rem !important; } .xs\:max-h-80 { max-height: 20rem !important; } .xs\:max-h-90 { max-height: 24rem !important; } .xs\:max-h-100 { max-height: 25rem !important; } .xs\:max-h-120 { max-height: 30rem !important; } .xs\:max-h-128 { max-height: 32rem !important; } .xs\:max-h-140 { max-height: 35rem !important; } .xs\:max-h-160 { max-height: 40rem !important; } .xs\:max-h-180 { max-height: 45rem !important; } .xs\:max-h-192 { max-height: 48rem !important; } .xs\:max-h-200 { max-height: 50rem !important; } .xs\:max-h-240 { max-height: 60rem !important; } .xs\:max-h-256 { max-height: 64rem !important; } .xs\:max-h-280 { max-height: 70rem !important; } .xs\:max-h-320 { max-height: 80rem !important; } .xs\:max-h-360 { max-height: 90rem !important; } .xs\:max-h-400 { max-height: 100rem !important; } .xs\:max-h-480 { max-height: 120rem !important; } .xs\:max-h-full { max-height: 100% !important; } .xs\:max-h-screen { max-height: 100vh !important; } .xs\:max-h-none { max-height: none !important; } .xs\:max-h-px { max-height: 1px !important; } .xs\:max-h-2px { max-height: 2px !important; } .xs\:max-h-1\/2 { max-height: 50% !important; } .xs\:max-h-1\/3 { max-height: 33.33333% !important; } .xs\:max-h-2\/3 { max-height: 66.66667% !important; } .xs\:max-h-1\/4 { max-height: 25% !important; } .xs\:max-h-2\/4 { max-height: 50% !important; } .xs\:max-h-3\/4 { max-height: 75% !important; } .xs\:max-h-1\/5 { max-height: 20% !important; } .xs\:max-h-2\/5 { max-height: 40% !important; } .xs\:max-h-3\/5 { max-height: 60% !important; } .xs\:max-h-4\/5 { max-height: 80% !important; } .xs\:max-h-1\/12 { max-height: 8.33333% !important; } .xs\:max-h-2\/12 { max-height: 16.66667% !important; } .xs\:max-h-3\/12 { max-height: 25% !important; } .xs\:max-h-4\/12 { max-height: 33.33333% !important; } .xs\:max-h-5\/12 { max-height: 41.66667% !important; } .xs\:max-h-6\/12 { max-height: 50% !important; } .xs\:max-h-7\/12 { max-height: 58.33333% !important; } .xs\:max-h-8\/12 { max-height: 66.66667% !important; } .xs\:max-h-9\/12 { max-height: 75% !important; } .xs\:max-h-10\/12 { max-height: 83.33333% !important; } .xs\:max-h-11\/12 { max-height: 91.66667% !important; } .xs\:max-w-0 { max-width: 0 !important; } .xs\:max-w-1 { max-width: 0.25rem !important; } .xs\:max-w-2 { max-width: 0.5rem !important; } .xs\:max-w-3 { max-width: 0.75rem !important; } .xs\:max-w-4 { max-width: 1rem !important; } .xs\:max-w-5 { max-width: 1.25rem !important; } .xs\:max-w-6 { max-width: 1.5rem !important; } .xs\:max-w-8 { max-width: 2rem !important; } .xs\:max-w-10 { max-width: 2.5rem !important; } .xs\:max-w-12 { max-width: 3rem !important; } .xs\:max-w-14 { max-width: 3.5rem !important; } .xs\:max-w-16 { max-width: 4rem !important; } .xs\:max-w-18 { max-width: 4.5rem !important; } .xs\:max-w-20 { max-width: 5rem !important; } .xs\:max-w-22 { max-width: 5.5rem !important; } .xs\:max-w-24 { max-width: 6rem !important; } .xs\:max-w-26 { max-width: 6.5rem !important; } .xs\:max-w-28 { max-width: 7rem !important; } .xs\:max-w-30 { max-width: 7.5rem !important; } .xs\:max-w-32 { max-width: 8rem !important; } .xs\:max-w-36 { max-width: 9rem !important; } .xs\:max-w-40 { max-width: 10rem !important; } .xs\:max-w-48 { max-width: 12rem !important; } .xs\:max-w-50 { max-width: 12.5rem !important; } .xs\:max-w-56 { max-width: 14rem !important; } .xs\:max-w-60 { max-width: 15rem !important; } .xs\:max-w-64 { max-width: 16rem !important; } .xs\:max-w-80 { max-width: 20rem !important; } .xs\:max-w-90 { max-width: 24rem !important; } .xs\:max-w-100 { max-width: 25rem !important; } .xs\:max-w-120 { max-width: 30rem !important; } .xs\:max-w-128 { max-width: 32rem !important; } .xs\:max-w-140 { max-width: 35rem !important; } .xs\:max-w-160 { max-width: 40rem !important; } .xs\:max-w-180 { max-width: 45rem !important; } .xs\:max-w-192 { max-width: 48rem !important; } .xs\:max-w-200 { max-width: 50rem !important; } .xs\:max-w-240 { max-width: 60rem !important; } .xs\:max-w-256 { max-width: 64rem !important; } .xs\:max-w-280 { max-width: 70rem !important; } .xs\:max-w-320 { max-width: 80rem !important; } .xs\:max-w-360 { max-width: 90rem !important; } .xs\:max-w-400 { max-width: 100rem !important; } .xs\:max-w-480 { max-width: 120rem !important; } .xs\:max-w-none { max-width: none !important; } .xs\:max-w-xs { max-width: 20rem !important; } .xs\:max-w-sm { max-width: 24rem !important; } .xs\:max-w-md { max-width: 28rem !important; } .xs\:max-w-lg { max-width: 32rem !important; } .xs\:max-w-xl { max-width: 36rem !important; } .xs\:max-w-2xl { max-width: 42rem !important; } .xs\:max-w-3xl { max-width: 48rem !important; } .xs\:max-w-4xl { max-width: 56rem !important; } .xs\:max-w-5xl { max-width: 64rem !important; } .xs\:max-w-6xl { max-width: 72rem !important; } .xs\:max-w-full { max-width: 100% !important; } .xs\:max-w-screen { max-width: 100vw !important; } .xs\:max-w-px { max-width: 1px !important; } .xs\:max-w-2px { max-width: 2px !important; } .xs\:max-w-1\/2 { max-width: 50% !important; } .xs\:max-w-1\/3 { max-width: 33.33333% !important; } .xs\:max-w-2\/3 { max-width: 66.66667% !important; } .xs\:max-w-1\/4 { max-width: 25% !important; } .xs\:max-w-2\/4 { max-width: 50% !important; } .xs\:max-w-3\/4 { max-width: 75% !important; } .xs\:max-w-1\/5 { max-width: 20% !important; } .xs\:max-w-2\/5 { max-width: 40% !important; } .xs\:max-w-3\/5 { max-width: 60% !important; } .xs\:max-w-4\/5 { max-width: 80% !important; } .xs\:max-w-1\/12 { max-width: 8.33333% !important; } .xs\:max-w-2\/12 { max-width: 16.66667% !important; } .xs\:max-w-3\/12 { max-width: 25% !important; } .xs\:max-w-4\/12 { max-width: 33.33333% !important; } .xs\:max-w-5\/12 { max-width: 41.66667% !important; } .xs\:max-w-6\/12 { max-width: 50% !important; } .xs\:max-w-7\/12 { max-width: 58.33333% !important; } .xs\:max-w-8\/12 { max-width: 66.66667% !important; } .xs\:max-w-9\/12 { max-width: 75% !important; } .xs\:max-w-10\/12 { max-width: 83.33333% !important; } .xs\:max-w-11\/12 { max-width: 91.66667% !important; } .xs\:min-h-0 { min-height: 0 !important; } .xs\:min-h-1 { min-height: 0.25rem !important; } .xs\:min-h-2 { min-height: 0.5rem !important; } .xs\:min-h-3 { min-height: 0.75rem !important; } .xs\:min-h-4 { min-height: 1rem !important; } .xs\:min-h-5 { min-height: 1.25rem !important; } .xs\:min-h-6 { min-height: 1.5rem !important; } .xs\:min-h-8 { min-height: 2rem !important; } .xs\:min-h-10 { min-height: 2.5rem !important; } .xs\:min-h-12 { min-height: 3rem !important; } .xs\:min-h-14 { min-height: 3.5rem !important; } .xs\:min-h-16 { min-height: 4rem !important; } .xs\:min-h-18 { min-height: 4.5rem !important; } .xs\:min-h-20 { min-height: 5rem !important; } .xs\:min-h-22 { min-height: 5.5rem !important; } .xs\:min-h-24 { min-height: 6rem !important; } .xs\:min-h-26 { min-height: 6.5rem !important; } .xs\:min-h-28 { min-height: 7rem !important; } .xs\:min-h-30 { min-height: 7.5rem !important; } .xs\:min-h-32 { min-height: 8rem !important; } .xs\:min-h-36 { min-height: 9rem !important; } .xs\:min-h-40 { min-height: 10rem !important; } .xs\:min-h-48 { min-height: 12rem !important; } .xs\:min-h-50 { min-height: 12.5rem !important; } .xs\:min-h-56 { min-height: 14rem !important; } .xs\:min-h-60 { min-height: 15rem !important; } .xs\:min-h-64 { min-height: 16rem !important; } .xs\:min-h-80 { min-height: 20rem !important; } .xs\:min-h-90 { min-height: 24rem !important; } .xs\:min-h-100 { min-height: 25rem !important; } .xs\:min-h-120 { min-height: 30rem !important; } .xs\:min-h-128 { min-height: 32rem !important; } .xs\:min-h-140 { min-height: 35rem !important; } .xs\:min-h-160 { min-height: 40rem !important; } .xs\:min-h-180 { min-height: 45rem !important; } .xs\:min-h-192 { min-height: 48rem !important; } .xs\:min-h-200 { min-height: 50rem !important; } .xs\:min-h-240 { min-height: 60rem !important; } .xs\:min-h-256 { min-height: 64rem !important; } .xs\:min-h-280 { min-height: 70rem !important; } .xs\:min-h-320 { min-height: 80rem !important; } .xs\:min-h-360 { min-height: 90rem !important; } .xs\:min-h-400 { min-height: 100rem !important; } .xs\:min-h-480 { min-height: 120rem !important; } .xs\:min-h-full { min-height: 100% !important; } .xs\:min-h-screen { min-height: 100vh !important; } .xs\:min-h-px { min-height: 1px !important; } .xs\:min-h-2px { min-height: 2px !important; } .xs\:min-h-1\/2 { min-height: 50% !important; } .xs\:min-h-1\/3 { min-height: 33.33333% !important; } .xs\:min-h-2\/3 { min-height: 66.66667% !important; } .xs\:min-h-1\/4 { min-height: 25% !important; } .xs\:min-h-2\/4 { min-height: 50% !important; } .xs\:min-h-3\/4 { min-height: 75% !important; } .xs\:min-h-1\/5 { min-height: 20% !important; } .xs\:min-h-2\/5 { min-height: 40% !important; } .xs\:min-h-3\/5 { min-height: 60% !important; } .xs\:min-h-4\/5 { min-height: 80% !important; } .xs\:min-h-1\/12 { min-height: 8.33333% !important; } .xs\:min-h-2\/12 { min-height: 16.66667% !important; } .xs\:min-h-3\/12 { min-height: 25% !important; } .xs\:min-h-4\/12 { min-height: 33.33333% !important; } .xs\:min-h-5\/12 { min-height: 41.66667% !important; } .xs\:min-h-6\/12 { min-height: 50% !important; } .xs\:min-h-7\/12 { min-height: 58.33333% !important; } .xs\:min-h-8\/12 { min-height: 66.66667% !important; } .xs\:min-h-9\/12 { min-height: 75% !important; } .xs\:min-h-10\/12 { min-height: 83.33333% !important; } .xs\:min-h-11\/12 { min-height: 91.66667% !important; } .xs\:min-w-0 { min-width: 0 !important; } .xs\:min-w-1 { min-width: 0.25rem !important; } .xs\:min-w-2 { min-width: 0.5rem !important; } .xs\:min-w-3 { min-width: 0.75rem !important; } .xs\:min-w-4 { min-width: 1rem !important; } .xs\:min-w-5 { min-width: 1.25rem !important; } .xs\:min-w-6 { min-width: 1.5rem !important; } .xs\:min-w-8 { min-width: 2rem !important; } .xs\:min-w-10 { min-width: 2.5rem !important; } .xs\:min-w-12 { min-width: 3rem !important; } .xs\:min-w-14 { min-width: 3.5rem !important; } .xs\:min-w-16 { min-width: 4rem !important; } .xs\:min-w-18 { min-width: 4.5rem !important; } .xs\:min-w-20 { min-width: 5rem !important; } .xs\:min-w-22 { min-width: 5.5rem !important; } .xs\:min-w-24 { min-width: 6rem !important; } .xs\:min-w-26 { min-width: 6.5rem !important; } .xs\:min-w-28 { min-width: 7rem !important; } .xs\:min-w-30 { min-width: 7.5rem !important; } .xs\:min-w-32 { min-width: 8rem !important; } .xs\:min-w-36 { min-width: 9rem !important; } .xs\:min-w-40 { min-width: 10rem !important; } .xs\:min-w-48 { min-width: 12rem !important; } .xs\:min-w-50 { min-width: 12.5rem !important; } .xs\:min-w-56 { min-width: 14rem !important; } .xs\:min-w-60 { min-width: 15rem !important; } .xs\:min-w-64 { min-width: 16rem !important; } .xs\:min-w-80 { min-width: 20rem !important; } .xs\:min-w-90 { min-width: 24rem !important; } .xs\:min-w-100 { min-width: 25rem !important; } .xs\:min-w-120 { min-width: 30rem !important; } .xs\:min-w-128 { min-width: 32rem !important; } .xs\:min-w-140 { min-width: 35rem !important; } .xs\:min-w-160 { min-width: 40rem !important; } .xs\:min-w-180 { min-width: 45rem !important; } .xs\:min-w-192 { min-width: 48rem !important; } .xs\:min-w-200 { min-width: 50rem !important; } .xs\:min-w-240 { min-width: 60rem !important; } .xs\:min-w-256 { min-width: 64rem !important; } .xs\:min-w-280 { min-width: 70rem !important; } .xs\:min-w-320 { min-width: 80rem !important; } .xs\:min-w-360 { min-width: 90rem !important; } .xs\:min-w-400 { min-width: 100rem !important; } .xs\:min-w-480 { min-width: 120rem !important; } .xs\:min-w-full { min-width: 100% !important; } .xs\:min-w-screen { min-width: 100vw !important; } .xs\:min-w-px { min-width: 1px !important; } .xs\:min-w-2px { min-width: 2px !important; } .xs\:min-w-1\/2 { min-width: 50% !important; } .xs\:min-w-1\/3 { min-width: 33.33333% !important; } .xs\:min-w-2\/3 { min-width: 66.66667% !important; } .xs\:min-w-1\/4 { min-width: 25% !important; } .xs\:min-w-2\/4 { min-width: 50% !important; } .xs\:min-w-3\/4 { min-width: 75% !important; } .xs\:min-w-1\/5 { min-width: 20% !important; } .xs\:min-w-2\/5 { min-width: 40% !important; } .xs\:min-w-3\/5 { min-width: 60% !important; } .xs\:min-w-4\/5 { min-width: 80% !important; } .xs\:min-w-1\/12 { min-width: 8.33333% !important; } .xs\:min-w-2\/12 { min-width: 16.66667% !important; } .xs\:min-w-3\/12 { min-width: 25% !important; } .xs\:min-w-4\/12 { min-width: 33.33333% !important; } .xs\:min-w-5\/12 { min-width: 41.66667% !important; } .xs\:min-w-6\/12 { min-width: 50% !important; } .xs\:min-w-7\/12 { min-width: 58.33333% !important; } .xs\:min-w-8\/12 { min-width: 66.66667% !important; } .xs\:min-w-9\/12 { min-width: 75% !important; } .xs\:min-w-10\/12 { min-width: 83.33333% !important; } .xs\:min-w-11\/12 { min-width: 91.66667% !important; } .xs\:object-contain { -o-object-fit: contain !important; object-fit: contain !important; } .xs\:object-cover { -o-object-fit: cover !important; object-fit: cover !important; } .xs\:object-fill { -o-object-fit: fill !important; object-fit: fill !important; } .xs\:object-none { -o-object-fit: none !important; object-fit: none !important; } .xs\:object-scale-down { -o-object-fit: scale-down !important; object-fit: scale-down !important; } .xs\:object-bottom { -o-object-position: bottom !important; object-position: bottom !important; } .xs\:object-center { -o-object-position: center !important; object-position: center !important; } .xs\:object-left { -o-object-position: left !important; object-position: left !important; } .xs\:object-left-bottom { -o-object-position: left bottom !important; object-position: left bottom !important; } .xs\:object-left-top { -o-object-position: left top !important; object-position: left top !important; } .xs\:object-right { -o-object-position: right !important; object-position: right !important; } .xs\:object-right-bottom { -o-object-position: right bottom !important; object-position: right bottom !important; } .xs\:object-right-top { -o-object-position: right top !important; object-position: right top !important; } .xs\:object-top { -o-object-position: top !important; object-position: top !important; } .xs\:opacity-0 { opacity: 0 !important; } .xs\:opacity-12 { opacity: 0.12 !important; } .xs\:opacity-25 { opacity: 0.25 !important; } .xs\:opacity-38 { opacity: 0.38 !important; } .xs\:opacity-50 { opacity: 0.5 !important; } .xs\:opacity-54 { opacity: 0.54 !important; } .xs\:opacity-70 { opacity: 0.70 !important; } .xs\:opacity-75 { opacity: 0.75 !important; } .xs\:opacity-84 { opacity: 0.84 !important; } .xs\:opacity-100 { opacity: 1 !important; } .xs\:hover\:opacity-0:hover { opacity: 0 !important; } .xs\:hover\:opacity-12:hover { opacity: 0.12 !important; } .xs\:hover\:opacity-25:hover { opacity: 0.25 !important; } .xs\:hover\:opacity-38:hover { opacity: 0.38 !important; } .xs\:hover\:opacity-50:hover { opacity: 0.5 !important; } .xs\:hover\:opacity-54:hover { opacity: 0.54 !important; } .xs\:hover\:opacity-70:hover { opacity: 0.70 !important; } .xs\:hover\:opacity-75:hover { opacity: 0.75 !important; } .xs\:hover\:opacity-84:hover { opacity: 0.84 !important; } .xs\:hover\:opacity-100:hover { opacity: 1 !important; } .xs\:focus\:opacity-0:focus { opacity: 0 !important; } .xs\:focus\:opacity-12:focus { opacity: 0.12 !important; } .xs\:focus\:opacity-25:focus { opacity: 0.25 !important; } .xs\:focus\:opacity-38:focus { opacity: 0.38 !important; } .xs\:focus\:opacity-50:focus { opacity: 0.5 !important; } .xs\:focus\:opacity-54:focus { opacity: 0.54 !important; } .xs\:focus\:opacity-70:focus { opacity: 0.70 !important; } .xs\:focus\:opacity-75:focus { opacity: 0.75 !important; } .xs\:focus\:opacity-84:focus { opacity: 0.84 !important; } .xs\:focus\:opacity-100:focus { opacity: 1 !important; } .xs\:outline-none { outline: 0 !important; } .xs\:focus\:outline-none:focus { outline: 0 !important; } .xs\:overflow-auto { overflow: auto !important; } .xs\:overflow-hidden { overflow: hidden !important; } .xs\:overflow-visible { overflow: visible !important; } .xs\:overflow-scroll { overflow: scroll !important; } .xs\:overflow-x-auto { overflow-x: auto !important; } .xs\:overflow-y-auto { overflow-y: auto !important; } .xs\:overflow-x-hidden { overflow-x: hidden !important; } .xs\:overflow-y-hidden { overflow-y: hidden !important; } .xs\:overflow-x-visible { overflow-x: visible !important; } .xs\:overflow-y-visible { overflow-y: visible !important; } .xs\:overflow-x-scroll { overflow-x: scroll !important; } .xs\:overflow-y-scroll { overflow-y: scroll !important; } .xs\:scrolling-touch { -webkit-overflow-scrolling: touch !important; } .xs\:scrolling-auto { -webkit-overflow-scrolling: auto !important; } .xs\:p-0 { padding: 0 !important; } .xs\:p-1 { padding: 0.25rem !important; } .xs\:p-2 { padding: 0.5rem !important; } .xs\:p-3 { padding: 0.75rem !important; } .xs\:p-4 { padding: 1rem !important; } .xs\:p-5 { padding: 1.25rem !important; } .xs\:p-6 { padding: 1.5rem !important; } .xs\:p-8 { padding: 2rem !important; } .xs\:p-10 { padding: 2.5rem !important; } .xs\:p-12 { padding: 3rem !important; } .xs\:p-14 { padding: 3.5rem !important; } .xs\:p-16 { padding: 4rem !important; } .xs\:p-18 { padding: 4.5rem !important; } .xs\:p-20 { padding: 5rem !important; } .xs\:p-22 { padding: 5.5rem !important; } .xs\:p-24 { padding: 6rem !important; } .xs\:p-26 { padding: 6.5rem !important; } .xs\:p-28 { padding: 7rem !important; } .xs\:p-30 { padding: 7.5rem !important; } .xs\:p-32 { padding: 8rem !important; } .xs\:p-36 { padding: 9rem !important; } .xs\:p-40 { padding: 10rem !important; } .xs\:p-48 { padding: 12rem !important; } .xs\:p-56 { padding: 14rem !important; } .xs\:p-64 { padding: 16rem !important; } .xs\:p-px { padding: 1px !important; } .xs\:p-2px { padding: 2px !important; } .xs\:py-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .xs\:px-0 { padding-left: 0 !important; padding-right: 0 !important; } .xs\:py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .xs\:px-1 { padding-left: 0.25rem !important; padding-right: 0.25rem !important; } .xs\:py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .xs\:px-2 { padding-left: 0.5rem !important; padding-right: 0.5rem !important; } .xs\:py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .xs\:px-3 { padding-left: 0.75rem !important; padding-right: 0.75rem !important; } .xs\:py-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .xs\:px-4 { padding-left: 1rem !important; padding-right: 1rem !important; } .xs\:py-5 { padding-top: 1.25rem !important; padding-bottom: 1.25rem !important; } .xs\:px-5 { padding-left: 1.25rem !important; padding-right: 1.25rem !important; } .xs\:py-6 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .xs\:px-6 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } .xs\:py-8 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .xs\:px-8 { padding-left: 2rem !important; padding-right: 2rem !important; } .xs\:py-10 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .xs\:px-10 { padding-left: 2.5rem !important; padding-right: 2.5rem !important; } .xs\:py-12 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .xs\:px-12 { padding-left: 3rem !important; padding-right: 3rem !important; } .xs\:py-14 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .xs\:px-14 { padding-left: 3.5rem !important; padding-right: 3.5rem !important; } .xs\:py-16 { padding-top: 4rem !important; padding-bottom: 4rem !important; } .xs\:px-16 { padding-left: 4rem !important; padding-right: 4rem !important; } .xs\:py-18 { padding-top: 4.5rem !important; padding-bottom: 4.5rem !important; } .xs\:px-18 { padding-left: 4.5rem !important; padding-right: 4.5rem !important; } .xs\:py-20 { padding-top: 5rem !important; padding-bottom: 5rem !important; } .xs\:px-20 { padding-left: 5rem !important; padding-right: 5rem !important; } .xs\:py-22 { padding-top: 5.5rem !important; padding-bottom: 5.5rem !important; } .xs\:px-22 { padding-left: 5.5rem !important; padding-right: 5.5rem !important; } .xs\:py-24 { padding-top: 6rem !important; padding-bottom: 6rem !important; } .xs\:px-24 { padding-left: 6rem !important; padding-right: 6rem !important; } .xs\:py-26 { padding-top: 6.5rem !important; padding-bottom: 6.5rem !important; } .xs\:px-26 { padding-left: 6.5rem !important; padding-right: 6.5rem !important; } .xs\:py-28 { padding-top: 7rem !important; padding-bottom: 7rem !important; } .xs\:px-28 { padding-left: 7rem !important; padding-right: 7rem !important; } .xs\:py-30 { padding-top: 7.5rem !important; padding-bottom: 7.5rem !important; } .xs\:px-30 { padding-left: 7.5rem !important; padding-right: 7.5rem !important; } .xs\:py-32 { padding-top: 8rem !important; padding-bottom: 8rem !important; } .xs\:px-32 { padding-left: 8rem !important; padding-right: 8rem !important; } .xs\:py-36 { padding-top: 9rem !important; padding-bottom: 9rem !important; } .xs\:px-36 { padding-left: 9rem !important; padding-right: 9rem !important; } .xs\:py-40 { padding-top: 10rem !important; padding-bottom: 10rem !important; } .xs\:px-40 { padding-left: 10rem !important; padding-right: 10rem !important; } .xs\:py-48 { padding-top: 12rem !important; padding-bottom: 12rem !important; } .xs\:px-48 { padding-left: 12rem !important; padding-right: 12rem !important; } .xs\:py-56 { padding-top: 14rem !important; padding-bottom: 14rem !important; } .xs\:px-56 { padding-left: 14rem !important; padding-right: 14rem !important; } .xs\:py-64 { padding-top: 16rem !important; padding-bottom: 16rem !important; } .xs\:px-64 { padding-left: 16rem !important; padding-right: 16rem !important; } .xs\:py-px { padding-top: 1px !important; padding-bottom: 1px !important; } .xs\:px-px { padding-left: 1px !important; padding-right: 1px !important; } .xs\:py-2px { padding-top: 2px !important; padding-bottom: 2px !important; } .xs\:px-2px { padding-left: 2px !important; padding-right: 2px !important; } .xs\:pt-0 { padding-top: 0 !important; } .xs\:pr-0 { padding-right: 0 !important; } .xs\:pb-0 { padding-bottom: 0 !important; } .xs\:pl-0 { padding-left: 0 !important; } .xs\:pt-1 { padding-top: 0.25rem !important; } .xs\:pr-1 { padding-right: 0.25rem !important; } .xs\:pb-1 { padding-bottom: 0.25rem !important; } .xs\:pl-1 { padding-left: 0.25rem !important; } .xs\:pt-2 { padding-top: 0.5rem !important; } .xs\:pr-2 { padding-right: 0.5rem !important; } .xs\:pb-2 { padding-bottom: 0.5rem !important; } .xs\:pl-2 { padding-left: 0.5rem !important; } .xs\:pt-3 { padding-top: 0.75rem !important; } .xs\:pr-3 { padding-right: 0.75rem !important; } .xs\:pb-3 { padding-bottom: 0.75rem !important; } .xs\:pl-3 { padding-left: 0.75rem !important; } .xs\:pt-4 { padding-top: 1rem !important; } .xs\:pr-4 { padding-right: 1rem !important; } .xs\:pb-4 { padding-bottom: 1rem !important; } .xs\:pl-4 { padding-left: 1rem !important; } .xs\:pt-5 { padding-top: 1.25rem !important; } .xs\:pr-5 { padding-right: 1.25rem !important; } .xs\:pb-5 { padding-bottom: 1.25rem !important; } .xs\:pl-5 { padding-left: 1.25rem !important; } .xs\:pt-6 { padding-top: 1.5rem !important; } .xs\:pr-6 { padding-right: 1.5rem !important; } .xs\:pb-6 { padding-bottom: 1.5rem !important; } .xs\:pl-6 { padding-left: 1.5rem !important; } .xs\:pt-8 { padding-top: 2rem !important; } .xs\:pr-8 { padding-right: 2rem !important; } .xs\:pb-8 { padding-bottom: 2rem !important; } .xs\:pl-8 { padding-left: 2rem !important; } .xs\:pt-10 { padding-top: 2.5rem !important; } .xs\:pr-10 { padding-right: 2.5rem !important; } .xs\:pb-10 { padding-bottom: 2.5rem !important; } .xs\:pl-10 { padding-left: 2.5rem !important; } .xs\:pt-12 { padding-top: 3rem !important; } .xs\:pr-12 { padding-right: 3rem !important; } .xs\:pb-12 { padding-bottom: 3rem !important; } .xs\:pl-12 { padding-left: 3rem !important; } .xs\:pt-14 { padding-top: 3.5rem !important; } .xs\:pr-14 { padding-right: 3.5rem !important; } .xs\:pb-14 { padding-bottom: 3.5rem !important; } .xs\:pl-14 { padding-left: 3.5rem !important; } .xs\:pt-16 { padding-top: 4rem !important; } .xs\:pr-16 { padding-right: 4rem !important; } .xs\:pb-16 { padding-bottom: 4rem !important; } .xs\:pl-16 { padding-left: 4rem !important; } .xs\:pt-18 { padding-top: 4.5rem !important; } .xs\:pr-18 { padding-right: 4.5rem !important; } .xs\:pb-18 { padding-bottom: 4.5rem !important; } .xs\:pl-18 { padding-left: 4.5rem !important; } .xs\:pt-20 { padding-top: 5rem !important; } .xs\:pr-20 { padding-right: 5rem !important; } .xs\:pb-20 { padding-bottom: 5rem !important; } .xs\:pl-20 { padding-left: 5rem !important; } .xs\:pt-22 { padding-top: 5.5rem !important; } .xs\:pr-22 { padding-right: 5.5rem !important; } .xs\:pb-22 { padding-bottom: 5.5rem !important; } .xs\:pl-22 { padding-left: 5.5rem !important; } .xs\:pt-24 { padding-top: 6rem !important; } .xs\:pr-24 { padding-right: 6rem !important; } .xs\:pb-24 { padding-bottom: 6rem !important; } .xs\:pl-24 { padding-left: 6rem !important; } .xs\:pt-26 { padding-top: 6.5rem !important; } .xs\:pr-26 { padding-right: 6.5rem !important; } .xs\:pb-26 { padding-bottom: 6.5rem !important; } .xs\:pl-26 { padding-left: 6.5rem !important; } .xs\:pt-28 { padding-top: 7rem !important; } .xs\:pr-28 { padding-right: 7rem !important; } .xs\:pb-28 { padding-bottom: 7rem !important; } .xs\:pl-28 { padding-left: 7rem !important; } .xs\:pt-30 { padding-top: 7.5rem !important; } .xs\:pr-30 { padding-right: 7.5rem !important; } .xs\:pb-30 { padding-bottom: 7.5rem !important; } .xs\:pl-30 { padding-left: 7.5rem !important; } .xs\:pt-32 { padding-top: 8rem !important; } .xs\:pr-32 { padding-right: 8rem !important; } .xs\:pb-32 { padding-bottom: 8rem !important; } .xs\:pl-32 { padding-left: 8rem !important; } .xs\:pt-36 { padding-top: 9rem !important; } .xs\:pr-36 { padding-right: 9rem !important; } .xs\:pb-36 { padding-bottom: 9rem !important; } .xs\:pl-36 { padding-left: 9rem !important; } .xs\:pt-40 { padding-top: 10rem !important; } .xs\:pr-40 { padding-right: 10rem !important; } .xs\:pb-40 { padding-bottom: 10rem !important; } .xs\:pl-40 { padding-left: 10rem !important; } .xs\:pt-48 { padding-top: 12rem !important; } .xs\:pr-48 { padding-right: 12rem !important; } .xs\:pb-48 { padding-bottom: 12rem !important; } .xs\:pl-48 { padding-left: 12rem !important; } .xs\:pt-56 { padding-top: 14rem !important; } .xs\:pr-56 { padding-right: 14rem !important; } .xs\:pb-56 { padding-bottom: 14rem !important; } .xs\:pl-56 { padding-left: 14rem !important; } .xs\:pt-64 { padding-top: 16rem !important; } .xs\:pr-64 { padding-right: 16rem !important; } .xs\:pb-64 { padding-bottom: 16rem !important; } .xs\:pl-64 { padding-left: 16rem !important; } .xs\:pt-px { padding-top: 1px !important; } .xs\:pr-px { padding-right: 1px !important; } .xs\:pb-px { padding-bottom: 1px !important; } .xs\:pl-px { padding-left: 1px !important; } .xs\:pt-2px { padding-top: 2px !important; } .xs\:pr-2px { padding-right: 2px !important; } .xs\:pb-2px { padding-bottom: 2px !important; } .xs\:pl-2px { padding-left: 2px !important; } .xs\:placeholder-opacity-0::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .xs\:placeholder-opacity-0::-moz-placeholder { --placeholder-opacity: 0 !important; } .xs\:placeholder-opacity-0::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .xs\:placeholder-opacity-0::placeholder { --placeholder-opacity: 0 !important; } .xs\:placeholder-opacity-12::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .xs\:placeholder-opacity-12::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .xs\:placeholder-opacity-12::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .xs\:placeholder-opacity-12::placeholder { --placeholder-opacity: 0.12 !important; } .xs\:placeholder-opacity-25::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .xs\:placeholder-opacity-25::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .xs\:placeholder-opacity-25::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .xs\:placeholder-opacity-25::placeholder { --placeholder-opacity: 0.25 !important; } .xs\:placeholder-opacity-38::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .xs\:placeholder-opacity-38::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .xs\:placeholder-opacity-38::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .xs\:placeholder-opacity-38::placeholder { --placeholder-opacity: 0.38 !important; } .xs\:placeholder-opacity-50::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .xs\:placeholder-opacity-50::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .xs\:placeholder-opacity-50::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .xs\:placeholder-opacity-50::placeholder { --placeholder-opacity: 0.5 !important; } .xs\:placeholder-opacity-54::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .xs\:placeholder-opacity-54::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .xs\:placeholder-opacity-54::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .xs\:placeholder-opacity-54::placeholder { --placeholder-opacity: 0.54 !important; } .xs\:placeholder-opacity-70::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .xs\:placeholder-opacity-70::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .xs\:placeholder-opacity-70::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .xs\:placeholder-opacity-70::placeholder { --placeholder-opacity: 0.70 !important; } .xs\:placeholder-opacity-75::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .xs\:placeholder-opacity-75::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .xs\:placeholder-opacity-75::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .xs\:placeholder-opacity-75::placeholder { --placeholder-opacity: 0.75 !important; } .xs\:placeholder-opacity-84::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .xs\:placeholder-opacity-84::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .xs\:placeholder-opacity-84::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .xs\:placeholder-opacity-84::placeholder { --placeholder-opacity: 0.84 !important; } .xs\:placeholder-opacity-100::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .xs\:placeholder-opacity-100::-moz-placeholder { --placeholder-opacity: 1 !important; } .xs\:placeholder-opacity-100::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .xs\:placeholder-opacity-100::placeholder { --placeholder-opacity: 1 !important; } .xs\:focus\:placeholder-opacity-0:focus::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .xs\:focus\:placeholder-opacity-0:focus::-moz-placeholder { --placeholder-opacity: 0 !important; } .xs\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .xs\:focus\:placeholder-opacity-0:focus::placeholder { --placeholder-opacity: 0 !important; } .xs\:focus\:placeholder-opacity-12:focus::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .xs\:focus\:placeholder-opacity-12:focus::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .xs\:focus\:placeholder-opacity-12:focus::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .xs\:focus\:placeholder-opacity-12:focus::placeholder { --placeholder-opacity: 0.12 !important; } .xs\:focus\:placeholder-opacity-25:focus::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .xs\:focus\:placeholder-opacity-25:focus::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .xs\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .xs\:focus\:placeholder-opacity-25:focus::placeholder { --placeholder-opacity: 0.25 !important; } .xs\:focus\:placeholder-opacity-38:focus::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .xs\:focus\:placeholder-opacity-38:focus::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .xs\:focus\:placeholder-opacity-38:focus::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .xs\:focus\:placeholder-opacity-38:focus::placeholder { --placeholder-opacity: 0.38 !important; } .xs\:focus\:placeholder-opacity-50:focus::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .xs\:focus\:placeholder-opacity-50:focus::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .xs\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .xs\:focus\:placeholder-opacity-50:focus::placeholder { --placeholder-opacity: 0.5 !important; } .xs\:focus\:placeholder-opacity-54:focus::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .xs\:focus\:placeholder-opacity-54:focus::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .xs\:focus\:placeholder-opacity-54:focus::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .xs\:focus\:placeholder-opacity-54:focus::placeholder { --placeholder-opacity: 0.54 !important; } .xs\:focus\:placeholder-opacity-70:focus::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .xs\:focus\:placeholder-opacity-70:focus::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .xs\:focus\:placeholder-opacity-70:focus::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .xs\:focus\:placeholder-opacity-70:focus::placeholder { --placeholder-opacity: 0.70 !important; } .xs\:focus\:placeholder-opacity-75:focus::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .xs\:focus\:placeholder-opacity-75:focus::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .xs\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .xs\:focus\:placeholder-opacity-75:focus::placeholder { --placeholder-opacity: 0.75 !important; } .xs\:focus\:placeholder-opacity-84:focus::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .xs\:focus\:placeholder-opacity-84:focus::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .xs\:focus\:placeholder-opacity-84:focus::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .xs\:focus\:placeholder-opacity-84:focus::placeholder { --placeholder-opacity: 0.84 !important; } .xs\:focus\:placeholder-opacity-100:focus::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .xs\:focus\:placeholder-opacity-100:focus::-moz-placeholder { --placeholder-opacity: 1 !important; } .xs\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .xs\:focus\:placeholder-opacity-100:focus::placeholder { --placeholder-opacity: 1 !important; } .xs\:pointer-events-none { pointer-events: none !important; } .xs\:pointer-events-auto { pointer-events: auto !important; } .xs\:static { position: static !important; } .xs\:fixed { position: fixed !important; } .xs\:absolute { position: absolute !important; } .xs\:relative { position: relative !important; } .xs\:sticky { position: -webkit-sticky !important; position: sticky !important; } .xs\:inset-0 { top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; } .xs\:inset-auto { top: auto !important; right: auto !important; bottom: auto !important; left: auto !important; } .xs\:inset-y-0 { top: 0 !important; bottom: 0 !important; } .xs\:inset-x-0 { right: 0 !important; left: 0 !important; } .xs\:inset-y-auto { top: auto !important; bottom: auto !important; } .xs\:inset-x-auto { right: auto !important; left: auto !important; } .xs\:top-0 { top: 0 !important; } .xs\:right-0 { right: 0 !important; } .xs\:bottom-0 { bottom: 0 !important; } .xs\:left-0 { left: 0 !important; } .xs\:top-auto { top: auto !important; } .xs\:right-auto { right: auto !important; } .xs\:bottom-auto { bottom: auto !important; } .xs\:left-auto { left: auto !important; } .xs\:shadow-xs { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .xs\:shadow-sm { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .xs\:shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .xs\:shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .xs\:shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .xs\:shadow-xl { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .xs\:shadow-2xl { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .xs\:shadow-inner { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .xs\:shadow-outline { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .xs\:shadow-none { box-shadow: none !important; } .xs\:shadow-solid { box-shadow: 0 0 0 2px currentColor !important; } .xs\:hover\:shadow-xs:hover { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .xs\:hover\:shadow-sm:hover { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .xs\:hover\:shadow:hover { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .xs\:hover\:shadow-md:hover { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .xs\:hover\:shadow-lg:hover { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .xs\:hover\:shadow-xl:hover { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .xs\:hover\:shadow-2xl:hover { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .xs\:hover\:shadow-inner:hover { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .xs\:hover\:shadow-outline:hover { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .xs\:hover\:shadow-none:hover { box-shadow: none !important; } .xs\:hover\:shadow-solid:hover { box-shadow: 0 0 0 2px currentColor !important; } .xs\:focus\:shadow-xs:focus { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .xs\:focus\:shadow-sm:focus { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .xs\:focus\:shadow:focus { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .xs\:focus\:shadow-md:focus { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .xs\:focus\:shadow-lg:focus { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .xs\:focus\:shadow-xl:focus { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .xs\:focus\:shadow-2xl:focus { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .xs\:focus\:shadow-inner:focus { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .xs\:focus\:shadow-outline:focus { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .xs\:focus\:shadow-none:focus { box-shadow: none !important; } .xs\:focus\:shadow-solid:focus { box-shadow: 0 0 0 2px currentColor !important; } .xs\:fill-current { fill: currentColor !important; } .xs\:stroke-current { stroke: currentColor !important; } .xs\:stroke-0 { stroke-width: 0 !important; } .xs\:stroke-1 { stroke-width: 1 !important; } .xs\:stroke-2 { stroke-width: 2 !important; } .xs\:table-auto { table-layout: auto !important; } .xs\:table-fixed { table-layout: fixed !important; } .xs\:text-left { text-align: left !important; } .xs\:text-center { text-align: center !important; } .xs\:text-right { text-align: right !important; } .xs\:text-justify { text-align: justify !important; } .xs\:text-opacity-0 { --text-opacity: 0 !important; } .xs\:text-opacity-12 { --text-opacity: 0.12 !important; } .xs\:text-opacity-25 { --text-opacity: 0.25 !important; } .xs\:text-opacity-38 { --text-opacity: 0.38 !important; } .xs\:text-opacity-50 { --text-opacity: 0.5 !important; } .xs\:text-opacity-54 { --text-opacity: 0.54 !important; } .xs\:text-opacity-70 { --text-opacity: 0.70 !important; } .xs\:text-opacity-75 { --text-opacity: 0.75 !important; } .xs\:text-opacity-84 { --text-opacity: 0.84 !important; } .xs\:text-opacity-100 { --text-opacity: 1 !important; } .xs\:hover\:text-opacity-0:hover { --text-opacity: 0 !important; } .xs\:hover\:text-opacity-12:hover { --text-opacity: 0.12 !important; } .xs\:hover\:text-opacity-25:hover { --text-opacity: 0.25 !important; } .xs\:hover\:text-opacity-38:hover { --text-opacity: 0.38 !important; } .xs\:hover\:text-opacity-50:hover { --text-opacity: 0.5 !important; } .xs\:hover\:text-opacity-54:hover { --text-opacity: 0.54 !important; } .xs\:hover\:text-opacity-70:hover { --text-opacity: 0.70 !important; } .xs\:hover\:text-opacity-75:hover { --text-opacity: 0.75 !important; } .xs\:hover\:text-opacity-84:hover { --text-opacity: 0.84 !important; } .xs\:hover\:text-opacity-100:hover { --text-opacity: 1 !important; } .xs\:focus\:text-opacity-0:focus { --text-opacity: 0 !important; } .xs\:focus\:text-opacity-12:focus { --text-opacity: 0.12 !important; } .xs\:focus\:text-opacity-25:focus { --text-opacity: 0.25 !important; } .xs\:focus\:text-opacity-38:focus { --text-opacity: 0.38 !important; } .xs\:focus\:text-opacity-50:focus { --text-opacity: 0.5 !important; } .xs\:focus\:text-opacity-54:focus { --text-opacity: 0.54 !important; } .xs\:focus\:text-opacity-70:focus { --text-opacity: 0.70 !important; } .xs\:focus\:text-opacity-75:focus { --text-opacity: 0.75 !important; } .xs\:focus\:text-opacity-84:focus { --text-opacity: 0.84 !important; } .xs\:focus\:text-opacity-100:focus { --text-opacity: 1 !important; } .xs\:italic { font-style: italic !important; } .xs\:not-italic { font-style: normal !important; } .xs\:uppercase { text-transform: uppercase !important; } .xs\:lowercase { text-transform: lowercase !important; } .xs\:capitalize { text-transform: capitalize !important; } .xs\:normal-case { text-transform: none !important; } .xs\:underline { text-decoration: underline !important; } .xs\:line-through { text-decoration: line-through !important; } .xs\:no-underline { text-decoration: none !important; } .xs\:hover\:underline:hover { text-decoration: underline !important; } .xs\:hover\:line-through:hover { text-decoration: line-through !important; } .xs\:hover\:no-underline:hover { text-decoration: none !important; } .xs\:focus\:underline:focus { text-decoration: underline !important; } .xs\:focus\:line-through:focus { text-decoration: line-through !important; } .xs\:focus\:no-underline:focus { text-decoration: none !important; } .xs\:tracking-tighter { letter-spacing: -0.05em !important; } .xs\:tracking-tight { letter-spacing: -0.025em !important; } .xs\:tracking-normal { letter-spacing: 0 !important; } .xs\:tracking-wide { letter-spacing: 0.025em !important; } .xs\:tracking-wider { letter-spacing: 0.05em !important; } .xs\:tracking-widest { letter-spacing: 0.1em !important; } .xs\:select-none { -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important; } .xs\:select-text { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } .xs\:select-all { -webkit-user-select: all !important; -moz-user-select: all !important; -ms-user-select: all !important; user-select: all !important; } .xs\:select-auto { -webkit-user-select: auto !important; -moz-user-select: auto !important; -ms-user-select: auto !important; user-select: auto !important; } .xs\:align-baseline { vertical-align: baseline !important; } .xs\:align-top { vertical-align: top !important; } .xs\:align-middle { vertical-align: middle !important; } .xs\:align-bottom { vertical-align: bottom !important; } .xs\:align-text-top { vertical-align: text-top !important; } .xs\:align-text-bottom { vertical-align: text-bottom !important; } .xs\:visible { visibility: visible !important; } .xs\:invisible { visibility: hidden !important; } .xs\:whitespace-normal { white-space: normal !important; } .xs\:whitespace-no-wrap { white-space: nowrap !important; } .xs\:whitespace-pre { white-space: pre !important; } .xs\:whitespace-pre-line { white-space: pre-line !important; } .xs\:whitespace-pre-wrap { white-space: pre-wrap !important; } .xs\:break-normal { overflow-wrap: normal !important; word-break: normal !important; } .xs\:break-words { overflow-wrap: break-word !important; } .xs\:break-all { word-break: break-all !important; } .xs\:truncate { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } .xs\:w-0 { width: 0 !important; } .xs\:w-1 { width: 0.25rem !important; } .xs\:w-2 { width: 0.5rem !important; } .xs\:w-3 { width: 0.75rem !important; } .xs\:w-4 { width: 1rem !important; } .xs\:w-5 { width: 1.25rem !important; } .xs\:w-6 { width: 1.5rem !important; } .xs\:w-8 { width: 2rem !important; } .xs\:w-10 { width: 2.5rem !important; } .xs\:w-12 { width: 3rem !important; } .xs\:w-14 { width: 3.5rem !important; } .xs\:w-16 { width: 4rem !important; } .xs\:w-18 { width: 4.5rem !important; } .xs\:w-20 { width: 5rem !important; } .xs\:w-22 { width: 5.5rem !important; } .xs\:w-24 { width: 6rem !important; } .xs\:w-26 { width: 6.5rem !important; } .xs\:w-28 { width: 7rem !important; } .xs\:w-30 { width: 7.5rem !important; } .xs\:w-32 { width: 8rem !important; } .xs\:w-36 { width: 9rem !important; } .xs\:w-40 { width: 10rem !important; } .xs\:w-48 { width: 12rem !important; } .xs\:w-50 { width: 12.5rem !important; } .xs\:w-56 { width: 14rem !important; } .xs\:w-60 { width: 15rem !important; } .xs\:w-64 { width: 16rem !important; } .xs\:w-80 { width: 20rem !important; } .xs\:w-90 { width: 24rem !important; } .xs\:w-100 { width: 25rem !important; } .xs\:w-120 { width: 30rem !important; } .xs\:w-128 { width: 32rem !important; } .xs\:w-140 { width: 35rem !important; } .xs\:w-160 { width: 40rem !important; } .xs\:w-180 { width: 45rem !important; } .xs\:w-192 { width: 48rem !important; } .xs\:w-200 { width: 50rem !important; } .xs\:w-240 { width: 60rem !important; } .xs\:w-256 { width: 64rem !important; } .xs\:w-280 { width: 70rem !important; } .xs\:w-320 { width: 80rem !important; } .xs\:w-360 { width: 90rem !important; } .xs\:w-400 { width: 100rem !important; } .xs\:w-480 { width: 120rem !important; } .xs\:w-auto { width: auto !important; } .xs\:w-px { width: 1px !important; } .xs\:w-2px { width: 2px !important; } .xs\:w-1\/2 { width: 50% !important; } .xs\:w-1\/3 { width: 33.33333% !important; } .xs\:w-2\/3 { width: 66.66667% !important; } .xs\:w-1\/4 { width: 25% !important; } .xs\:w-2\/4 { width: 50% !important; } .xs\:w-3\/4 { width: 75% !important; } .xs\:w-1\/5 { width: 20% !important; } .xs\:w-2\/5 { width: 40% !important; } .xs\:w-3\/5 { width: 60% !important; } .xs\:w-4\/5 { width: 80% !important; } .xs\:w-1\/6 { width: 16.666667% !important; } .xs\:w-2\/6 { width: 33.333333% !important; } .xs\:w-3\/6 { width: 50% !important; } .xs\:w-4\/6 { width: 66.666667% !important; } .xs\:w-5\/6 { width: 83.333333% !important; } .xs\:w-1\/12 { width: 8.33333% !important; } .xs\:w-2\/12 { width: 16.66667% !important; } .xs\:w-3\/12 { width: 25% !important; } .xs\:w-4\/12 { width: 33.33333% !important; } .xs\:w-5\/12 { width: 41.66667% !important; } .xs\:w-6\/12 { width: 50% !important; } .xs\:w-7\/12 { width: 58.33333% !important; } .xs\:w-8\/12 { width: 66.66667% !important; } .xs\:w-9\/12 { width: 75% !important; } .xs\:w-10\/12 { width: 83.33333% !important; } .xs\:w-11\/12 { width: 91.66667% !important; } .xs\:w-full { width: 100% !important; } .xs\:w-screen { width: 100vw !important; } .xs\:z-0 { z-index: 0 !important; } .xs\:z-10 { z-index: 10 !important; } .xs\:z-20 { z-index: 20 !important; } .xs\:z-30 { z-index: 30 !important; } .xs\:z-40 { z-index: 40 !important; } .xs\:z-50 { z-index: 50 !important; } .xs\:z-60 { z-index: 60 !important; } .xs\:z-70 { z-index: 70 !important; } .xs\:z-80 { z-index: 80 !important; } .xs\:z-90 { z-index: 90 !important; } .xs\:z-99 { z-index: 99 !important; } .xs\:z-999 { z-index: 999 !important; } .xs\:z-9999 { z-index: 9999 !important; } .xs\:z-99999 { z-index: 99999 !important; } .xs\:z-auto { z-index: auto !important; } .xs\:-z-1 { z-index: -1 !important; } .xs\:gap-0 { grid-gap: 0 !important; gap: 0 !important; } .xs\:gap-1 { grid-gap: 0.25rem !important; gap: 0.25rem !important; } .xs\:gap-2 { grid-gap: 0.5rem !important; gap: 0.5rem !important; } .xs\:gap-3 { grid-gap: 0.75rem !important; gap: 0.75rem !important; } .xs\:gap-4 { grid-gap: 1rem !important; gap: 1rem !important; } .xs\:gap-5 { grid-gap: 1.25rem !important; gap: 1.25rem !important; } .xs\:gap-6 { grid-gap: 1.5rem !important; gap: 1.5rem !important; } .xs\:gap-8 { grid-gap: 2rem !important; gap: 2rem !important; } .xs\:gap-10 { grid-gap: 2.5rem !important; gap: 2.5rem !important; } .xs\:gap-12 { grid-gap: 3rem !important; gap: 3rem !important; } .xs\:gap-14 { grid-gap: 3.5rem !important; gap: 3.5rem !important; } .xs\:gap-16 { grid-gap: 4rem !important; gap: 4rem !important; } .xs\:gap-18 { grid-gap: 4.5rem !important; gap: 4.5rem !important; } .xs\:gap-20 { grid-gap: 5rem !important; gap: 5rem !important; } .xs\:gap-22 { grid-gap: 5.5rem !important; gap: 5.5rem !important; } .xs\:gap-24 { grid-gap: 6rem !important; gap: 6rem !important; } .xs\:gap-26 { grid-gap: 6.5rem !important; gap: 6.5rem !important; } .xs\:gap-28 { grid-gap: 7rem !important; gap: 7rem !important; } .xs\:gap-30 { grid-gap: 7.5rem !important; gap: 7.5rem !important; } .xs\:gap-32 { grid-gap: 8rem !important; gap: 8rem !important; } .xs\:gap-36 { grid-gap: 9rem !important; gap: 9rem !important; } .xs\:gap-40 { grid-gap: 10rem !important; gap: 10rem !important; } .xs\:gap-48 { grid-gap: 12rem !important; gap: 12rem !important; } .xs\:gap-56 { grid-gap: 14rem !important; gap: 14rem !important; } .xs\:gap-64 { grid-gap: 16rem !important; gap: 16rem !important; } .xs\:gap-px { grid-gap: 1px !important; gap: 1px !important; } .xs\:gap-2px { grid-gap: 2px !important; gap: 2px !important; } .xs\:col-gap-0 { grid-column-gap: 0 !important; -moz-column-gap: 0 !important; column-gap: 0 !important; } .xs\:col-gap-1 { grid-column-gap: 0.25rem !important; -moz-column-gap: 0.25rem !important; column-gap: 0.25rem !important; } .xs\:col-gap-2 { grid-column-gap: 0.5rem !important; -moz-column-gap: 0.5rem !important; column-gap: 0.5rem !important; } .xs\:col-gap-3 { grid-column-gap: 0.75rem !important; -moz-column-gap: 0.75rem !important; column-gap: 0.75rem !important; } .xs\:col-gap-4 { grid-column-gap: 1rem !important; -moz-column-gap: 1rem !important; column-gap: 1rem !important; } .xs\:col-gap-5 { grid-column-gap: 1.25rem !important; -moz-column-gap: 1.25rem !important; column-gap: 1.25rem !important; } .xs\:col-gap-6 { grid-column-gap: 1.5rem !important; -moz-column-gap: 1.5rem !important; column-gap: 1.5rem !important; } .xs\:col-gap-8 { grid-column-gap: 2rem !important; -moz-column-gap: 2rem !important; column-gap: 2rem !important; } .xs\:col-gap-10 { grid-column-gap: 2.5rem !important; -moz-column-gap: 2.5rem !important; column-gap: 2.5rem !important; } .xs\:col-gap-12 { grid-column-gap: 3rem !important; -moz-column-gap: 3rem !important; column-gap: 3rem !important; } .xs\:col-gap-14 { grid-column-gap: 3.5rem !important; -moz-column-gap: 3.5rem !important; column-gap: 3.5rem !important; } .xs\:col-gap-16 { grid-column-gap: 4rem !important; -moz-column-gap: 4rem !important; column-gap: 4rem !important; } .xs\:col-gap-18 { grid-column-gap: 4.5rem !important; -moz-column-gap: 4.5rem !important; column-gap: 4.5rem !important; } .xs\:col-gap-20 { grid-column-gap: 5rem !important; -moz-column-gap: 5rem !important; column-gap: 5rem !important; } .xs\:col-gap-22 { grid-column-gap: 5.5rem !important; -moz-column-gap: 5.5rem !important; column-gap: 5.5rem !important; } .xs\:col-gap-24 { grid-column-gap: 6rem !important; -moz-column-gap: 6rem !important; column-gap: 6rem !important; } .xs\:col-gap-26 { grid-column-gap: 6.5rem !important; -moz-column-gap: 6.5rem !important; column-gap: 6.5rem !important; } .xs\:col-gap-28 { grid-column-gap: 7rem !important; -moz-column-gap: 7rem !important; column-gap: 7rem !important; } .xs\:col-gap-30 { grid-column-gap: 7.5rem !important; -moz-column-gap: 7.5rem !important; column-gap: 7.5rem !important; } .xs\:col-gap-32 { grid-column-gap: 8rem !important; -moz-column-gap: 8rem !important; column-gap: 8rem !important; } .xs\:col-gap-36 { grid-column-gap: 9rem !important; -moz-column-gap: 9rem !important; column-gap: 9rem !important; } .xs\:col-gap-40 { grid-column-gap: 10rem !important; -moz-column-gap: 10rem !important; column-gap: 10rem !important; } .xs\:col-gap-48 { grid-column-gap: 12rem !important; -moz-column-gap: 12rem !important; column-gap: 12rem !important; } .xs\:col-gap-56 { grid-column-gap: 14rem !important; -moz-column-gap: 14rem !important; column-gap: 14rem !important; } .xs\:col-gap-64 { grid-column-gap: 16rem !important; -moz-column-gap: 16rem !important; column-gap: 16rem !important; } .xs\:col-gap-px { grid-column-gap: 1px !important; -moz-column-gap: 1px !important; column-gap: 1px !important; } .xs\:col-gap-2px { grid-column-gap: 2px !important; -moz-column-gap: 2px !important; column-gap: 2px !important; } .xs\:row-gap-0 { grid-row-gap: 0 !important; row-gap: 0 !important; } .xs\:row-gap-1 { grid-row-gap: 0.25rem !important; row-gap: 0.25rem !important; } .xs\:row-gap-2 { grid-row-gap: 0.5rem !important; row-gap: 0.5rem !important; } .xs\:row-gap-3 { grid-row-gap: 0.75rem !important; row-gap: 0.75rem !important; } .xs\:row-gap-4 { grid-row-gap: 1rem !important; row-gap: 1rem !important; } .xs\:row-gap-5 { grid-row-gap: 1.25rem !important; row-gap: 1.25rem !important; } .xs\:row-gap-6 { grid-row-gap: 1.5rem !important; row-gap: 1.5rem !important; } .xs\:row-gap-8 { grid-row-gap: 2rem !important; row-gap: 2rem !important; } .xs\:row-gap-10 { grid-row-gap: 2.5rem !important; row-gap: 2.5rem !important; } .xs\:row-gap-12 { grid-row-gap: 3rem !important; row-gap: 3rem !important; } .xs\:row-gap-14 { grid-row-gap: 3.5rem !important; row-gap: 3.5rem !important; } .xs\:row-gap-16 { grid-row-gap: 4rem !important; row-gap: 4rem !important; } .xs\:row-gap-18 { grid-row-gap: 4.5rem !important; row-gap: 4.5rem !important; } .xs\:row-gap-20 { grid-row-gap: 5rem !important; row-gap: 5rem !important; } .xs\:row-gap-22 { grid-row-gap: 5.5rem !important; row-gap: 5.5rem !important; } .xs\:row-gap-24 { grid-row-gap: 6rem !important; row-gap: 6rem !important; } .xs\:row-gap-26 { grid-row-gap: 6.5rem !important; row-gap: 6.5rem !important; } .xs\:row-gap-28 { grid-row-gap: 7rem !important; row-gap: 7rem !important; } .xs\:row-gap-30 { grid-row-gap: 7.5rem !important; row-gap: 7.5rem !important; } .xs\:row-gap-32 { grid-row-gap: 8rem !important; row-gap: 8rem !important; } .xs\:row-gap-36 { grid-row-gap: 9rem !important; row-gap: 9rem !important; } .xs\:row-gap-40 { grid-row-gap: 10rem !important; row-gap: 10rem !important; } .xs\:row-gap-48 { grid-row-gap: 12rem !important; row-gap: 12rem !important; } .xs\:row-gap-56 { grid-row-gap: 14rem !important; row-gap: 14rem !important; } .xs\:row-gap-64 { grid-row-gap: 16rem !important; row-gap: 16rem !important; } .xs\:row-gap-px { grid-row-gap: 1px !important; row-gap: 1px !important; } .xs\:row-gap-2px { grid-row-gap: 2px !important; row-gap: 2px !important; } .xs\:grid-flow-row { grid-auto-flow: row !important; } .xs\:grid-flow-col { grid-auto-flow: column !important; } .xs\:grid-flow-row-dense { grid-auto-flow: row dense !important; } .xs\:grid-flow-col-dense { grid-auto-flow: column dense !important; } .xs\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; } .xs\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } .xs\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; } .xs\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; } .xs\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; } .xs\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; } .xs\:grid-cols-7 { grid-template-columns: repeat(7, minmax(0, 1fr)) !important; } .xs\:grid-cols-8 { grid-template-columns: repeat(8, minmax(0, 1fr)) !important; } .xs\:grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)) !important; } .xs\:grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)) !important; } .xs\:grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)) !important; } .xs\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)) !important; } .xs\:grid-cols-none { grid-template-columns: none !important; } .xs\:col-auto { grid-column: auto !important; } .xs\:col-span-1 { grid-column: span 1 / span 1 !important; } .xs\:col-span-2 { grid-column: span 2 / span 2 !important; } .xs\:col-span-3 { grid-column: span 3 / span 3 !important; } .xs\:col-span-4 { grid-column: span 4 / span 4 !important; } .xs\:col-span-5 { grid-column: span 5 / span 5 !important; } .xs\:col-span-6 { grid-column: span 6 / span 6 !important; } .xs\:col-span-7 { grid-column: span 7 / span 7 !important; } .xs\:col-span-8 { grid-column: span 8 / span 8 !important; } .xs\:col-span-9 { grid-column: span 9 / span 9 !important; } .xs\:col-span-10 { grid-column: span 10 / span 10 !important; } .xs\:col-span-11 { grid-column: span 11 / span 11 !important; } .xs\:col-span-12 { grid-column: span 12 / span 12 !important; } .xs\:col-start-1 { grid-column-start: 1 !important; } .xs\:col-start-2 { grid-column-start: 2 !important; } .xs\:col-start-3 { grid-column-start: 3 !important; } .xs\:col-start-4 { grid-column-start: 4 !important; } .xs\:col-start-5 { grid-column-start: 5 !important; } .xs\:col-start-6 { grid-column-start: 6 !important; } .xs\:col-start-7 { grid-column-start: 7 !important; } .xs\:col-start-8 { grid-column-start: 8 !important; } .xs\:col-start-9 { grid-column-start: 9 !important; } .xs\:col-start-10 { grid-column-start: 10 !important; } .xs\:col-start-11 { grid-column-start: 11 !important; } .xs\:col-start-12 { grid-column-start: 12 !important; } .xs\:col-start-13 { grid-column-start: 13 !important; } .xs\:col-start-auto { grid-column-start: auto !important; } .xs\:col-end-1 { grid-column-end: 1 !important; } .xs\:col-end-2 { grid-column-end: 2 !important; } .xs\:col-end-3 { grid-column-end: 3 !important; } .xs\:col-end-4 { grid-column-end: 4 !important; } .xs\:col-end-5 { grid-column-end: 5 !important; } .xs\:col-end-6 { grid-column-end: 6 !important; } .xs\:col-end-7 { grid-column-end: 7 !important; } .xs\:col-end-8 { grid-column-end: 8 !important; } .xs\:col-end-9 { grid-column-end: 9 !important; } .xs\:col-end-10 { grid-column-end: 10 !important; } .xs\:col-end-11 { grid-column-end: 11 !important; } .xs\:col-end-12 { grid-column-end: 12 !important; } .xs\:col-end-13 { grid-column-end: 13 !important; } .xs\:col-end-auto { grid-column-end: auto !important; } .xs\:grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)) !important; } .xs\:grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)) !important; } .xs\:grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)) !important; } .xs\:grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)) !important; } .xs\:grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)) !important; } .xs\:grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)) !important; } .xs\:grid-rows-none { grid-template-rows: none !important; } .xs\:row-auto { grid-row: auto !important; } .xs\:row-span-1 { grid-row: span 1 / span 1 !important; } .xs\:row-span-2 { grid-row: span 2 / span 2 !important; } .xs\:row-span-3 { grid-row: span 3 / span 3 !important; } .xs\:row-span-4 { grid-row: span 4 / span 4 !important; } .xs\:row-span-5 { grid-row: span 5 / span 5 !important; } .xs\:row-span-6 { grid-row: span 6 / span 6 !important; } .xs\:row-start-1 { grid-row-start: 1 !important; } .xs\:row-start-2 { grid-row-start: 2 !important; } .xs\:row-start-3 { grid-row-start: 3 !important; } .xs\:row-start-4 { grid-row-start: 4 !important; } .xs\:row-start-5 { grid-row-start: 5 !important; } .xs\:row-start-6 { grid-row-start: 6 !important; } .xs\:row-start-7 { grid-row-start: 7 !important; } .xs\:row-start-auto { grid-row-start: auto !important; } .xs\:row-end-1 { grid-row-end: 1 !important; } .xs\:row-end-2 { grid-row-end: 2 !important; } .xs\:row-end-3 { grid-row-end: 3 !important; } .xs\:row-end-4 { grid-row-end: 4 !important; } .xs\:row-end-5 { grid-row-end: 5 !important; } .xs\:row-end-6 { grid-row-end: 6 !important; } .xs\:row-end-7 { grid-row-end: 7 !important; } .xs\:row-end-auto { grid-row-end: auto !important; } .xs\:transform { --transform-translate-x: 0 !important; --transform-translate-y: 0 !important; --transform-rotate: 0 !important; --transform-skew-x: 0 !important; --transform-skew-y: 0 !important; --transform-scale-x: 1 !important; --transform-scale-y: 1 !important; transform: translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y)) !important; } .xs\:transform-none { transform: none !important; } .xs\:origin-center { transform-origin: center !important; } .xs\:origin-top { transform-origin: top !important; } .xs\:origin-top-right { transform-origin: top right !important; } .xs\:origin-right { transform-origin: right !important; } .xs\:origin-bottom-right { transform-origin: bottom right !important; } .xs\:origin-bottom { transform-origin: bottom !important; } .xs\:origin-bottom-left { transform-origin: bottom left !important; } .xs\:origin-left { transform-origin: left !important; } .xs\:origin-top-left { transform-origin: top left !important; } .xs\:icon-size-12 { width: 12px !important; height: 12px !important; min-width: 12px !important; min-height: 12px !important; font-size: 12px !important; line-height: 12px !important; } .xs\:icon-size-12 svg { width: 12px !important; height: 12px !important; } .xs\:icon-size-14 { width: 14px !important; height: 14px !important; min-width: 14px !important; min-height: 14px !important; font-size: 14px !important; line-height: 14px !important; } .xs\:icon-size-14 svg { width: 14px !important; height: 14px !important; } .xs\:icon-size-16 { width: 16px !important; height: 16px !important; min-width: 16px !important; min-height: 16px !important; font-size: 16px !important; line-height: 16px !important; } .xs\:icon-size-16 svg { width: 16px !important; height: 16px !important; } .xs\:icon-size-18 { width: 18px !important; height: 18px !important; min-width: 18px !important; min-height: 18px !important; font-size: 18px !important; line-height: 18px !important; } .xs\:icon-size-18 svg { width: 18px !important; height: 18px !important; } .xs\:icon-size-20 { width: 20px !important; height: 20px !important; min-width: 20px !important; min-height: 20px !important; font-size: 20px !important; line-height: 20px !important; } .xs\:icon-size-20 svg { width: 20px !important; height: 20px !important; } .xs\:icon-size-24 { width: 24px !important; height: 24px !important; min-width: 24px !important; min-height: 24px !important; font-size: 24px !important; line-height: 24px !important; } .xs\:icon-size-24 svg { width: 24px !important; height: 24px !important; } .xs\:icon-size-32 { width: 32px !important; height: 32px !important; min-width: 32px !important; min-height: 32px !important; font-size: 32px !important; line-height: 32px !important; } .xs\:icon-size-32 svg { width: 32px !important; height: 32px !important; } .xs\:icon-size-40 { width: 40px !important; height: 40px !important; min-width: 40px !important; min-height: 40px !important; font-size: 40px !important; line-height: 40px !important; } .xs\:icon-size-40 svg { width: 40px !important; height: 40px !important; } .xs\:icon-size-48 { width: 48px !important; height: 48px !important; min-width: 48px !important; min-height: 48px !important; font-size: 48px !important; line-height: 48px !important; } .xs\:icon-size-48 svg { width: 48px !important; height: 48px !important; } .xs\:icon-size-56 { width: 56px !important; height: 56px !important; min-width: 56px !important; min-height: 56px !important; font-size: 56px !important; line-height: 56px !important; } .xs\:icon-size-56 svg { width: 56px !important; height: 56px !important; } .xs\:icon-size-64 { width: 64px !important; height: 64px !important; min-width: 64px !important; min-height: 64px !important; font-size: 64px !important; line-height: 64px !important; } .xs\:icon-size-64 svg { width: 64px !important; height: 64px !important; } .xs\:icon-size-72 { width: 72px !important; height: 72px !important; min-width: 72px !important; min-height: 72px !important; font-size: 72px !important; line-height: 72px !important; } .xs\:icon-size-72 svg { width: 72px !important; height: 72px !important; } .xs\:icon-size-80 { width: 80px !important; height: 80px !important; min-width: 80px !important; min-height: 80px !important; font-size: 80px !important; line-height: 80px !important; } .xs\:icon-size-80 svg { width: 80px !important; height: 80px !important; } .xs\:icon-size-88 { width: 88px !important; height: 88px !important; min-width: 88px !important; min-height: 88px !important; font-size: 88px !important; line-height: 88px !important; } .xs\:icon-size-88 svg { width: 88px !important; height: 88px !important; } .xs\:icon-size-96 { width: 96px !important; height: 96px !important; min-width: 96px !important; min-height: 96px !important; font-size: 96px !important; line-height: 96px !important; } .xs\:icon-size-96 svg { width: 96px !important; height: 96px !important; } } @media (min-width: 600px) and (max-width: 959px) { .sm\:space-y-0 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0px * var(--space-y-reverse)) !important; } .sm\:space-x-0 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0px * var(--space-x-reverse)) !important; margin-left: calc(0px * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.25rem * var(--space-y-reverse)) !important; } .sm\:space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.25rem * var(--space-x-reverse)) !important; margin-left: calc(0.25rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.5rem * var(--space-y-reverse)) !important; } .sm\:space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.5rem * var(--space-x-reverse)) !important; margin-left: calc(0.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.75rem * var(--space-y-reverse)) !important; } .sm\:space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.75rem * var(--space-x-reverse)) !important; margin-left: calc(0.75rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1rem * var(--space-y-reverse)) !important; } .sm\:space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1rem * var(--space-x-reverse)) !important; margin-left: calc(1rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.25rem * var(--space-y-reverse)) !important; } .sm\:space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.25rem * var(--space-x-reverse)) !important; margin-left: calc(1.25rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.5rem * var(--space-y-reverse)) !important; } .sm\:space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.5rem * var(--space-x-reverse)) !important; margin-left: calc(1.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2rem * var(--space-y-reverse)) !important; } .sm\:space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2rem * var(--space-x-reverse)) !important; margin-left: calc(2rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2.5rem * var(--space-y-reverse)) !important; } .sm\:space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2.5rem * var(--space-x-reverse)) !important; margin-left: calc(2.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3rem * var(--space-y-reverse)) !important; } .sm\:space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3rem * var(--space-x-reverse)) !important; margin-left: calc(3rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3.5rem * var(--space-y-reverse)) !important; } .sm\:space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3.5rem * var(--space-x-reverse)) !important; margin-left: calc(3.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4rem * var(--space-y-reverse)) !important; } .sm\:space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4rem * var(--space-x-reverse)) !important; margin-left: calc(4rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4.5rem * var(--space-y-reverse)) !important; } .sm\:space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4.5rem * var(--space-x-reverse)) !important; margin-left: calc(4.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5rem * var(--space-y-reverse)) !important; } .sm\:space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5rem * var(--space-x-reverse)) !important; margin-left: calc(5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5.5rem * var(--space-y-reverse)) !important; } .sm\:space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5.5rem * var(--space-x-reverse)) !important; margin-left: calc(5.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6rem * var(--space-y-reverse)) !important; } .sm\:space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6rem * var(--space-x-reverse)) !important; margin-left: calc(6rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6.5rem * var(--space-y-reverse)) !important; } .sm\:space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6.5rem * var(--space-x-reverse)) !important; margin-left: calc(6.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7rem * var(--space-y-reverse)) !important; } .sm\:space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7rem * var(--space-x-reverse)) !important; margin-left: calc(7rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7.5rem * var(--space-y-reverse)) !important; } .sm\:space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7.5rem * var(--space-x-reverse)) !important; margin-left: calc(7.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(8rem * var(--space-y-reverse)) !important; } .sm\:space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(8rem * var(--space-x-reverse)) !important; margin-left: calc(8rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(9rem * var(--space-y-reverse)) !important; } .sm\:space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(9rem * var(--space-x-reverse)) !important; margin-left: calc(9rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(10rem * var(--space-y-reverse)) !important; } .sm\:space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(10rem * var(--space-x-reverse)) !important; margin-left: calc(10rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(12rem * var(--space-y-reverse)) !important; } .sm\:space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(12rem * var(--space-x-reverse)) !important; margin-left: calc(12rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(14rem * var(--space-y-reverse)) !important; } .sm\:space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(14rem * var(--space-x-reverse)) !important; margin-left: calc(14rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(16rem * var(--space-y-reverse)) !important; } .sm\:space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(16rem * var(--space-x-reverse)) !important; margin-left: calc(16rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1px * var(--space-y-reverse)) !important; } .sm\:space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1px * var(--space-x-reverse)) !important; margin-left: calc(1px * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2px * var(--space-y-reverse)) !important; } .sm\:space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2px * var(--space-x-reverse)) !important; margin-left: calc(2px * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.25rem * var(--space-y-reverse)) !important; } .sm\:-space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.25rem * var(--space-x-reverse)) !important; margin-left: calc(-0.25rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.5rem * var(--space-y-reverse)) !important; } .sm\:-space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.5rem * var(--space-x-reverse)) !important; margin-left: calc(-0.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.75rem * var(--space-y-reverse)) !important; } .sm\:-space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.75rem * var(--space-x-reverse)) !important; margin-left: calc(-0.75rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1rem * var(--space-y-reverse)) !important; } .sm\:-space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1rem * var(--space-x-reverse)) !important; margin-left: calc(-1rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.25rem * var(--space-y-reverse)) !important; } .sm\:-space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.25rem * var(--space-x-reverse)) !important; margin-left: calc(-1.25rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.5rem * var(--space-y-reverse)) !important; } .sm\:-space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.5rem * var(--space-x-reverse)) !important; margin-left: calc(-1.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2rem * var(--space-y-reverse)) !important; } .sm\:-space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2rem * var(--space-x-reverse)) !important; margin-left: calc(-2rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2.5rem * var(--space-y-reverse)) !important; } .sm\:-space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2.5rem * var(--space-x-reverse)) !important; margin-left: calc(-2.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3rem * var(--space-y-reverse)) !important; } .sm\:-space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3rem * var(--space-x-reverse)) !important; margin-left: calc(-3rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3.5rem * var(--space-y-reverse)) !important; } .sm\:-space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3.5rem * var(--space-x-reverse)) !important; margin-left: calc(-3.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4rem * var(--space-y-reverse)) !important; } .sm\:-space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4rem * var(--space-x-reverse)) !important; margin-left: calc(-4rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4.5rem * var(--space-y-reverse)) !important; } .sm\:-space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4.5rem * var(--space-x-reverse)) !important; margin-left: calc(-4.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5rem * var(--space-y-reverse)) !important; } .sm\:-space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5rem * var(--space-x-reverse)) !important; margin-left: calc(-5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5.5rem * var(--space-y-reverse)) !important; } .sm\:-space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5.5rem * var(--space-x-reverse)) !important; margin-left: calc(-5.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6rem * var(--space-y-reverse)) !important; } .sm\:-space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6rem * var(--space-x-reverse)) !important; margin-left: calc(-6rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6.5rem * var(--space-y-reverse)) !important; } .sm\:-space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6.5rem * var(--space-x-reverse)) !important; margin-left: calc(-6.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7rem * var(--space-y-reverse)) !important; } .sm\:-space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7rem * var(--space-x-reverse)) !important; margin-left: calc(-7rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7.5rem * var(--space-y-reverse)) !important; } .sm\:-space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7.5rem * var(--space-x-reverse)) !important; margin-left: calc(-7.5rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-8rem * var(--space-y-reverse)) !important; } .sm\:-space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-8rem * var(--space-x-reverse)) !important; margin-left: calc(-8rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-9rem * var(--space-y-reverse)) !important; } .sm\:-space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-9rem * var(--space-x-reverse)) !important; margin-left: calc(-9rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-10rem * var(--space-y-reverse)) !important; } .sm\:-space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-10rem * var(--space-x-reverse)) !important; margin-left: calc(-10rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-12rem * var(--space-y-reverse)) !important; } .sm\:-space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-12rem * var(--space-x-reverse)) !important; margin-left: calc(-12rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-14rem * var(--space-y-reverse)) !important; } .sm\:-space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-14rem * var(--space-x-reverse)) !important; margin-left: calc(-14rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-16rem * var(--space-y-reverse)) !important; } .sm\:-space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-16rem * var(--space-x-reverse)) !important; margin-left: calc(-16rem * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1px * var(--space-y-reverse)) !important; } .sm\:-space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1px * var(--space-x-reverse)) !important; margin-left: calc(-1px * calc(1 - var(--space-x-reverse))) !important; } .sm\:-space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2px * var(--space-y-reverse)) !important; } .sm\:-space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2px * var(--space-x-reverse)) !important; margin-left: calc(-2px * calc(1 - var(--space-x-reverse))) !important; } .sm\:space-y-reverse > :not(template) ~ :not(template) { --space-y-reverse: 1 !important; } .sm\:space-x-reverse > :not(template) ~ :not(template) { --space-x-reverse: 1 !important; } .sm\:divide-y-0 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(0px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(0px * var(--divide-y-reverse)) !important; } .sm\:divide-x-0 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(0px * var(--divide-x-reverse)) !important; border-left-width: calc(0px * calc(1 - var(--divide-x-reverse))) !important; } .sm\:divide-y-2 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(2px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(2px * var(--divide-y-reverse)) !important; } .sm\:divide-x-2 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(2px * var(--divide-x-reverse)) !important; border-left-width: calc(2px * calc(1 - var(--divide-x-reverse))) !important; } .sm\:divide-y-4 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(4px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(4px * var(--divide-y-reverse)) !important; } .sm\:divide-x-4 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(4px * var(--divide-x-reverse)) !important; border-left-width: calc(4px * calc(1 - var(--divide-x-reverse))) !important; } .sm\:divide-y-8 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(8px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(8px * var(--divide-y-reverse)) !important; } .sm\:divide-x-8 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(8px * var(--divide-x-reverse)) !important; border-left-width: calc(8px * calc(1 - var(--divide-x-reverse))) !important; } .sm\:divide-y > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(1px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(1px * var(--divide-y-reverse)) !important; } .sm\:divide-x > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(1px * var(--divide-x-reverse)) !important; border-left-width: calc(1px * calc(1 - var(--divide-x-reverse))) !important; } .sm\:divide-y-reverse > :not(template) ~ :not(template) { --divide-y-reverse: 1 !important; } .sm\:divide-x-reverse > :not(template) ~ :not(template) { --divide-x-reverse: 1 !important; } .sm\:divide-current > :not(template) ~ :not(template) { border-color: currentColor !important; } .sm\:divide-transparent > :not(template) ~ :not(template) { border-color: transparent !important; } .sm\:divide-white > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFFFFF !important; border-color: rgba(255, 255, 255, var(--divide-opacity)) !important; } .sm\:divide-black > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #000000 !important; border-color: rgba(0, 0, 0, var(--divide-opacity)) !important; } .sm\:divide-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F9FAFB !important; border-color: rgba(249, 250, 251, var(--divide-opacity)) !important; } .sm\:divide-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F4F5F7 !important; border-color: rgba(244, 245, 247, var(--divide-opacity)) !important; } .sm\:divide-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5E7EB !important; border-color: rgba(229, 231, 235, var(--divide-opacity)) !important; } .sm\:divide-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D2D6DC !important; border-color: rgba(210, 214, 220, var(--divide-opacity)) !important; } .sm\:divide-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9FA6B2 !important; border-color: rgba(159, 166, 178, var(--divide-opacity)) !important; } .sm\:divide-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .sm\:divide-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4B5563 !important; border-color: rgba(75, 85, 99, var(--divide-opacity)) !important; } .sm\:divide-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #374151 !important; border-color: rgba(55, 65, 81, var(--divide-opacity)) !important; } .sm\:divide-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #252F3F !important; border-color: rgba(37, 47, 63, var(--divide-opacity)) !important; } .sm\:divide-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #161E2E !important; border-color: rgba(22, 30, 46, var(--divide-opacity)) !important; } .sm\:divide-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .sm\:divide-cool-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBFDFE !important; border-color: rgba(251, 253, 254, var(--divide-opacity)) !important; } .sm\:divide-cool-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F1F5F9 !important; border-color: rgba(241, 245, 249, var(--divide-opacity)) !important; } .sm\:divide-cool-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E2E8F0 !important; border-color: rgba(226, 232, 240, var(--divide-opacity)) !important; } .sm\:divide-cool-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CFD8E3 !important; border-color: rgba(207, 216, 227, var(--divide-opacity)) !important; } .sm\:divide-cool-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #97A6BA !important; border-color: rgba(151, 166, 186, var(--divide-opacity)) !important; } .sm\:divide-cool-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .sm\:divide-cool-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #475569 !important; border-color: rgba(71, 85, 105, var(--divide-opacity)) !important; } .sm\:divide-cool-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #364152 !important; border-color: rgba(54, 65, 82, var(--divide-opacity)) !important; } .sm\:divide-cool-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #27303F !important; border-color: rgba(39, 48, 63, var(--divide-opacity)) !important; } .sm\:divide-cool-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A202E !important; border-color: rgba(26, 32, 46, var(--divide-opacity)) !important; } .sm\:divide-cool-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .sm\:divide-red-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F2 !important; border-color: rgba(253, 242, 242, var(--divide-opacity)) !important; } .sm\:divide-red-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDE8E8 !important; border-color: rgba(253, 232, 232, var(--divide-opacity)) !important; } .sm\:divide-red-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBD5D5 !important; border-color: rgba(251, 213, 213, var(--divide-opacity)) !important; } .sm\:divide-red-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4B4 !important; border-color: rgba(248, 180, 180, var(--divide-opacity)) !important; } .sm\:divide-red-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F98080 !important; border-color: rgba(249, 128, 128, var(--divide-opacity)) !important; } .sm\:divide-red-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .sm\:divide-red-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E02424 !important; border-color: rgba(224, 36, 36, var(--divide-opacity)) !important; } .sm\:divide-red-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C81E1E !important; border-color: rgba(200, 30, 30, var(--divide-opacity)) !important; } .sm\:divide-red-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9B1C1C !important; border-color: rgba(155, 28, 28, var(--divide-opacity)) !important; } .sm\:divide-red-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .sm\:divide-red > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .sm\:divide-orange-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFF8F1 !important; border-color: rgba(255, 248, 241, var(--divide-opacity)) !important; } .sm\:divide-orange-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FEECDC !important; border-color: rgba(254, 236, 220, var(--divide-opacity)) !important; } .sm\:divide-orange-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCD9BD !important; border-color: rgba(252, 217, 189, var(--divide-opacity)) !important; } .sm\:divide-orange-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDBA8C !important; border-color: rgba(253, 186, 140, var(--divide-opacity)) !important; } .sm\:divide-orange-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF8A4C !important; border-color: rgba(255, 138, 76, var(--divide-opacity)) !important; } .sm\:divide-orange-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .sm\:divide-orange-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D03801 !important; border-color: rgba(208, 56, 1, var(--divide-opacity)) !important; } .sm\:divide-orange-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B43403 !important; border-color: rgba(180, 52, 3, var(--divide-opacity)) !important; } .sm\:divide-orange-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8A2C0D !important; border-color: rgba(138, 44, 13, var(--divide-opacity)) !important; } .sm\:divide-orange-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .sm\:divide-orange > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .sm\:divide-yellow-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDFDEA !important; border-color: rgba(253, 253, 234, var(--divide-opacity)) !important; } .sm\:divide-yellow-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF6B2 !important; border-color: rgba(253, 246, 178, var(--divide-opacity)) !important; } .sm\:divide-yellow-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE96A !important; border-color: rgba(252, 233, 106, var(--divide-opacity)) !important; } .sm\:divide-yellow-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FACA15 !important; border-color: rgba(250, 202, 21, var(--divide-opacity)) !important; } .sm\:divide-yellow-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E3A008 !important; border-color: rgba(227, 160, 8, var(--divide-opacity)) !important; } .sm\:divide-yellow-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .sm\:divide-yellow-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9F580A !important; border-color: rgba(159, 88, 10, var(--divide-opacity)) !important; } .sm\:divide-yellow-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8E4B10 !important; border-color: rgba(142, 75, 16, var(--divide-opacity)) !important; } .sm\:divide-yellow-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #723B13 !important; border-color: rgba(114, 59, 19, var(--divide-opacity)) !important; } .sm\:divide-yellow-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #633112 !important; border-color: rgba(99, 49, 18, var(--divide-opacity)) !important; } .sm\:divide-yellow > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .sm\:divide-green-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F3FAF7 !important; border-color: rgba(243, 250, 247, var(--divide-opacity)) !important; } .sm\:divide-green-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DEF7EC !important; border-color: rgba(222, 247, 236, var(--divide-opacity)) !important; } .sm\:divide-green-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BCF0DA !important; border-color: rgba(188, 240, 218, var(--divide-opacity)) !important; } .sm\:divide-green-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #84E1BC !important; border-color: rgba(132, 225, 188, var(--divide-opacity)) !important; } .sm\:divide-green-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #31C48D !important; border-color: rgba(49, 196, 141, var(--divide-opacity)) !important; } .sm\:divide-green-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .sm\:divide-green-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #057A55 !important; border-color: rgba(5, 122, 85, var(--divide-opacity)) !important; } .sm\:divide-green-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #046C4E !important; border-color: rgba(4, 108, 78, var(--divide-opacity)) !important; } .sm\:divide-green-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #03543F !important; border-color: rgba(3, 84, 63, var(--divide-opacity)) !important; } .sm\:divide-green-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014737 !important; border-color: rgba(1, 71, 55, var(--divide-opacity)) !important; } .sm\:divide-green > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .sm\:divide-teal-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDFAFA !important; border-color: rgba(237, 250, 250, var(--divide-opacity)) !important; } .sm\:divide-teal-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D5F5F6 !important; border-color: rgba(213, 245, 246, var(--divide-opacity)) !important; } .sm\:divide-teal-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AFECEF !important; border-color: rgba(175, 236, 239, var(--divide-opacity)) !important; } .sm\:divide-teal-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7EDCE2 !important; border-color: rgba(126, 220, 226, var(--divide-opacity)) !important; } .sm\:divide-teal-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #16BDCA !important; border-color: rgba(22, 189, 202, var(--divide-opacity)) !important; } .sm\:divide-teal-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .sm\:divide-teal-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #047481 !important; border-color: rgba(4, 116, 129, var(--divide-opacity)) !important; } .sm\:divide-teal-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #036672 !important; border-color: rgba(3, 102, 114, var(--divide-opacity)) !important; } .sm\:divide-teal-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #05505C !important; border-color: rgba(5, 80, 92, var(--divide-opacity)) !important; } .sm\:divide-teal-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014451 !important; border-color: rgba(1, 68, 81, var(--divide-opacity)) !important; } .sm\:divide-teal > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .sm\:divide-blue-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EBF5FF !important; border-color: rgba(235, 245, 255, var(--divide-opacity)) !important; } .sm\:divide-blue-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E1EFFE !important; border-color: rgba(225, 239, 254, var(--divide-opacity)) !important; } .sm\:divide-blue-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C3DDFD !important; border-color: rgba(195, 221, 253, var(--divide-opacity)) !important; } .sm\:divide-blue-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #A4CAFE !important; border-color: rgba(164, 202, 254, var(--divide-opacity)) !important; } .sm\:divide-blue-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #76A9FA !important; border-color: rgba(118, 169, 250, var(--divide-opacity)) !important; } .sm\:divide-blue-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .sm\:divide-blue-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1C64F2 !important; border-color: rgba(28, 100, 242, var(--divide-opacity)) !important; } .sm\:divide-blue-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A56DB !important; border-color: rgba(26, 86, 219, var(--divide-opacity)) !important; } .sm\:divide-blue-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1E429F !important; border-color: rgba(30, 66, 159, var(--divide-opacity)) !important; } .sm\:divide-blue-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #233876 !important; border-color: rgba(35, 56, 118, var(--divide-opacity)) !important; } .sm\:divide-blue > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .sm\:divide-indigo-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F0F5FF !important; border-color: rgba(240, 245, 255, var(--divide-opacity)) !important; } .sm\:divide-indigo-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5EDFF !important; border-color: rgba(229, 237, 255, var(--divide-opacity)) !important; } .sm\:divide-indigo-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CDDBFE !important; border-color: rgba(205, 219, 254, var(--divide-opacity)) !important; } .sm\:divide-indigo-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B4C6FC !important; border-color: rgba(180, 198, 252, var(--divide-opacity)) !important; } .sm\:divide-indigo-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8DA2FB !important; border-color: rgba(141, 162, 251, var(--divide-opacity)) !important; } .sm\:divide-indigo-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .sm\:divide-indigo-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5850EC !important; border-color: rgba(88, 80, 236, var(--divide-opacity)) !important; } .sm\:divide-indigo-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5145CD !important; border-color: rgba(81, 69, 205, var(--divide-opacity)) !important; } .sm\:divide-indigo-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #42389D !important; border-color: rgba(66, 56, 157, var(--divide-opacity)) !important; } .sm\:divide-indigo-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #362F78 !important; border-color: rgba(54, 47, 120, var(--divide-opacity)) !important; } .sm\:divide-indigo > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .sm\:divide-purple-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F6F5FF !important; border-color: rgba(246, 245, 255, var(--divide-opacity)) !important; } .sm\:divide-purple-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDEBFE !important; border-color: rgba(237, 235, 254, var(--divide-opacity)) !important; } .sm\:divide-purple-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DCD7FE !important; border-color: rgba(220, 215, 254, var(--divide-opacity)) !important; } .sm\:divide-purple-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CABFFD !important; border-color: rgba(202, 191, 253, var(--divide-opacity)) !important; } .sm\:divide-purple-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AC94FA !important; border-color: rgba(172, 148, 250, var(--divide-opacity)) !important; } .sm\:divide-purple-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .sm\:divide-purple-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7E3AF2 !important; border-color: rgba(126, 58, 242, var(--divide-opacity)) !important; } .sm\:divide-purple-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6C2BD9 !important; border-color: rgba(108, 43, 217, var(--divide-opacity)) !important; } .sm\:divide-purple-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5521B5 !important; border-color: rgba(85, 33, 181, var(--divide-opacity)) !important; } .sm\:divide-purple-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4A1D96 !important; border-color: rgba(74, 29, 150, var(--divide-opacity)) !important; } .sm\:divide-purple > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .sm\:divide-pink-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F8 !important; border-color: rgba(253, 242, 248, var(--divide-opacity)) !important; } .sm\:divide-pink-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE8F3 !important; border-color: rgba(252, 232, 243, var(--divide-opacity)) !important; } .sm\:divide-pink-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FAD1E8 !important; border-color: rgba(250, 209, 232, var(--divide-opacity)) !important; } .sm\:divide-pink-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4D9 !important; border-color: rgba(248, 180, 217, var(--divide-opacity)) !important; } .sm\:divide-pink-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F17EB8 !important; border-color: rgba(241, 126, 184, var(--divide-opacity)) !important; } .sm\:divide-pink-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .sm\:divide-pink-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D61F69 !important; border-color: rgba(214, 31, 105, var(--divide-opacity)) !important; } .sm\:divide-pink-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BF125D !important; border-color: rgba(191, 18, 93, var(--divide-opacity)) !important; } .sm\:divide-pink-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #99154B !important; border-color: rgba(153, 21, 75, var(--divide-opacity)) !important; } .sm\:divide-pink-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #751A3D !important; border-color: rgba(117, 26, 61, var(--divide-opacity)) !important; } .sm\:divide-pink > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .sm\:divide-opacity-0 > :not(template) ~ :not(template) { --divide-opacity: 0 !important; } .sm\:divide-opacity-12 > :not(template) ~ :not(template) { --divide-opacity: 0.12 !important; } .sm\:divide-opacity-25 > :not(template) ~ :not(template) { --divide-opacity: 0.25 !important; } .sm\:divide-opacity-38 > :not(template) ~ :not(template) { --divide-opacity: 0.38 !important; } .sm\:divide-opacity-50 > :not(template) ~ :not(template) { --divide-opacity: 0.5 !important; } .sm\:divide-opacity-54 > :not(template) ~ :not(template) { --divide-opacity: 0.54 !important; } .sm\:divide-opacity-70 > :not(template) ~ :not(template) { --divide-opacity: 0.70 !important; } .sm\:divide-opacity-75 > :not(template) ~ :not(template) { --divide-opacity: 0.75 !important; } .sm\:divide-opacity-84 > :not(template) ~ :not(template) { --divide-opacity: 0.84 !important; } .sm\:divide-opacity-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; } .sm\:sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .sm\:not-sr-only { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .sm\:focus\:sr-only:focus { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .sm\:focus\:not-sr-only:focus { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .sm\:appearance-none { -webkit-appearance: none !important; -moz-appearance: none !important; appearance: none !important; } .sm\:bg-fixed { background-attachment: fixed !important; } .sm\:bg-local { background-attachment: local !important; } .sm\:bg-scroll { background-attachment: scroll !important; } .sm\:bg-opacity-0 { --bg-opacity: 0 !important; } .sm\:bg-opacity-12 { --bg-opacity: 0.12 !important; } .sm\:bg-opacity-25 { --bg-opacity: 0.25 !important; } .sm\:bg-opacity-38 { --bg-opacity: 0.38 !important; } .sm\:bg-opacity-50 { --bg-opacity: 0.5 !important; } .sm\:bg-opacity-54 { --bg-opacity: 0.54 !important; } .sm\:bg-opacity-70 { --bg-opacity: 0.70 !important; } .sm\:bg-opacity-75 { --bg-opacity: 0.75 !important; } .sm\:bg-opacity-84 { --bg-opacity: 0.84 !important; } .sm\:bg-opacity-100 { --bg-opacity: 1 !important; } .sm\:hover\:bg-opacity-0:hover { --bg-opacity: 0 !important; } .sm\:hover\:bg-opacity-12:hover { --bg-opacity: 0.12 !important; } .sm\:hover\:bg-opacity-25:hover { --bg-opacity: 0.25 !important; } .sm\:hover\:bg-opacity-38:hover { --bg-opacity: 0.38 !important; } .sm\:hover\:bg-opacity-50:hover { --bg-opacity: 0.5 !important; } .sm\:hover\:bg-opacity-54:hover { --bg-opacity: 0.54 !important; } .sm\:hover\:bg-opacity-70:hover { --bg-opacity: 0.70 !important; } .sm\:hover\:bg-opacity-75:hover { --bg-opacity: 0.75 !important; } .sm\:hover\:bg-opacity-84:hover { --bg-opacity: 0.84 !important; } .sm\:hover\:bg-opacity-100:hover { --bg-opacity: 1 !important; } .sm\:focus\:bg-opacity-0:focus { --bg-opacity: 0 !important; } .sm\:focus\:bg-opacity-12:focus { --bg-opacity: 0.12 !important; } .sm\:focus\:bg-opacity-25:focus { --bg-opacity: 0.25 !important; } .sm\:focus\:bg-opacity-38:focus { --bg-opacity: 0.38 !important; } .sm\:focus\:bg-opacity-50:focus { --bg-opacity: 0.5 !important; } .sm\:focus\:bg-opacity-54:focus { --bg-opacity: 0.54 !important; } .sm\:focus\:bg-opacity-70:focus { --bg-opacity: 0.70 !important; } .sm\:focus\:bg-opacity-75:focus { --bg-opacity: 0.75 !important; } .sm\:focus\:bg-opacity-84:focus { --bg-opacity: 0.84 !important; } .sm\:focus\:bg-opacity-100:focus { --bg-opacity: 1 !important; } .sm\:bg-bottom { background-position: bottom !important; } .sm\:bg-center { background-position: center !important; } .sm\:bg-left { background-position: left !important; } .sm\:bg-left-bottom { background-position: left bottom !important; } .sm\:bg-left-top { background-position: left top !important; } .sm\:bg-right { background-position: right !important; } .sm\:bg-right-bottom { background-position: right bottom !important; } .sm\:bg-right-top { background-position: right top !important; } .sm\:bg-top { background-position: top !important; } .sm\:bg-repeat { background-repeat: repeat !important; } .sm\:bg-no-repeat { background-repeat: no-repeat !important; } .sm\:bg-repeat-x { background-repeat: repeat-x !important; } .sm\:bg-repeat-y { background-repeat: repeat-y !important; } .sm\:bg-repeat-round { background-repeat: round !important; } .sm\:bg-repeat-space { background-repeat: space !important; } .sm\:bg-auto { background-size: auto !important; } .sm\:bg-cover { background-size: cover !important; } .sm\:bg-contain { background-size: contain !important; } .sm\:border-collapse { border-collapse: collapse !important; } .sm\:border-separate { border-collapse: separate !important; } .sm\:border-opacity-0 { --border-opacity: 0 !important; } .sm\:border-opacity-12 { --border-opacity: 0.12 !important; } .sm\:border-opacity-25 { --border-opacity: 0.25 !important; } .sm\:border-opacity-38 { --border-opacity: 0.38 !important; } .sm\:border-opacity-50 { --border-opacity: 0.5 !important; } .sm\:border-opacity-54 { --border-opacity: 0.54 !important; } .sm\:border-opacity-70 { --border-opacity: 0.70 !important; } .sm\:border-opacity-75 { --border-opacity: 0.75 !important; } .sm\:border-opacity-84 { --border-opacity: 0.84 !important; } .sm\:border-opacity-100 { --border-opacity: 1 !important; } .sm\:hover\:border-opacity-0:hover { --border-opacity: 0 !important; } .sm\:hover\:border-opacity-12:hover { --border-opacity: 0.12 !important; } .sm\:hover\:border-opacity-25:hover { --border-opacity: 0.25 !important; } .sm\:hover\:border-opacity-38:hover { --border-opacity: 0.38 !important; } .sm\:hover\:border-opacity-50:hover { --border-opacity: 0.5 !important; } .sm\:hover\:border-opacity-54:hover { --border-opacity: 0.54 !important; } .sm\:hover\:border-opacity-70:hover { --border-opacity: 0.70 !important; } .sm\:hover\:border-opacity-75:hover { --border-opacity: 0.75 !important; } .sm\:hover\:border-opacity-84:hover { --border-opacity: 0.84 !important; } .sm\:hover\:border-opacity-100:hover { --border-opacity: 1 !important; } .sm\:focus\:border-opacity-0:focus { --border-opacity: 0 !important; } .sm\:focus\:border-opacity-12:focus { --border-opacity: 0.12 !important; } .sm\:focus\:border-opacity-25:focus { --border-opacity: 0.25 !important; } .sm\:focus\:border-opacity-38:focus { --border-opacity: 0.38 !important; } .sm\:focus\:border-opacity-50:focus { --border-opacity: 0.5 !important; } .sm\:focus\:border-opacity-54:focus { --border-opacity: 0.54 !important; } .sm\:focus\:border-opacity-70:focus { --border-opacity: 0.70 !important; } .sm\:focus\:border-opacity-75:focus { --border-opacity: 0.75 !important; } .sm\:focus\:border-opacity-84:focus { --border-opacity: 0.84 !important; } .sm\:focus\:border-opacity-100:focus { --border-opacity: 1 !important; } .sm\:rounded-none { border-radius: 0 !important; } .sm\:rounded-sm { border-radius: 0.125rem !important; } .sm\:rounded { border-radius: 0.25rem !important; } .sm\:rounded-md { border-radius: 0.375rem !important; } .sm\:rounded-lg { border-radius: 0.5rem !important; } .sm\:rounded-full { border-radius: 9999px !important; } .sm\:rounded-t-none { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } .sm\:rounded-r-none { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } .sm\:rounded-b-none { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } .sm\:rounded-l-none { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; } .sm\:rounded-t-sm { border-top-left-radius: 0.125rem !important; border-top-right-radius: 0.125rem !important; } .sm\:rounded-r-sm { border-top-right-radius: 0.125rem !important; border-bottom-right-radius: 0.125rem !important; } .sm\:rounded-b-sm { border-bottom-right-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .sm\:rounded-l-sm { border-top-left-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .sm\:rounded-t { border-top-left-radius: 0.25rem !important; border-top-right-radius: 0.25rem !important; } .sm\:rounded-r { border-top-right-radius: 0.25rem !important; border-bottom-right-radius: 0.25rem !important; } .sm\:rounded-b { border-bottom-right-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .sm\:rounded-l { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .sm\:rounded-t-md { border-top-left-radius: 0.375rem !important; border-top-right-radius: 0.375rem !important; } .sm\:rounded-r-md { border-top-right-radius: 0.375rem !important; border-bottom-right-radius: 0.375rem !important; } .sm\:rounded-b-md { border-bottom-right-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .sm\:rounded-l-md { border-top-left-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .sm\:rounded-t-lg { border-top-left-radius: 0.5rem !important; border-top-right-radius: 0.5rem !important; } .sm\:rounded-r-lg { border-top-right-radius: 0.5rem !important; border-bottom-right-radius: 0.5rem !important; } .sm\:rounded-b-lg { border-bottom-right-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .sm\:rounded-l-lg { border-top-left-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .sm\:rounded-t-full { border-top-left-radius: 9999px !important; border-top-right-radius: 9999px !important; } .sm\:rounded-r-full { border-top-right-radius: 9999px !important; border-bottom-right-radius: 9999px !important; } .sm\:rounded-b-full { border-bottom-right-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .sm\:rounded-l-full { border-top-left-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .sm\:rounded-tl-none { border-top-left-radius: 0 !important; } .sm\:rounded-tr-none { border-top-right-radius: 0 !important; } .sm\:rounded-br-none { border-bottom-right-radius: 0 !important; } .sm\:rounded-bl-none { border-bottom-left-radius: 0 !important; } .sm\:rounded-tl-sm { border-top-left-radius: 0.125rem !important; } .sm\:rounded-tr-sm { border-top-right-radius: 0.125rem !important; } .sm\:rounded-br-sm { border-bottom-right-radius: 0.125rem !important; } .sm\:rounded-bl-sm { border-bottom-left-radius: 0.125rem !important; } .sm\:rounded-tl { border-top-left-radius: 0.25rem !important; } .sm\:rounded-tr { border-top-right-radius: 0.25rem !important; } .sm\:rounded-br { border-bottom-right-radius: 0.25rem !important; } .sm\:rounded-bl { border-bottom-left-radius: 0.25rem !important; } .sm\:rounded-tl-md { border-top-left-radius: 0.375rem !important; } .sm\:rounded-tr-md { border-top-right-radius: 0.375rem !important; } .sm\:rounded-br-md { border-bottom-right-radius: 0.375rem !important; } .sm\:rounded-bl-md { border-bottom-left-radius: 0.375rem !important; } .sm\:rounded-tl-lg { border-top-left-radius: 0.5rem !important; } .sm\:rounded-tr-lg { border-top-right-radius: 0.5rem !important; } .sm\:rounded-br-lg { border-bottom-right-radius: 0.5rem !important; } .sm\:rounded-bl-lg { border-bottom-left-radius: 0.5rem !important; } .sm\:rounded-tl-full { border-top-left-radius: 9999px !important; } .sm\:rounded-tr-full { border-top-right-radius: 9999px !important; } .sm\:rounded-br-full { border-bottom-right-radius: 9999px !important; } .sm\:rounded-bl-full { border-bottom-left-radius: 9999px !important; } .sm\:border-solid { border-style: solid !important; } .sm\:border-dashed { border-style: dashed !important; } .sm\:border-dotted { border-style: dotted !important; } .sm\:border-double { border-style: double !important; } .sm\:border-none { border-style: none !important; } .sm\:border-0 { border-width: 0 !important; } .sm\:border-2 { border-width: 2px !important; } .sm\:border-4 { border-width: 4px !important; } .sm\:border-8 { border-width: 8px !important; } .sm\:border { border-width: 1px !important; } .sm\:border-t-0 { border-top-width: 0 !important; } .sm\:border-r-0 { border-right-width: 0 !important; } .sm\:border-b-0 { border-bottom-width: 0 !important; } .sm\:border-l-0 { border-left-width: 0 !important; } .sm\:border-t-2 { border-top-width: 2px !important; } .sm\:border-r-2 { border-right-width: 2px !important; } .sm\:border-b-2 { border-bottom-width: 2px !important; } .sm\:border-l-2 { border-left-width: 2px !important; } .sm\:border-t-4 { border-top-width: 4px !important; } .sm\:border-r-4 { border-right-width: 4px !important; } .sm\:border-b-4 { border-bottom-width: 4px !important; } .sm\:border-l-4 { border-left-width: 4px !important; } .sm\:border-t-8 { border-top-width: 8px !important; } .sm\:border-r-8 { border-right-width: 8px !important; } .sm\:border-b-8 { border-bottom-width: 8px !important; } .sm\:border-l-8 { border-left-width: 8px !important; } .sm\:border-t { border-top-width: 1px !important; } .sm\:border-r { border-right-width: 1px !important; } .sm\:border-b { border-bottom-width: 1px !important; } .sm\:border-l { border-left-width: 1px !important; } .sm\:first\:border-0:first-child { border-width: 0 !important; } .sm\:first\:border-2:first-child { border-width: 2px !important; } .sm\:first\:border-4:first-child { border-width: 4px !important; } .sm\:first\:border-8:first-child { border-width: 8px !important; } .sm\:first\:border:first-child { border-width: 1px !important; } .sm\:first\:border-t-0:first-child { border-top-width: 0 !important; } .sm\:first\:border-r-0:first-child { border-right-width: 0 !important; } .sm\:first\:border-b-0:first-child { border-bottom-width: 0 !important; } .sm\:first\:border-l-0:first-child { border-left-width: 0 !important; } .sm\:first\:border-t-2:first-child { border-top-width: 2px !important; } .sm\:first\:border-r-2:first-child { border-right-width: 2px !important; } .sm\:first\:border-b-2:first-child { border-bottom-width: 2px !important; } .sm\:first\:border-l-2:first-child { border-left-width: 2px !important; } .sm\:first\:border-t-4:first-child { border-top-width: 4px !important; } .sm\:first\:border-r-4:first-child { border-right-width: 4px !important; } .sm\:first\:border-b-4:first-child { border-bottom-width: 4px !important; } .sm\:first\:border-l-4:first-child { border-left-width: 4px !important; } .sm\:first\:border-t-8:first-child { border-top-width: 8px !important; } .sm\:first\:border-r-8:first-child { border-right-width: 8px !important; } .sm\:first\:border-b-8:first-child { border-bottom-width: 8px !important; } .sm\:first\:border-l-8:first-child { border-left-width: 8px !important; } .sm\:first\:border-t:first-child { border-top-width: 1px !important; } .sm\:first\:border-r:first-child { border-right-width: 1px !important; } .sm\:first\:border-b:first-child { border-bottom-width: 1px !important; } .sm\:first\:border-l:first-child { border-left-width: 1px !important; } .sm\:last\:border-0:last-child { border-width: 0 !important; } .sm\:last\:border-2:last-child { border-width: 2px !important; } .sm\:last\:border-4:last-child { border-width: 4px !important; } .sm\:last\:border-8:last-child { border-width: 8px !important; } .sm\:last\:border:last-child { border-width: 1px !important; } .sm\:last\:border-t-0:last-child { border-top-width: 0 !important; } .sm\:last\:border-r-0:last-child { border-right-width: 0 !important; } .sm\:last\:border-b-0:last-child { border-bottom-width: 0 !important; } .sm\:last\:border-l-0:last-child { border-left-width: 0 !important; } .sm\:last\:border-t-2:last-child { border-top-width: 2px !important; } .sm\:last\:border-r-2:last-child { border-right-width: 2px !important; } .sm\:last\:border-b-2:last-child { border-bottom-width: 2px !important; } .sm\:last\:border-l-2:last-child { border-left-width: 2px !important; } .sm\:last\:border-t-4:last-child { border-top-width: 4px !important; } .sm\:last\:border-r-4:last-child { border-right-width: 4px !important; } .sm\:last\:border-b-4:last-child { border-bottom-width: 4px !important; } .sm\:last\:border-l-4:last-child { border-left-width: 4px !important; } .sm\:last\:border-t-8:last-child { border-top-width: 8px !important; } .sm\:last\:border-r-8:last-child { border-right-width: 8px !important; } .sm\:last\:border-b-8:last-child { border-bottom-width: 8px !important; } .sm\:last\:border-l-8:last-child { border-left-width: 8px !important; } .sm\:last\:border-t:last-child { border-top-width: 1px !important; } .sm\:last\:border-r:last-child { border-right-width: 1px !important; } .sm\:last\:border-b:last-child { border-bottom-width: 1px !important; } .sm\:last\:border-l:last-child { border-left-width: 1px !important; } .sm\:box-border { box-sizing: border-box !important; } .sm\:box-content { box-sizing: content-box !important; } .sm\:block { display: block !important; } .sm\:inline-block { display: inline-block !important; } .sm\:inline { display: inline !important; } .sm\:flex { display: flex !important; } .sm\:inline-flex { display: inline-flex !important; } .sm\:table { display: table !important; } .sm\:table-caption { display: table-caption !important; } .sm\:table-cell { display: table-cell !important; } .sm\:table-column { display: table-column !important; } .sm\:table-column-group { display: table-column-group !important; } .sm\:table-footer-group { display: table-footer-group !important; } .sm\:table-header-group { display: table-header-group !important; } .sm\:table-row-group { display: table-row-group !important; } .sm\:table-row { display: table-row !important; } .sm\:flow-root { display: flow-root !important; } .sm\:grid { display: grid !important; } .sm\:inline-grid { display: inline-grid !important; } .sm\:hidden { display: none !important; } .sm\:flex-row { flex-direction: row !important; } .sm\:flex-row-reverse { flex-direction: row-reverse !important; } .sm\:flex-col { flex-direction: column !important; } .sm\:flex-col-reverse { flex-direction: column-reverse !important; } .sm\:flex-wrap { flex-wrap: wrap !important; } .sm\:flex-wrap-reverse { flex-wrap: wrap-reverse !important; } .sm\:flex-no-wrap { flex-wrap: nowrap !important; } .sm\:items-start { align-items: flex-start !important; } .sm\:items-end { align-items: flex-end !important; } .sm\:items-center { align-items: center !important; } .sm\:items-baseline { align-items: baseline !important; } .sm\:items-stretch { align-items: stretch !important; } .sm\:self-auto { align-self: auto !important; } .sm\:self-start { align-self: flex-start !important; } .sm\:self-end { align-self: flex-end !important; } .sm\:self-center { align-self: center !important; } .sm\:self-stretch { align-self: stretch !important; } .sm\:justify-start { justify-content: flex-start !important; } .sm\:justify-end { justify-content: flex-end !important; } .sm\:justify-center { justify-content: center !important; } .sm\:justify-between { justify-content: space-between !important; } .sm\:justify-around { justify-content: space-around !important; } .sm\:justify-evenly { justify-content: space-evenly !important; } .sm\:content-center { align-content: center !important; } .sm\:content-start { align-content: flex-start !important; } .sm\:content-end { align-content: flex-end !important; } .sm\:content-between { align-content: space-between !important; } .sm\:content-around { align-content: space-around !important; } .sm\:flex-0 { flex: 0 0 auto !important; } .sm\:flex-1 { flex: 1 1 0% !important; } .sm\:flex-auto { flex: 1 1 auto !important; } .sm\:flex-initial { flex: 0 1 auto !important; } .sm\:flex-none { flex: none !important; } .sm\:flex-grow-0 { flex-grow: 0 !important; } .sm\:flex-grow { flex-grow: 1 !important; } .sm\:flex-shrink-0 { flex-shrink: 0 !important; } .sm\:flex-shrink { flex-shrink: 1 !important; } .sm\:order-1 { order: 1 !important; } .sm\:order-2 { order: 2 !important; } .sm\:order-3 { order: 3 !important; } .sm\:order-4 { order: 4 !important; } .sm\:order-5 { order: 5 !important; } .sm\:order-6 { order: 6 !important; } .sm\:order-7 { order: 7 !important; } .sm\:order-8 { order: 8 !important; } .sm\:order-9 { order: 9 !important; } .sm\:order-10 { order: 10 !important; } .sm\:order-11 { order: 11 !important; } .sm\:order-12 { order: 12 !important; } .sm\:order-first { order: -9999 !important; } .sm\:order-last { order: 9999 !important; } .sm\:order-none { order: 0 !important; } .sm\:font-hairline { font-weight: 100 !important; } .sm\:font-thin { font-weight: 200 !important; } .sm\:font-light { font-weight: 300 !important; } .sm\:font-normal { font-weight: 400 !important; } .sm\:font-medium { font-weight: 500 !important; } .sm\:font-semibold { font-weight: 600 !important; } .sm\:font-bold { font-weight: 700 !important; } .sm\:font-extrabold { font-weight: 800 !important; } .sm\:font-black { font-weight: 900 !important; } .sm\:h-0 { height: 0 !important; } .sm\:h-1 { height: 0.25rem !important; } .sm\:h-2 { height: 0.5rem !important; } .sm\:h-3 { height: 0.75rem !important; } .sm\:h-4 { height: 1rem !important; } .sm\:h-5 { height: 1.25rem !important; } .sm\:h-6 { height: 1.5rem !important; } .sm\:h-8 { height: 2rem !important; } .sm\:h-10 { height: 2.5rem !important; } .sm\:h-12 { height: 3rem !important; } .sm\:h-14 { height: 3.5rem !important; } .sm\:h-16 { height: 4rem !important; } .sm\:h-18 { height: 4.5rem !important; } .sm\:h-20 { height: 5rem !important; } .sm\:h-22 { height: 5.5rem !important; } .sm\:h-24 { height: 6rem !important; } .sm\:h-26 { height: 6.5rem !important; } .sm\:h-28 { height: 7rem !important; } .sm\:h-30 { height: 7.5rem !important; } .sm\:h-32 { height: 8rem !important; } .sm\:h-36 { height: 9rem !important; } .sm\:h-40 { height: 10rem !important; } .sm\:h-48 { height: 12rem !important; } .sm\:h-50 { height: 12.5rem !important; } .sm\:h-56 { height: 14rem !important; } .sm\:h-60 { height: 15rem !important; } .sm\:h-64 { height: 16rem !important; } .sm\:h-80 { height: 20rem !important; } .sm\:h-90 { height: 24rem !important; } .sm\:h-100 { height: 25rem !important; } .sm\:h-120 { height: 30rem !important; } .sm\:h-128 { height: 32rem !important; } .sm\:h-140 { height: 35rem !important; } .sm\:h-160 { height: 40rem !important; } .sm\:h-180 { height: 45rem !important; } .sm\:h-192 { height: 48rem !important; } .sm\:h-200 { height: 50rem !important; } .sm\:h-240 { height: 60rem !important; } .sm\:h-256 { height: 64rem !important; } .sm\:h-280 { height: 70rem !important; } .sm\:h-320 { height: 80rem !important; } .sm\:h-360 { height: 90rem !important; } .sm\:h-400 { height: 100rem !important; } .sm\:h-480 { height: 120rem !important; } .sm\:h-auto { height: auto !important; } .sm\:h-px { height: 1px !important; } .sm\:h-2px { height: 2px !important; } .sm\:h-full { height: 100% !important; } .sm\:h-screen { height: 100vh !important; } .sm\:h-1\/2 { height: 50% !important; } .sm\:h-1\/3 { height: 33.33333% !important; } .sm\:h-2\/3 { height: 66.66667% !important; } .sm\:h-1\/4 { height: 25% !important; } .sm\:h-2\/4 { height: 50% !important; } .sm\:h-3\/4 { height: 75% !important; } .sm\:h-1\/5 { height: 20% !important; } .sm\:h-2\/5 { height: 40% !important; } .sm\:h-3\/5 { height: 60% !important; } .sm\:h-4\/5 { height: 80% !important; } .sm\:h-1\/12 { height: 8.33333% !important; } .sm\:h-2\/12 { height: 16.66667% !important; } .sm\:h-3\/12 { height: 25% !important; } .sm\:h-4\/12 { height: 33.33333% !important; } .sm\:h-5\/12 { height: 41.66667% !important; } .sm\:h-6\/12 { height: 50% !important; } .sm\:h-7\/12 { height: 58.33333% !important; } .sm\:h-8\/12 { height: 66.66667% !important; } .sm\:h-9\/12 { height: 75% !important; } .sm\:h-10\/12 { height: 83.33333% !important; } .sm\:h-11\/12 { height: 91.66667% !important; } .sm\:text-xs { font-size: 0.625rem !important; } .sm\:text-sm { font-size: 0.75rem !important; } .sm\:text-md { font-size: 0.8125rem !important; } .sm\:text-base { font-size: 0.875rem !important; } .sm\:text-lg { font-size: 1rem !important; } .sm\:text-xl { font-size: 1.125rem !important; } .sm\:text-2xl { font-size: 1.25rem !important; } .sm\:text-3xl { font-size: 1.5rem !important; } .sm\:text-4xl { font-size: 2rem !important; } .sm\:text-5xl { font-size: 2.25rem !important; } .sm\:text-6xl { font-size: 2.5rem !important; } .sm\:text-7xl { font-size: 3rem !important; } .sm\:text-8xl { font-size: 4rem !important; } .sm\:text-9xl { font-size: 6rem !important; } .sm\:text-10xl { font-size: 8rem !important; } .sm\:leading-3 { line-height: .75rem !important; } .sm\:leading-4 { line-height: 1rem !important; } .sm\:leading-5 { line-height: 1.25rem !important; } .sm\:leading-6 { line-height: 1.5rem !important; } .sm\:leading-7 { line-height: 1.75rem !important; } .sm\:leading-8 { line-height: 2rem !important; } .sm\:leading-9 { line-height: 2.25rem !important; } .sm\:leading-10 { line-height: 2.5rem !important; } .sm\:leading-none { line-height: 1 !important; } .sm\:leading-tight { line-height: 1.25 !important; } .sm\:leading-snug { line-height: 1.375 !important; } .sm\:leading-normal { line-height: 1.5 !important; } .sm\:leading-relaxed { line-height: 1.625 !important; } .sm\:leading-loose { line-height: 2 !important; } .sm\:list-inside { list-style-position: inside !important; } .sm\:list-outside { list-style-position: outside !important; } .sm\:list-none { list-style-type: none !important; } .sm\:list-disc { list-style-type: disc !important; } .sm\:list-decimal { list-style-type: decimal !important; } .sm\:m-0 { margin: 0 !important; } .sm\:m-1 { margin: 0.25rem !important; } .sm\:m-2 { margin: 0.5rem !important; } .sm\:m-3 { margin: 0.75rem !important; } .sm\:m-4 { margin: 1rem !important; } .sm\:m-5 { margin: 1.25rem !important; } .sm\:m-6 { margin: 1.5rem !important; } .sm\:m-8 { margin: 2rem !important; } .sm\:m-10 { margin: 2.5rem !important; } .sm\:m-12 { margin: 3rem !important; } .sm\:m-14 { margin: 3.5rem !important; } .sm\:m-16 { margin: 4rem !important; } .sm\:m-18 { margin: 4.5rem !important; } .sm\:m-20 { margin: 5rem !important; } .sm\:m-22 { margin: 5.5rem !important; } .sm\:m-24 { margin: 6rem !important; } .sm\:m-26 { margin: 6.5rem !important; } .sm\:m-28 { margin: 7rem !important; } .sm\:m-30 { margin: 7.5rem !important; } .sm\:m-32 { margin: 8rem !important; } .sm\:m-36 { margin: 9rem !important; } .sm\:m-40 { margin: 10rem !important; } .sm\:m-48 { margin: 12rem !important; } .sm\:m-56 { margin: 14rem !important; } .sm\:m-64 { margin: 16rem !important; } .sm\:m-auto { margin: auto !important; } .sm\:m-px { margin: 1px !important; } .sm\:m-2px { margin: 2px !important; } .sm\:-m-1 { margin: -0.25rem !important; } .sm\:-m-2 { margin: -0.5rem !important; } .sm\:-m-3 { margin: -0.75rem !important; } .sm\:-m-4 { margin: -1rem !important; } .sm\:-m-5 { margin: -1.25rem !important; } .sm\:-m-6 { margin: -1.5rem !important; } .sm\:-m-8 { margin: -2rem !important; } .sm\:-m-10 { margin: -2.5rem !important; } .sm\:-m-12 { margin: -3rem !important; } .sm\:-m-14 { margin: -3.5rem !important; } .sm\:-m-16 { margin: -4rem !important; } .sm\:-m-18 { margin: -4.5rem !important; } .sm\:-m-20 { margin: -5rem !important; } .sm\:-m-22 { margin: -5.5rem !important; } .sm\:-m-24 { margin: -6rem !important; } .sm\:-m-26 { margin: -6.5rem !important; } .sm\:-m-28 { margin: -7rem !important; } .sm\:-m-30 { margin: -7.5rem !important; } .sm\:-m-32 { margin: -8rem !important; } .sm\:-m-36 { margin: -9rem !important; } .sm\:-m-40 { margin: -10rem !important; } .sm\:-m-48 { margin: -12rem !important; } .sm\:-m-56 { margin: -14rem !important; } .sm\:-m-64 { margin: -16rem !important; } .sm\:-m-px { margin: -1px !important; } .sm\:-m-2px { margin: -2px !important; } .sm\:my-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .sm\:mx-0 { margin-left: 0 !important; margin-right: 0 !important; } .sm\:my-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .sm\:mx-1 { margin-left: 0.25rem !important; margin-right: 0.25rem !important; } .sm\:my-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .sm\:mx-2 { margin-left: 0.5rem !important; margin-right: 0.5rem !important; } .sm\:my-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .sm\:mx-3 { margin-left: 0.75rem !important; margin-right: 0.75rem !important; } .sm\:my-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .sm\:mx-4 { margin-left: 1rem !important; margin-right: 1rem !important; } .sm\:my-5 { margin-top: 1.25rem !important; margin-bottom: 1.25rem !important; } .sm\:mx-5 { margin-left: 1.25rem !important; margin-right: 1.25rem !important; } .sm\:my-6 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .sm\:mx-6 { margin-left: 1.5rem !important; margin-right: 1.5rem !important; } .sm\:my-8 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .sm\:mx-8 { margin-left: 2rem !important; margin-right: 2rem !important; } .sm\:my-10 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .sm\:mx-10 { margin-left: 2.5rem !important; margin-right: 2.5rem !important; } .sm\:my-12 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .sm\:mx-12 { margin-left: 3rem !important; margin-right: 3rem !important; } .sm\:my-14 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .sm\:mx-14 { margin-left: 3.5rem !important; margin-right: 3.5rem !important; } .sm\:my-16 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .sm\:mx-16 { margin-left: 4rem !important; margin-right: 4rem !important; } .sm\:my-18 { margin-top: 4.5rem !important; margin-bottom: 4.5rem !important; } .sm\:mx-18 { margin-left: 4.5rem !important; margin-right: 4.5rem !important; } .sm\:my-20 { margin-top: 5rem !important; margin-bottom: 5rem !important; } .sm\:mx-20 { margin-left: 5rem !important; margin-right: 5rem !important; } .sm\:my-22 { margin-top: 5.5rem !important; margin-bottom: 5.5rem !important; } .sm\:mx-22 { margin-left: 5.5rem !important; margin-right: 5.5rem !important; } .sm\:my-24 { margin-top: 6rem !important; margin-bottom: 6rem !important; } .sm\:mx-24 { margin-left: 6rem !important; margin-right: 6rem !important; } .sm\:my-26 { margin-top: 6.5rem !important; margin-bottom: 6.5rem !important; } .sm\:mx-26 { margin-left: 6.5rem !important; margin-right: 6.5rem !important; } .sm\:my-28 { margin-top: 7rem !important; margin-bottom: 7rem !important; } .sm\:mx-28 { margin-left: 7rem !important; margin-right: 7rem !important; } .sm\:my-30 { margin-top: 7.5rem !important; margin-bottom: 7.5rem !important; } .sm\:mx-30 { margin-left: 7.5rem !important; margin-right: 7.5rem !important; } .sm\:my-32 { margin-top: 8rem !important; margin-bottom: 8rem !important; } .sm\:mx-32 { margin-left: 8rem !important; margin-right: 8rem !important; } .sm\:my-36 { margin-top: 9rem !important; margin-bottom: 9rem !important; } .sm\:mx-36 { margin-left: 9rem !important; margin-right: 9rem !important; } .sm\:my-40 { margin-top: 10rem !important; margin-bottom: 10rem !important; } .sm\:mx-40 { margin-left: 10rem !important; margin-right: 10rem !important; } .sm\:my-48 { margin-top: 12rem !important; margin-bottom: 12rem !important; } .sm\:mx-48 { margin-left: 12rem !important; margin-right: 12rem !important; } .sm\:my-56 { margin-top: 14rem !important; margin-bottom: 14rem !important; } .sm\:mx-56 { margin-left: 14rem !important; margin-right: 14rem !important; } .sm\:my-64 { margin-top: 16rem !important; margin-bottom: 16rem !important; } .sm\:mx-64 { margin-left: 16rem !important; margin-right: 16rem !important; } .sm\:my-auto { margin-top: auto !important; margin-bottom: auto !important; } .sm\:mx-auto { margin-left: auto !important; margin-right: auto !important; } .sm\:my-px { margin-top: 1px !important; margin-bottom: 1px !important; } .sm\:mx-px { margin-left: 1px !important; margin-right: 1px !important; } .sm\:my-2px { margin-top: 2px !important; margin-bottom: 2px !important; } .sm\:mx-2px { margin-left: 2px !important; margin-right: 2px !important; } .sm\:-my-1 { margin-top: -0.25rem !important; margin-bottom: -0.25rem !important; } .sm\:-mx-1 { margin-left: -0.25rem !important; margin-right: -0.25rem !important; } .sm\:-my-2 { margin-top: -0.5rem !important; margin-bottom: -0.5rem !important; } .sm\:-mx-2 { margin-left: -0.5rem !important; margin-right: -0.5rem !important; } .sm\:-my-3 { margin-top: -0.75rem !important; margin-bottom: -0.75rem !important; } .sm\:-mx-3 { margin-left: -0.75rem !important; margin-right: -0.75rem !important; } .sm\:-my-4 { margin-top: -1rem !important; margin-bottom: -1rem !important; } .sm\:-mx-4 { margin-left: -1rem !important; margin-right: -1rem !important; } .sm\:-my-5 { margin-top: -1.25rem !important; margin-bottom: -1.25rem !important; } .sm\:-mx-5 { margin-left: -1.25rem !important; margin-right: -1.25rem !important; } .sm\:-my-6 { margin-top: -1.5rem !important; margin-bottom: -1.5rem !important; } .sm\:-mx-6 { margin-left: -1.5rem !important; margin-right: -1.5rem !important; } .sm\:-my-8 { margin-top: -2rem !important; margin-bottom: -2rem !important; } .sm\:-mx-8 { margin-left: -2rem !important; margin-right: -2rem !important; } .sm\:-my-10 { margin-top: -2.5rem !important; margin-bottom: -2.5rem !important; } .sm\:-mx-10 { margin-left: -2.5rem !important; margin-right: -2.5rem !important; } .sm\:-my-12 { margin-top: -3rem !important; margin-bottom: -3rem !important; } .sm\:-mx-12 { margin-left: -3rem !important; margin-right: -3rem !important; } .sm\:-my-14 { margin-top: -3.5rem !important; margin-bottom: -3.5rem !important; } .sm\:-mx-14 { margin-left: -3.5rem !important; margin-right: -3.5rem !important; } .sm\:-my-16 { margin-top: -4rem !important; margin-bottom: -4rem !important; } .sm\:-mx-16 { margin-left: -4rem !important; margin-right: -4rem !important; } .sm\:-my-18 { margin-top: -4.5rem !important; margin-bottom: -4.5rem !important; } .sm\:-mx-18 { margin-left: -4.5rem !important; margin-right: -4.5rem !important; } .sm\:-my-20 { margin-top: -5rem !important; margin-bottom: -5rem !important; } .sm\:-mx-20 { margin-left: -5rem !important; margin-right: -5rem !important; } .sm\:-my-22 { margin-top: -5.5rem !important; margin-bottom: -5.5rem !important; } .sm\:-mx-22 { margin-left: -5.5rem !important; margin-right: -5.5rem !important; } .sm\:-my-24 { margin-top: -6rem !important; margin-bottom: -6rem !important; } .sm\:-mx-24 { margin-left: -6rem !important; margin-right: -6rem !important; } .sm\:-my-26 { margin-top: -6.5rem !important; margin-bottom: -6.5rem !important; } .sm\:-mx-26 { margin-left: -6.5rem !important; margin-right: -6.5rem !important; } .sm\:-my-28 { margin-top: -7rem !important; margin-bottom: -7rem !important; } .sm\:-mx-28 { margin-left: -7rem !important; margin-right: -7rem !important; } .sm\:-my-30 { margin-top: -7.5rem !important; margin-bottom: -7.5rem !important; } .sm\:-mx-30 { margin-left: -7.5rem !important; margin-right: -7.5rem !important; } .sm\:-my-32 { margin-top: -8rem !important; margin-bottom: -8rem !important; } .sm\:-mx-32 { margin-left: -8rem !important; margin-right: -8rem !important; } .sm\:-my-36 { margin-top: -9rem !important; margin-bottom: -9rem !important; } .sm\:-mx-36 { margin-left: -9rem !important; margin-right: -9rem !important; } .sm\:-my-40 { margin-top: -10rem !important; margin-bottom: -10rem !important; } .sm\:-mx-40 { margin-left: -10rem !important; margin-right: -10rem !important; } .sm\:-my-48 { margin-top: -12rem !important; margin-bottom: -12rem !important; } .sm\:-mx-48 { margin-left: -12rem !important; margin-right: -12rem !important; } .sm\:-my-56 { margin-top: -14rem !important; margin-bottom: -14rem !important; } .sm\:-mx-56 { margin-left: -14rem !important; margin-right: -14rem !important; } .sm\:-my-64 { margin-top: -16rem !important; margin-bottom: -16rem !important; } .sm\:-mx-64 { margin-left: -16rem !important; margin-right: -16rem !important; } .sm\:-my-px { margin-top: -1px !important; margin-bottom: -1px !important; } .sm\:-mx-px { margin-left: -1px !important; margin-right: -1px !important; } .sm\:-my-2px { margin-top: -2px !important; margin-bottom: -2px !important; } .sm\:-mx-2px { margin-left: -2px !important; margin-right: -2px !important; } .sm\:mt-0 { margin-top: 0 !important; } .sm\:mr-0 { margin-right: 0 !important; } .sm\:mb-0 { margin-bottom: 0 !important; } .sm\:ml-0 { margin-left: 0 !important; } .sm\:mt-1 { margin-top: 0.25rem !important; } .sm\:mr-1 { margin-right: 0.25rem !important; } .sm\:mb-1 { margin-bottom: 0.25rem !important; } .sm\:ml-1 { margin-left: 0.25rem !important; } .sm\:mt-2 { margin-top: 0.5rem !important; } .sm\:mr-2 { margin-right: 0.5rem !important; } .sm\:mb-2 { margin-bottom: 0.5rem !important; } .sm\:ml-2 { margin-left: 0.5rem !important; } .sm\:mt-3 { margin-top: 0.75rem !important; } .sm\:mr-3 { margin-right: 0.75rem !important; } .sm\:mb-3 { margin-bottom: 0.75rem !important; } .sm\:ml-3 { margin-left: 0.75rem !important; } .sm\:mt-4 { margin-top: 1rem !important; } .sm\:mr-4 { margin-right: 1rem !important; } .sm\:mb-4 { margin-bottom: 1rem !important; } .sm\:ml-4 { margin-left: 1rem !important; } .sm\:mt-5 { margin-top: 1.25rem !important; } .sm\:mr-5 { margin-right: 1.25rem !important; } .sm\:mb-5 { margin-bottom: 1.25rem !important; } .sm\:ml-5 { margin-left: 1.25rem !important; } .sm\:mt-6 { margin-top: 1.5rem !important; } .sm\:mr-6 { margin-right: 1.5rem !important; } .sm\:mb-6 { margin-bottom: 1.5rem !important; } .sm\:ml-6 { margin-left: 1.5rem !important; } .sm\:mt-8 { margin-top: 2rem !important; } .sm\:mr-8 { margin-right: 2rem !important; } .sm\:mb-8 { margin-bottom: 2rem !important; } .sm\:ml-8 { margin-left: 2rem !important; } .sm\:mt-10 { margin-top: 2.5rem !important; } .sm\:mr-10 { margin-right: 2.5rem !important; } .sm\:mb-10 { margin-bottom: 2.5rem !important; } .sm\:ml-10 { margin-left: 2.5rem !important; } .sm\:mt-12 { margin-top: 3rem !important; } .sm\:mr-12 { margin-right: 3rem !important; } .sm\:mb-12 { margin-bottom: 3rem !important; } .sm\:ml-12 { margin-left: 3rem !important; } .sm\:mt-14 { margin-top: 3.5rem !important; } .sm\:mr-14 { margin-right: 3.5rem !important; } .sm\:mb-14 { margin-bottom: 3.5rem !important; } .sm\:ml-14 { margin-left: 3.5rem !important; } .sm\:mt-16 { margin-top: 4rem !important; } .sm\:mr-16 { margin-right: 4rem !important; } .sm\:mb-16 { margin-bottom: 4rem !important; } .sm\:ml-16 { margin-left: 4rem !important; } .sm\:mt-18 { margin-top: 4.5rem !important; } .sm\:mr-18 { margin-right: 4.5rem !important; } .sm\:mb-18 { margin-bottom: 4.5rem !important; } .sm\:ml-18 { margin-left: 4.5rem !important; } .sm\:mt-20 { margin-top: 5rem !important; } .sm\:mr-20 { margin-right: 5rem !important; } .sm\:mb-20 { margin-bottom: 5rem !important; } .sm\:ml-20 { margin-left: 5rem !important; } .sm\:mt-22 { margin-top: 5.5rem !important; } .sm\:mr-22 { margin-right: 5.5rem !important; } .sm\:mb-22 { margin-bottom: 5.5rem !important; } .sm\:ml-22 { margin-left: 5.5rem !important; } .sm\:mt-24 { margin-top: 6rem !important; } .sm\:mr-24 { margin-right: 6rem !important; } .sm\:mb-24 { margin-bottom: 6rem !important; } .sm\:ml-24 { margin-left: 6rem !important; } .sm\:mt-26 { margin-top: 6.5rem !important; } .sm\:mr-26 { margin-right: 6.5rem !important; } .sm\:mb-26 { margin-bottom: 6.5rem !important; } .sm\:ml-26 { margin-left: 6.5rem !important; } .sm\:mt-28 { margin-top: 7rem !important; } .sm\:mr-28 { margin-right: 7rem !important; } .sm\:mb-28 { margin-bottom: 7rem !important; } .sm\:ml-28 { margin-left: 7rem !important; } .sm\:mt-30 { margin-top: 7.5rem !important; } .sm\:mr-30 { margin-right: 7.5rem !important; } .sm\:mb-30 { margin-bottom: 7.5rem !important; } .sm\:ml-30 { margin-left: 7.5rem !important; } .sm\:mt-32 { margin-top: 8rem !important; } .sm\:mr-32 { margin-right: 8rem !important; } .sm\:mb-32 { margin-bottom: 8rem !important; } .sm\:ml-32 { margin-left: 8rem !important; } .sm\:mt-36 { margin-top: 9rem !important; } .sm\:mr-36 { margin-right: 9rem !important; } .sm\:mb-36 { margin-bottom: 9rem !important; } .sm\:ml-36 { margin-left: 9rem !important; } .sm\:mt-40 { margin-top: 10rem !important; } .sm\:mr-40 { margin-right: 10rem !important; } .sm\:mb-40 { margin-bottom: 10rem !important; } .sm\:ml-40 { margin-left: 10rem !important; } .sm\:mt-48 { margin-top: 12rem !important; } .sm\:mr-48 { margin-right: 12rem !important; } .sm\:mb-48 { margin-bottom: 12rem !important; } .sm\:ml-48 { margin-left: 12rem !important; } .sm\:mt-56 { margin-top: 14rem !important; } .sm\:mr-56 { margin-right: 14rem !important; } .sm\:mb-56 { margin-bottom: 14rem !important; } .sm\:ml-56 { margin-left: 14rem !important; } .sm\:mt-64 { margin-top: 16rem !important; } .sm\:mr-64 { margin-right: 16rem !important; } .sm\:mb-64 { margin-bottom: 16rem !important; } .sm\:ml-64 { margin-left: 16rem !important; } .sm\:mt-auto { margin-top: auto !important; } .sm\:mr-auto { margin-right: auto !important; } .sm\:mb-auto { margin-bottom: auto !important; } .sm\:ml-auto { margin-left: auto !important; } .sm\:mt-px { margin-top: 1px !important; } .sm\:mr-px { margin-right: 1px !important; } .sm\:mb-px { margin-bottom: 1px !important; } .sm\:ml-px { margin-left: 1px !important; } .sm\:mt-2px { margin-top: 2px !important; } .sm\:mr-2px { margin-right: 2px !important; } .sm\:mb-2px { margin-bottom: 2px !important; } .sm\:ml-2px { margin-left: 2px !important; } .sm\:-mt-1 { margin-top: -0.25rem !important; } .sm\:-mr-1 { margin-right: -0.25rem !important; } .sm\:-mb-1 { margin-bottom: -0.25rem !important; } .sm\:-ml-1 { margin-left: -0.25rem !important; } .sm\:-mt-2 { margin-top: -0.5rem !important; } .sm\:-mr-2 { margin-right: -0.5rem !important; } .sm\:-mb-2 { margin-bottom: -0.5rem !important; } .sm\:-ml-2 { margin-left: -0.5rem !important; } .sm\:-mt-3 { margin-top: -0.75rem !important; } .sm\:-mr-3 { margin-right: -0.75rem !important; } .sm\:-mb-3 { margin-bottom: -0.75rem !important; } .sm\:-ml-3 { margin-left: -0.75rem !important; } .sm\:-mt-4 { margin-top: -1rem !important; } .sm\:-mr-4 { margin-right: -1rem !important; } .sm\:-mb-4 { margin-bottom: -1rem !important; } .sm\:-ml-4 { margin-left: -1rem !important; } .sm\:-mt-5 { margin-top: -1.25rem !important; } .sm\:-mr-5 { margin-right: -1.25rem !important; } .sm\:-mb-5 { margin-bottom: -1.25rem !important; } .sm\:-ml-5 { margin-left: -1.25rem !important; } .sm\:-mt-6 { margin-top: -1.5rem !important; } .sm\:-mr-6 { margin-right: -1.5rem !important; } .sm\:-mb-6 { margin-bottom: -1.5rem !important; } .sm\:-ml-6 { margin-left: -1.5rem !important; } .sm\:-mt-8 { margin-top: -2rem !important; } .sm\:-mr-8 { margin-right: -2rem !important; } .sm\:-mb-8 { margin-bottom: -2rem !important; } .sm\:-ml-8 { margin-left: -2rem !important; } .sm\:-mt-10 { margin-top: -2.5rem !important; } .sm\:-mr-10 { margin-right: -2.5rem !important; } .sm\:-mb-10 { margin-bottom: -2.5rem !important; } .sm\:-ml-10 { margin-left: -2.5rem !important; } .sm\:-mt-12 { margin-top: -3rem !important; } .sm\:-mr-12 { margin-right: -3rem !important; } .sm\:-mb-12 { margin-bottom: -3rem !important; } .sm\:-ml-12 { margin-left: -3rem !important; } .sm\:-mt-14 { margin-top: -3.5rem !important; } .sm\:-mr-14 { margin-right: -3.5rem !important; } .sm\:-mb-14 { margin-bottom: -3.5rem !important; } .sm\:-ml-14 { margin-left: -3.5rem !important; } .sm\:-mt-16 { margin-top: -4rem !important; } .sm\:-mr-16 { margin-right: -4rem !important; } .sm\:-mb-16 { margin-bottom: -4rem !important; } .sm\:-ml-16 { margin-left: -4rem !important; } .sm\:-mt-18 { margin-top: -4.5rem !important; } .sm\:-mr-18 { margin-right: -4.5rem !important; } .sm\:-mb-18 { margin-bottom: -4.5rem !important; } .sm\:-ml-18 { margin-left: -4.5rem !important; } .sm\:-mt-20 { margin-top: -5rem !important; } .sm\:-mr-20 { margin-right: -5rem !important; } .sm\:-mb-20 { margin-bottom: -5rem !important; } .sm\:-ml-20 { margin-left: -5rem !important; } .sm\:-mt-22 { margin-top: -5.5rem !important; } .sm\:-mr-22 { margin-right: -5.5rem !important; } .sm\:-mb-22 { margin-bottom: -5.5rem !important; } .sm\:-ml-22 { margin-left: -5.5rem !important; } .sm\:-mt-24 { margin-top: -6rem !important; } .sm\:-mr-24 { margin-right: -6rem !important; } .sm\:-mb-24 { margin-bottom: -6rem !important; } .sm\:-ml-24 { margin-left: -6rem !important; } .sm\:-mt-26 { margin-top: -6.5rem !important; } .sm\:-mr-26 { margin-right: -6.5rem !important; } .sm\:-mb-26 { margin-bottom: -6.5rem !important; } .sm\:-ml-26 { margin-left: -6.5rem !important; } .sm\:-mt-28 { margin-top: -7rem !important; } .sm\:-mr-28 { margin-right: -7rem !important; } .sm\:-mb-28 { margin-bottom: -7rem !important; } .sm\:-ml-28 { margin-left: -7rem !important; } .sm\:-mt-30 { margin-top: -7.5rem !important; } .sm\:-mr-30 { margin-right: -7.5rem !important; } .sm\:-mb-30 { margin-bottom: -7.5rem !important; } .sm\:-ml-30 { margin-left: -7.5rem !important; } .sm\:-mt-32 { margin-top: -8rem !important; } .sm\:-mr-32 { margin-right: -8rem !important; } .sm\:-mb-32 { margin-bottom: -8rem !important; } .sm\:-ml-32 { margin-left: -8rem !important; } .sm\:-mt-36 { margin-top: -9rem !important; } .sm\:-mr-36 { margin-right: -9rem !important; } .sm\:-mb-36 { margin-bottom: -9rem !important; } .sm\:-ml-36 { margin-left: -9rem !important; } .sm\:-mt-40 { margin-top: -10rem !important; } .sm\:-mr-40 { margin-right: -10rem !important; } .sm\:-mb-40 { margin-bottom: -10rem !important; } .sm\:-ml-40 { margin-left: -10rem !important; } .sm\:-mt-48 { margin-top: -12rem !important; } .sm\:-mr-48 { margin-right: -12rem !important; } .sm\:-mb-48 { margin-bottom: -12rem !important; } .sm\:-ml-48 { margin-left: -12rem !important; } .sm\:-mt-56 { margin-top: -14rem !important; } .sm\:-mr-56 { margin-right: -14rem !important; } .sm\:-mb-56 { margin-bottom: -14rem !important; } .sm\:-ml-56 { margin-left: -14rem !important; } .sm\:-mt-64 { margin-top: -16rem !important; } .sm\:-mr-64 { margin-right: -16rem !important; } .sm\:-mb-64 { margin-bottom: -16rem !important; } .sm\:-ml-64 { margin-left: -16rem !important; } .sm\:-mt-px { margin-top: -1px !important; } .sm\:-mr-px { margin-right: -1px !important; } .sm\:-mb-px { margin-bottom: -1px !important; } .sm\:-ml-px { margin-left: -1px !important; } .sm\:-mt-2px { margin-top: -2px !important; } .sm\:-mr-2px { margin-right: -2px !important; } .sm\:-mb-2px { margin-bottom: -2px !important; } .sm\:-ml-2px { margin-left: -2px !important; } .sm\:max-h-0 { max-height: 0 !important; } .sm\:max-h-1 { max-height: 0.25rem !important; } .sm\:max-h-2 { max-height: 0.5rem !important; } .sm\:max-h-3 { max-height: 0.75rem !important; } .sm\:max-h-4 { max-height: 1rem !important; } .sm\:max-h-5 { max-height: 1.25rem !important; } .sm\:max-h-6 { max-height: 1.5rem !important; } .sm\:max-h-8 { max-height: 2rem !important; } .sm\:max-h-10 { max-height: 2.5rem !important; } .sm\:max-h-12 { max-height: 3rem !important; } .sm\:max-h-14 { max-height: 3.5rem !important; } .sm\:max-h-16 { max-height: 4rem !important; } .sm\:max-h-18 { max-height: 4.5rem !important; } .sm\:max-h-20 { max-height: 5rem !important; } .sm\:max-h-22 { max-height: 5.5rem !important; } .sm\:max-h-24 { max-height: 6rem !important; } .sm\:max-h-26 { max-height: 6.5rem !important; } .sm\:max-h-28 { max-height: 7rem !important; } .sm\:max-h-30 { max-height: 7.5rem !important; } .sm\:max-h-32 { max-height: 8rem !important; } .sm\:max-h-36 { max-height: 9rem !important; } .sm\:max-h-40 { max-height: 10rem !important; } .sm\:max-h-48 { max-height: 12rem !important; } .sm\:max-h-50 { max-height: 12.5rem !important; } .sm\:max-h-56 { max-height: 14rem !important; } .sm\:max-h-60 { max-height: 15rem !important; } .sm\:max-h-64 { max-height: 16rem !important; } .sm\:max-h-80 { max-height: 20rem !important; } .sm\:max-h-90 { max-height: 24rem !important; } .sm\:max-h-100 { max-height: 25rem !important; } .sm\:max-h-120 { max-height: 30rem !important; } .sm\:max-h-128 { max-height: 32rem !important; } .sm\:max-h-140 { max-height: 35rem !important; } .sm\:max-h-160 { max-height: 40rem !important; } .sm\:max-h-180 { max-height: 45rem !important; } .sm\:max-h-192 { max-height: 48rem !important; } .sm\:max-h-200 { max-height: 50rem !important; } .sm\:max-h-240 { max-height: 60rem !important; } .sm\:max-h-256 { max-height: 64rem !important; } .sm\:max-h-280 { max-height: 70rem !important; } .sm\:max-h-320 { max-height: 80rem !important; } .sm\:max-h-360 { max-height: 90rem !important; } .sm\:max-h-400 { max-height: 100rem !important; } .sm\:max-h-480 { max-height: 120rem !important; } .sm\:max-h-full { max-height: 100% !important; } .sm\:max-h-screen { max-height: 100vh !important; } .sm\:max-h-none { max-height: none !important; } .sm\:max-h-px { max-height: 1px !important; } .sm\:max-h-2px { max-height: 2px !important; } .sm\:max-h-1\/2 { max-height: 50% !important; } .sm\:max-h-1\/3 { max-height: 33.33333% !important; } .sm\:max-h-2\/3 { max-height: 66.66667% !important; } .sm\:max-h-1\/4 { max-height: 25% !important; } .sm\:max-h-2\/4 { max-height: 50% !important; } .sm\:max-h-3\/4 { max-height: 75% !important; } .sm\:max-h-1\/5 { max-height: 20% !important; } .sm\:max-h-2\/5 { max-height: 40% !important; } .sm\:max-h-3\/5 { max-height: 60% !important; } .sm\:max-h-4\/5 { max-height: 80% !important; } .sm\:max-h-1\/12 { max-height: 8.33333% !important; } .sm\:max-h-2\/12 { max-height: 16.66667% !important; } .sm\:max-h-3\/12 { max-height: 25% !important; } .sm\:max-h-4\/12 { max-height: 33.33333% !important; } .sm\:max-h-5\/12 { max-height: 41.66667% !important; } .sm\:max-h-6\/12 { max-height: 50% !important; } .sm\:max-h-7\/12 { max-height: 58.33333% !important; } .sm\:max-h-8\/12 { max-height: 66.66667% !important; } .sm\:max-h-9\/12 { max-height: 75% !important; } .sm\:max-h-10\/12 { max-height: 83.33333% !important; } .sm\:max-h-11\/12 { max-height: 91.66667% !important; } .sm\:max-w-0 { max-width: 0 !important; } .sm\:max-w-1 { max-width: 0.25rem !important; } .sm\:max-w-2 { max-width: 0.5rem !important; } .sm\:max-w-3 { max-width: 0.75rem !important; } .sm\:max-w-4 { max-width: 1rem !important; } .sm\:max-w-5 { max-width: 1.25rem !important; } .sm\:max-w-6 { max-width: 1.5rem !important; } .sm\:max-w-8 { max-width: 2rem !important; } .sm\:max-w-10 { max-width: 2.5rem !important; } .sm\:max-w-12 { max-width: 3rem !important; } .sm\:max-w-14 { max-width: 3.5rem !important; } .sm\:max-w-16 { max-width: 4rem !important; } .sm\:max-w-18 { max-width: 4.5rem !important; } .sm\:max-w-20 { max-width: 5rem !important; } .sm\:max-w-22 { max-width: 5.5rem !important; } .sm\:max-w-24 { max-width: 6rem !important; } .sm\:max-w-26 { max-width: 6.5rem !important; } .sm\:max-w-28 { max-width: 7rem !important; } .sm\:max-w-30 { max-width: 7.5rem !important; } .sm\:max-w-32 { max-width: 8rem !important; } .sm\:max-w-36 { max-width: 9rem !important; } .sm\:max-w-40 { max-width: 10rem !important; } .sm\:max-w-48 { max-width: 12rem !important; } .sm\:max-w-50 { max-width: 12.5rem !important; } .sm\:max-w-56 { max-width: 14rem !important; } .sm\:max-w-60 { max-width: 15rem !important; } .sm\:max-w-64 { max-width: 16rem !important; } .sm\:max-w-80 { max-width: 20rem !important; } .sm\:max-w-90 { max-width: 24rem !important; } .sm\:max-w-100 { max-width: 25rem !important; } .sm\:max-w-120 { max-width: 30rem !important; } .sm\:max-w-128 { max-width: 32rem !important; } .sm\:max-w-140 { max-width: 35rem !important; } .sm\:max-w-160 { max-width: 40rem !important; } .sm\:max-w-180 { max-width: 45rem !important; } .sm\:max-w-192 { max-width: 48rem !important; } .sm\:max-w-200 { max-width: 50rem !important; } .sm\:max-w-240 { max-width: 60rem !important; } .sm\:max-w-256 { max-width: 64rem !important; } .sm\:max-w-280 { max-width: 70rem !important; } .sm\:max-w-320 { max-width: 80rem !important; } .sm\:max-w-360 { max-width: 90rem !important; } .sm\:max-w-400 { max-width: 100rem !important; } .sm\:max-w-480 { max-width: 120rem !important; } .sm\:max-w-none { max-width: none !important; } .sm\:max-w-xs { max-width: 20rem !important; } .sm\:max-w-sm { max-width: 24rem !important; } .sm\:max-w-md { max-width: 28rem !important; } .sm\:max-w-lg { max-width: 32rem !important; } .sm\:max-w-xl { max-width: 36rem !important; } .sm\:max-w-2xl { max-width: 42rem !important; } .sm\:max-w-3xl { max-width: 48rem !important; } .sm\:max-w-4xl { max-width: 56rem !important; } .sm\:max-w-5xl { max-width: 64rem !important; } .sm\:max-w-6xl { max-width: 72rem !important; } .sm\:max-w-full { max-width: 100% !important; } .sm\:max-w-screen { max-width: 100vw !important; } .sm\:max-w-px { max-width: 1px !important; } .sm\:max-w-2px { max-width: 2px !important; } .sm\:max-w-1\/2 { max-width: 50% !important; } .sm\:max-w-1\/3 { max-width: 33.33333% !important; } .sm\:max-w-2\/3 { max-width: 66.66667% !important; } .sm\:max-w-1\/4 { max-width: 25% !important; } .sm\:max-w-2\/4 { max-width: 50% !important; } .sm\:max-w-3\/4 { max-width: 75% !important; } .sm\:max-w-1\/5 { max-width: 20% !important; } .sm\:max-w-2\/5 { max-width: 40% !important; } .sm\:max-w-3\/5 { max-width: 60% !important; } .sm\:max-w-4\/5 { max-width: 80% !important; } .sm\:max-w-1\/12 { max-width: 8.33333% !important; } .sm\:max-w-2\/12 { max-width: 16.66667% !important; } .sm\:max-w-3\/12 { max-width: 25% !important; } .sm\:max-w-4\/12 { max-width: 33.33333% !important; } .sm\:max-w-5\/12 { max-width: 41.66667% !important; } .sm\:max-w-6\/12 { max-width: 50% !important; } .sm\:max-w-7\/12 { max-width: 58.33333% !important; } .sm\:max-w-8\/12 { max-width: 66.66667% !important; } .sm\:max-w-9\/12 { max-width: 75% !important; } .sm\:max-w-10\/12 { max-width: 83.33333% !important; } .sm\:max-w-11\/12 { max-width: 91.66667% !important; } .sm\:min-h-0 { min-height: 0 !important; } .sm\:min-h-1 { min-height: 0.25rem !important; } .sm\:min-h-2 { min-height: 0.5rem !important; } .sm\:min-h-3 { min-height: 0.75rem !important; } .sm\:min-h-4 { min-height: 1rem !important; } .sm\:min-h-5 { min-height: 1.25rem !important; } .sm\:min-h-6 { min-height: 1.5rem !important; } .sm\:min-h-8 { min-height: 2rem !important; } .sm\:min-h-10 { min-height: 2.5rem !important; } .sm\:min-h-12 { min-height: 3rem !important; } .sm\:min-h-14 { min-height: 3.5rem !important; } .sm\:min-h-16 { min-height: 4rem !important; } .sm\:min-h-18 { min-height: 4.5rem !important; } .sm\:min-h-20 { min-height: 5rem !important; } .sm\:min-h-22 { min-height: 5.5rem !important; } .sm\:min-h-24 { min-height: 6rem !important; } .sm\:min-h-26 { min-height: 6.5rem !important; } .sm\:min-h-28 { min-height: 7rem !important; } .sm\:min-h-30 { min-height: 7.5rem !important; } .sm\:min-h-32 { min-height: 8rem !important; } .sm\:min-h-36 { min-height: 9rem !important; } .sm\:min-h-40 { min-height: 10rem !important; } .sm\:min-h-48 { min-height: 12rem !important; } .sm\:min-h-50 { min-height: 12.5rem !important; } .sm\:min-h-56 { min-height: 14rem !important; } .sm\:min-h-60 { min-height: 15rem !important; } .sm\:min-h-64 { min-height: 16rem !important; } .sm\:min-h-80 { min-height: 20rem !important; } .sm\:min-h-90 { min-height: 24rem !important; } .sm\:min-h-100 { min-height: 25rem !important; } .sm\:min-h-120 { min-height: 30rem !important; } .sm\:min-h-128 { min-height: 32rem !important; } .sm\:min-h-140 { min-height: 35rem !important; } .sm\:min-h-160 { min-height: 40rem !important; } .sm\:min-h-180 { min-height: 45rem !important; } .sm\:min-h-192 { min-height: 48rem !important; } .sm\:min-h-200 { min-height: 50rem !important; } .sm\:min-h-240 { min-height: 60rem !important; } .sm\:min-h-256 { min-height: 64rem !important; } .sm\:min-h-280 { min-height: 70rem !important; } .sm\:min-h-320 { min-height: 80rem !important; } .sm\:min-h-360 { min-height: 90rem !important; } .sm\:min-h-400 { min-height: 100rem !important; } .sm\:min-h-480 { min-height: 120rem !important; } .sm\:min-h-full { min-height: 100% !important; } .sm\:min-h-screen { min-height: 100vh !important; } .sm\:min-h-px { min-height: 1px !important; } .sm\:min-h-2px { min-height: 2px !important; } .sm\:min-h-1\/2 { min-height: 50% !important; } .sm\:min-h-1\/3 { min-height: 33.33333% !important; } .sm\:min-h-2\/3 { min-height: 66.66667% !important; } .sm\:min-h-1\/4 { min-height: 25% !important; } .sm\:min-h-2\/4 { min-height: 50% !important; } .sm\:min-h-3\/4 { min-height: 75% !important; } .sm\:min-h-1\/5 { min-height: 20% !important; } .sm\:min-h-2\/5 { min-height: 40% !important; } .sm\:min-h-3\/5 { min-height: 60% !important; } .sm\:min-h-4\/5 { min-height: 80% !important; } .sm\:min-h-1\/12 { min-height: 8.33333% !important; } .sm\:min-h-2\/12 { min-height: 16.66667% !important; } .sm\:min-h-3\/12 { min-height: 25% !important; } .sm\:min-h-4\/12 { min-height: 33.33333% !important; } .sm\:min-h-5\/12 { min-height: 41.66667% !important; } .sm\:min-h-6\/12 { min-height: 50% !important; } .sm\:min-h-7\/12 { min-height: 58.33333% !important; } .sm\:min-h-8\/12 { min-height: 66.66667% !important; } .sm\:min-h-9\/12 { min-height: 75% !important; } .sm\:min-h-10\/12 { min-height: 83.33333% !important; } .sm\:min-h-11\/12 { min-height: 91.66667% !important; } .sm\:min-w-0 { min-width: 0 !important; } .sm\:min-w-1 { min-width: 0.25rem !important; } .sm\:min-w-2 { min-width: 0.5rem !important; } .sm\:min-w-3 { min-width: 0.75rem !important; } .sm\:min-w-4 { min-width: 1rem !important; } .sm\:min-w-5 { min-width: 1.25rem !important; } .sm\:min-w-6 { min-width: 1.5rem !important; } .sm\:min-w-8 { min-width: 2rem !important; } .sm\:min-w-10 { min-width: 2.5rem !important; } .sm\:min-w-12 { min-width: 3rem !important; } .sm\:min-w-14 { min-width: 3.5rem !important; } .sm\:min-w-16 { min-width: 4rem !important; } .sm\:min-w-18 { min-width: 4.5rem !important; } .sm\:min-w-20 { min-width: 5rem !important; } .sm\:min-w-22 { min-width: 5.5rem !important; } .sm\:min-w-24 { min-width: 6rem !important; } .sm\:min-w-26 { min-width: 6.5rem !important; } .sm\:min-w-28 { min-width: 7rem !important; } .sm\:min-w-30 { min-width: 7.5rem !important; } .sm\:min-w-32 { min-width: 8rem !important; } .sm\:min-w-36 { min-width: 9rem !important; } .sm\:min-w-40 { min-width: 10rem !important; } .sm\:min-w-48 { min-width: 12rem !important; } .sm\:min-w-50 { min-width: 12.5rem !important; } .sm\:min-w-56 { min-width: 14rem !important; } .sm\:min-w-60 { min-width: 15rem !important; } .sm\:min-w-64 { min-width: 16rem !important; } .sm\:min-w-80 { min-width: 20rem !important; } .sm\:min-w-90 { min-width: 24rem !important; } .sm\:min-w-100 { min-width: 25rem !important; } .sm\:min-w-120 { min-width: 30rem !important; } .sm\:min-w-128 { min-width: 32rem !important; } .sm\:min-w-140 { min-width: 35rem !important; } .sm\:min-w-160 { min-width: 40rem !important; } .sm\:min-w-180 { min-width: 45rem !important; } .sm\:min-w-192 { min-width: 48rem !important; } .sm\:min-w-200 { min-width: 50rem !important; } .sm\:min-w-240 { min-width: 60rem !important; } .sm\:min-w-256 { min-width: 64rem !important; } .sm\:min-w-280 { min-width: 70rem !important; } .sm\:min-w-320 { min-width: 80rem !important; } .sm\:min-w-360 { min-width: 90rem !important; } .sm\:min-w-400 { min-width: 100rem !important; } .sm\:min-w-480 { min-width: 120rem !important; } .sm\:min-w-full { min-width: 100% !important; } .sm\:min-w-screen { min-width: 100vw !important; } .sm\:min-w-px { min-width: 1px !important; } .sm\:min-w-2px { min-width: 2px !important; } .sm\:min-w-1\/2 { min-width: 50% !important; } .sm\:min-w-1\/3 { min-width: 33.33333% !important; } .sm\:min-w-2\/3 { min-width: 66.66667% !important; } .sm\:min-w-1\/4 { min-width: 25% !important; } .sm\:min-w-2\/4 { min-width: 50% !important; } .sm\:min-w-3\/4 { min-width: 75% !important; } .sm\:min-w-1\/5 { min-width: 20% !important; } .sm\:min-w-2\/5 { min-width: 40% !important; } .sm\:min-w-3\/5 { min-width: 60% !important; } .sm\:min-w-4\/5 { min-width: 80% !important; } .sm\:min-w-1\/12 { min-width: 8.33333% !important; } .sm\:min-w-2\/12 { min-width: 16.66667% !important; } .sm\:min-w-3\/12 { min-width: 25% !important; } .sm\:min-w-4\/12 { min-width: 33.33333% !important; } .sm\:min-w-5\/12 { min-width: 41.66667% !important; } .sm\:min-w-6\/12 { min-width: 50% !important; } .sm\:min-w-7\/12 { min-width: 58.33333% !important; } .sm\:min-w-8\/12 { min-width: 66.66667% !important; } .sm\:min-w-9\/12 { min-width: 75% !important; } .sm\:min-w-10\/12 { min-width: 83.33333% !important; } .sm\:min-w-11\/12 { min-width: 91.66667% !important; } .sm\:object-contain { -o-object-fit: contain !important; object-fit: contain !important; } .sm\:object-cover { -o-object-fit: cover !important; object-fit: cover !important; } .sm\:object-fill { -o-object-fit: fill !important; object-fit: fill !important; } .sm\:object-none { -o-object-fit: none !important; object-fit: none !important; } .sm\:object-scale-down { -o-object-fit: scale-down !important; object-fit: scale-down !important; } .sm\:object-bottom { -o-object-position: bottom !important; object-position: bottom !important; } .sm\:object-center { -o-object-position: center !important; object-position: center !important; } .sm\:object-left { -o-object-position: left !important; object-position: left !important; } .sm\:object-left-bottom { -o-object-position: left bottom !important; object-position: left bottom !important; } .sm\:object-left-top { -o-object-position: left top !important; object-position: left top !important; } .sm\:object-right { -o-object-position: right !important; object-position: right !important; } .sm\:object-right-bottom { -o-object-position: right bottom !important; object-position: right bottom !important; } .sm\:object-right-top { -o-object-position: right top !important; object-position: right top !important; } .sm\:object-top { -o-object-position: top !important; object-position: top !important; } .sm\:opacity-0 { opacity: 0 !important; } .sm\:opacity-12 { opacity: 0.12 !important; } .sm\:opacity-25 { opacity: 0.25 !important; } .sm\:opacity-38 { opacity: 0.38 !important; } .sm\:opacity-50 { opacity: 0.5 !important; } .sm\:opacity-54 { opacity: 0.54 !important; } .sm\:opacity-70 { opacity: 0.70 !important; } .sm\:opacity-75 { opacity: 0.75 !important; } .sm\:opacity-84 { opacity: 0.84 !important; } .sm\:opacity-100 { opacity: 1 !important; } .sm\:hover\:opacity-0:hover { opacity: 0 !important; } .sm\:hover\:opacity-12:hover { opacity: 0.12 !important; } .sm\:hover\:opacity-25:hover { opacity: 0.25 !important; } .sm\:hover\:opacity-38:hover { opacity: 0.38 !important; } .sm\:hover\:opacity-50:hover { opacity: 0.5 !important; } .sm\:hover\:opacity-54:hover { opacity: 0.54 !important; } .sm\:hover\:opacity-70:hover { opacity: 0.70 !important; } .sm\:hover\:opacity-75:hover { opacity: 0.75 !important; } .sm\:hover\:opacity-84:hover { opacity: 0.84 !important; } .sm\:hover\:opacity-100:hover { opacity: 1 !important; } .sm\:focus\:opacity-0:focus { opacity: 0 !important; } .sm\:focus\:opacity-12:focus { opacity: 0.12 !important; } .sm\:focus\:opacity-25:focus { opacity: 0.25 !important; } .sm\:focus\:opacity-38:focus { opacity: 0.38 !important; } .sm\:focus\:opacity-50:focus { opacity: 0.5 !important; } .sm\:focus\:opacity-54:focus { opacity: 0.54 !important; } .sm\:focus\:opacity-70:focus { opacity: 0.70 !important; } .sm\:focus\:opacity-75:focus { opacity: 0.75 !important; } .sm\:focus\:opacity-84:focus { opacity: 0.84 !important; } .sm\:focus\:opacity-100:focus { opacity: 1 !important; } .sm\:outline-none { outline: 0 !important; } .sm\:focus\:outline-none:focus { outline: 0 !important; } .sm\:overflow-auto { overflow: auto !important; } .sm\:overflow-hidden { overflow: hidden !important; } .sm\:overflow-visible { overflow: visible !important; } .sm\:overflow-scroll { overflow: scroll !important; } .sm\:overflow-x-auto { overflow-x: auto !important; } .sm\:overflow-y-auto { overflow-y: auto !important; } .sm\:overflow-x-hidden { overflow-x: hidden !important; } .sm\:overflow-y-hidden { overflow-y: hidden !important; } .sm\:overflow-x-visible { overflow-x: visible !important; } .sm\:overflow-y-visible { overflow-y: visible !important; } .sm\:overflow-x-scroll { overflow-x: scroll !important; } .sm\:overflow-y-scroll { overflow-y: scroll !important; } .sm\:scrolling-touch { -webkit-overflow-scrolling: touch !important; } .sm\:scrolling-auto { -webkit-overflow-scrolling: auto !important; } .sm\:p-0 { padding: 0 !important; } .sm\:p-1 { padding: 0.25rem !important; } .sm\:p-2 { padding: 0.5rem !important; } .sm\:p-3 { padding: 0.75rem !important; } .sm\:p-4 { padding: 1rem !important; } .sm\:p-5 { padding: 1.25rem !important; } .sm\:p-6 { padding: 1.5rem !important; } .sm\:p-8 { padding: 2rem !important; } .sm\:p-10 { padding: 2.5rem !important; } .sm\:p-12 { padding: 3rem !important; } .sm\:p-14 { padding: 3.5rem !important; } .sm\:p-16 { padding: 4rem !important; } .sm\:p-18 { padding: 4.5rem !important; } .sm\:p-20 { padding: 5rem !important; } .sm\:p-22 { padding: 5.5rem !important; } .sm\:p-24 { padding: 6rem !important; } .sm\:p-26 { padding: 6.5rem !important; } .sm\:p-28 { padding: 7rem !important; } .sm\:p-30 { padding: 7.5rem !important; } .sm\:p-32 { padding: 8rem !important; } .sm\:p-36 { padding: 9rem !important; } .sm\:p-40 { padding: 10rem !important; } .sm\:p-48 { padding: 12rem !important; } .sm\:p-56 { padding: 14rem !important; } .sm\:p-64 { padding: 16rem !important; } .sm\:p-px { padding: 1px !important; } .sm\:p-2px { padding: 2px !important; } .sm\:py-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .sm\:px-0 { padding-left: 0 !important; padding-right: 0 !important; } .sm\:py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .sm\:px-1 { padding-left: 0.25rem !important; padding-right: 0.25rem !important; } .sm\:py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .sm\:px-2 { padding-left: 0.5rem !important; padding-right: 0.5rem !important; } .sm\:py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .sm\:px-3 { padding-left: 0.75rem !important; padding-right: 0.75rem !important; } .sm\:py-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .sm\:px-4 { padding-left: 1rem !important; padding-right: 1rem !important; } .sm\:py-5 { padding-top: 1.25rem !important; padding-bottom: 1.25rem !important; } .sm\:px-5 { padding-left: 1.25rem !important; padding-right: 1.25rem !important; } .sm\:py-6 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .sm\:px-6 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } .sm\:py-8 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .sm\:px-8 { padding-left: 2rem !important; padding-right: 2rem !important; } .sm\:py-10 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .sm\:px-10 { padding-left: 2.5rem !important; padding-right: 2.5rem !important; } .sm\:py-12 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .sm\:px-12 { padding-left: 3rem !important; padding-right: 3rem !important; } .sm\:py-14 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .sm\:px-14 { padding-left: 3.5rem !important; padding-right: 3.5rem !important; } .sm\:py-16 { padding-top: 4rem !important; padding-bottom: 4rem !important; } .sm\:px-16 { padding-left: 4rem !important; padding-right: 4rem !important; } .sm\:py-18 { padding-top: 4.5rem !important; padding-bottom: 4.5rem !important; } .sm\:px-18 { padding-left: 4.5rem !important; padding-right: 4.5rem !important; } .sm\:py-20 { padding-top: 5rem !important; padding-bottom: 5rem !important; } .sm\:px-20 { padding-left: 5rem !important; padding-right: 5rem !important; } .sm\:py-22 { padding-top: 5.5rem !important; padding-bottom: 5.5rem !important; } .sm\:px-22 { padding-left: 5.5rem !important; padding-right: 5.5rem !important; } .sm\:py-24 { padding-top: 6rem !important; padding-bottom: 6rem !important; } .sm\:px-24 { padding-left: 6rem !important; padding-right: 6rem !important; } .sm\:py-26 { padding-top: 6.5rem !important; padding-bottom: 6.5rem !important; } .sm\:px-26 { padding-left: 6.5rem !important; padding-right: 6.5rem !important; } .sm\:py-28 { padding-top: 7rem !important; padding-bottom: 7rem !important; } .sm\:px-28 { padding-left: 7rem !important; padding-right: 7rem !important; } .sm\:py-30 { padding-top: 7.5rem !important; padding-bottom: 7.5rem !important; } .sm\:px-30 { padding-left: 7.5rem !important; padding-right: 7.5rem !important; } .sm\:py-32 { padding-top: 8rem !important; padding-bottom: 8rem !important; } .sm\:px-32 { padding-left: 8rem !important; padding-right: 8rem !important; } .sm\:py-36 { padding-top: 9rem !important; padding-bottom: 9rem !important; } .sm\:px-36 { padding-left: 9rem !important; padding-right: 9rem !important; } .sm\:py-40 { padding-top: 10rem !important; padding-bottom: 10rem !important; } .sm\:px-40 { padding-left: 10rem !important; padding-right: 10rem !important; } .sm\:py-48 { padding-top: 12rem !important; padding-bottom: 12rem !important; } .sm\:px-48 { padding-left: 12rem !important; padding-right: 12rem !important; } .sm\:py-56 { padding-top: 14rem !important; padding-bottom: 14rem !important; } .sm\:px-56 { padding-left: 14rem !important; padding-right: 14rem !important; } .sm\:py-64 { padding-top: 16rem !important; padding-bottom: 16rem !important; } .sm\:px-64 { padding-left: 16rem !important; padding-right: 16rem !important; } .sm\:py-px { padding-top: 1px !important; padding-bottom: 1px !important; } .sm\:px-px { padding-left: 1px !important; padding-right: 1px !important; } .sm\:py-2px { padding-top: 2px !important; padding-bottom: 2px !important; } .sm\:px-2px { padding-left: 2px !important; padding-right: 2px !important; } .sm\:pt-0 { padding-top: 0 !important; } .sm\:pr-0 { padding-right: 0 !important; } .sm\:pb-0 { padding-bottom: 0 !important; } .sm\:pl-0 { padding-left: 0 !important; } .sm\:pt-1 { padding-top: 0.25rem !important; } .sm\:pr-1 { padding-right: 0.25rem !important; } .sm\:pb-1 { padding-bottom: 0.25rem !important; } .sm\:pl-1 { padding-left: 0.25rem !important; } .sm\:pt-2 { padding-top: 0.5rem !important; } .sm\:pr-2 { padding-right: 0.5rem !important; } .sm\:pb-2 { padding-bottom: 0.5rem !important; } .sm\:pl-2 { padding-left: 0.5rem !important; } .sm\:pt-3 { padding-top: 0.75rem !important; } .sm\:pr-3 { padding-right: 0.75rem !important; } .sm\:pb-3 { padding-bottom: 0.75rem !important; } .sm\:pl-3 { padding-left: 0.75rem !important; } .sm\:pt-4 { padding-top: 1rem !important; } .sm\:pr-4 { padding-right: 1rem !important; } .sm\:pb-4 { padding-bottom: 1rem !important; } .sm\:pl-4 { padding-left: 1rem !important; } .sm\:pt-5 { padding-top: 1.25rem !important; } .sm\:pr-5 { padding-right: 1.25rem !important; } .sm\:pb-5 { padding-bottom: 1.25rem !important; } .sm\:pl-5 { padding-left: 1.25rem !important; } .sm\:pt-6 { padding-top: 1.5rem !important; } .sm\:pr-6 { padding-right: 1.5rem !important; } .sm\:pb-6 { padding-bottom: 1.5rem !important; } .sm\:pl-6 { padding-left: 1.5rem !important; } .sm\:pt-8 { padding-top: 2rem !important; } .sm\:pr-8 { padding-right: 2rem !important; } .sm\:pb-8 { padding-bottom: 2rem !important; } .sm\:pl-8 { padding-left: 2rem !important; } .sm\:pt-10 { padding-top: 2.5rem !important; } .sm\:pr-10 { padding-right: 2.5rem !important; } .sm\:pb-10 { padding-bottom: 2.5rem !important; } .sm\:pl-10 { padding-left: 2.5rem !important; } .sm\:pt-12 { padding-top: 3rem !important; } .sm\:pr-12 { padding-right: 3rem !important; } .sm\:pb-12 { padding-bottom: 3rem !important; } .sm\:pl-12 { padding-left: 3rem !important; } .sm\:pt-14 { padding-top: 3.5rem !important; } .sm\:pr-14 { padding-right: 3.5rem !important; } .sm\:pb-14 { padding-bottom: 3.5rem !important; } .sm\:pl-14 { padding-left: 3.5rem !important; } .sm\:pt-16 { padding-top: 4rem !important; } .sm\:pr-16 { padding-right: 4rem !important; } .sm\:pb-16 { padding-bottom: 4rem !important; } .sm\:pl-16 { padding-left: 4rem !important; } .sm\:pt-18 { padding-top: 4.5rem !important; } .sm\:pr-18 { padding-right: 4.5rem !important; } .sm\:pb-18 { padding-bottom: 4.5rem !important; } .sm\:pl-18 { padding-left: 4.5rem !important; } .sm\:pt-20 { padding-top: 5rem !important; } .sm\:pr-20 { padding-right: 5rem !important; } .sm\:pb-20 { padding-bottom: 5rem !important; } .sm\:pl-20 { padding-left: 5rem !important; } .sm\:pt-22 { padding-top: 5.5rem !important; } .sm\:pr-22 { padding-right: 5.5rem !important; } .sm\:pb-22 { padding-bottom: 5.5rem !important; } .sm\:pl-22 { padding-left: 5.5rem !important; } .sm\:pt-24 { padding-top: 6rem !important; } .sm\:pr-24 { padding-right: 6rem !important; } .sm\:pb-24 { padding-bottom: 6rem !important; } .sm\:pl-24 { padding-left: 6rem !important; } .sm\:pt-26 { padding-top: 6.5rem !important; } .sm\:pr-26 { padding-right: 6.5rem !important; } .sm\:pb-26 { padding-bottom: 6.5rem !important; } .sm\:pl-26 { padding-left: 6.5rem !important; } .sm\:pt-28 { padding-top: 7rem !important; } .sm\:pr-28 { padding-right: 7rem !important; } .sm\:pb-28 { padding-bottom: 7rem !important; } .sm\:pl-28 { padding-left: 7rem !important; } .sm\:pt-30 { padding-top: 7.5rem !important; } .sm\:pr-30 { padding-right: 7.5rem !important; } .sm\:pb-30 { padding-bottom: 7.5rem !important; } .sm\:pl-30 { padding-left: 7.5rem !important; } .sm\:pt-32 { padding-top: 8rem !important; } .sm\:pr-32 { padding-right: 8rem !important; } .sm\:pb-32 { padding-bottom: 8rem !important; } .sm\:pl-32 { padding-left: 8rem !important; } .sm\:pt-36 { padding-top: 9rem !important; } .sm\:pr-36 { padding-right: 9rem !important; } .sm\:pb-36 { padding-bottom: 9rem !important; } .sm\:pl-36 { padding-left: 9rem !important; } .sm\:pt-40 { padding-top: 10rem !important; } .sm\:pr-40 { padding-right: 10rem !important; } .sm\:pb-40 { padding-bottom: 10rem !important; } .sm\:pl-40 { padding-left: 10rem !important; } .sm\:pt-48 { padding-top: 12rem !important; } .sm\:pr-48 { padding-right: 12rem !important; } .sm\:pb-48 { padding-bottom: 12rem !important; } .sm\:pl-48 { padding-left: 12rem !important; } .sm\:pt-56 { padding-top: 14rem !important; } .sm\:pr-56 { padding-right: 14rem !important; } .sm\:pb-56 { padding-bottom: 14rem !important; } .sm\:pl-56 { padding-left: 14rem !important; } .sm\:pt-64 { padding-top: 16rem !important; } .sm\:pr-64 { padding-right: 16rem !important; } .sm\:pb-64 { padding-bottom: 16rem !important; } .sm\:pl-64 { padding-left: 16rem !important; } .sm\:pt-px { padding-top: 1px !important; } .sm\:pr-px { padding-right: 1px !important; } .sm\:pb-px { padding-bottom: 1px !important; } .sm\:pl-px { padding-left: 1px !important; } .sm\:pt-2px { padding-top: 2px !important; } .sm\:pr-2px { padding-right: 2px !important; } .sm\:pb-2px { padding-bottom: 2px !important; } .sm\:pl-2px { padding-left: 2px !important; } .sm\:placeholder-opacity-0::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .sm\:placeholder-opacity-0::-moz-placeholder { --placeholder-opacity: 0 !important; } .sm\:placeholder-opacity-0::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .sm\:placeholder-opacity-0::placeholder { --placeholder-opacity: 0 !important; } .sm\:placeholder-opacity-12::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .sm\:placeholder-opacity-12::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .sm\:placeholder-opacity-12::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .sm\:placeholder-opacity-12::placeholder { --placeholder-opacity: 0.12 !important; } .sm\:placeholder-opacity-25::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .sm\:placeholder-opacity-25::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .sm\:placeholder-opacity-25::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .sm\:placeholder-opacity-25::placeholder { --placeholder-opacity: 0.25 !important; } .sm\:placeholder-opacity-38::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .sm\:placeholder-opacity-38::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .sm\:placeholder-opacity-38::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .sm\:placeholder-opacity-38::placeholder { --placeholder-opacity: 0.38 !important; } .sm\:placeholder-opacity-50::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .sm\:placeholder-opacity-50::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .sm\:placeholder-opacity-50::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .sm\:placeholder-opacity-50::placeholder { --placeholder-opacity: 0.5 !important; } .sm\:placeholder-opacity-54::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .sm\:placeholder-opacity-54::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .sm\:placeholder-opacity-54::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .sm\:placeholder-opacity-54::placeholder { --placeholder-opacity: 0.54 !important; } .sm\:placeholder-opacity-70::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .sm\:placeholder-opacity-70::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .sm\:placeholder-opacity-70::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .sm\:placeholder-opacity-70::placeholder { --placeholder-opacity: 0.70 !important; } .sm\:placeholder-opacity-75::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .sm\:placeholder-opacity-75::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .sm\:placeholder-opacity-75::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .sm\:placeholder-opacity-75::placeholder { --placeholder-opacity: 0.75 !important; } .sm\:placeholder-opacity-84::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .sm\:placeholder-opacity-84::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .sm\:placeholder-opacity-84::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .sm\:placeholder-opacity-84::placeholder { --placeholder-opacity: 0.84 !important; } .sm\:placeholder-opacity-100::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .sm\:placeholder-opacity-100::-moz-placeholder { --placeholder-opacity: 1 !important; } .sm\:placeholder-opacity-100::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .sm\:placeholder-opacity-100::placeholder { --placeholder-opacity: 1 !important; } .sm\:focus\:placeholder-opacity-0:focus::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .sm\:focus\:placeholder-opacity-0:focus::-moz-placeholder { --placeholder-opacity: 0 !important; } .sm\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .sm\:focus\:placeholder-opacity-0:focus::placeholder { --placeholder-opacity: 0 !important; } .sm\:focus\:placeholder-opacity-12:focus::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .sm\:focus\:placeholder-opacity-12:focus::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .sm\:focus\:placeholder-opacity-12:focus::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .sm\:focus\:placeholder-opacity-12:focus::placeholder { --placeholder-opacity: 0.12 !important; } .sm\:focus\:placeholder-opacity-25:focus::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .sm\:focus\:placeholder-opacity-25:focus::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .sm\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .sm\:focus\:placeholder-opacity-25:focus::placeholder { --placeholder-opacity: 0.25 !important; } .sm\:focus\:placeholder-opacity-38:focus::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .sm\:focus\:placeholder-opacity-38:focus::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .sm\:focus\:placeholder-opacity-38:focus::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .sm\:focus\:placeholder-opacity-38:focus::placeholder { --placeholder-opacity: 0.38 !important; } .sm\:focus\:placeholder-opacity-50:focus::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .sm\:focus\:placeholder-opacity-50:focus::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .sm\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .sm\:focus\:placeholder-opacity-50:focus::placeholder { --placeholder-opacity: 0.5 !important; } .sm\:focus\:placeholder-opacity-54:focus::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .sm\:focus\:placeholder-opacity-54:focus::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .sm\:focus\:placeholder-opacity-54:focus::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .sm\:focus\:placeholder-opacity-54:focus::placeholder { --placeholder-opacity: 0.54 !important; } .sm\:focus\:placeholder-opacity-70:focus::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .sm\:focus\:placeholder-opacity-70:focus::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .sm\:focus\:placeholder-opacity-70:focus::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .sm\:focus\:placeholder-opacity-70:focus::placeholder { --placeholder-opacity: 0.70 !important; } .sm\:focus\:placeholder-opacity-75:focus::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .sm\:focus\:placeholder-opacity-75:focus::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .sm\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .sm\:focus\:placeholder-opacity-75:focus::placeholder { --placeholder-opacity: 0.75 !important; } .sm\:focus\:placeholder-opacity-84:focus::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .sm\:focus\:placeholder-opacity-84:focus::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .sm\:focus\:placeholder-opacity-84:focus::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .sm\:focus\:placeholder-opacity-84:focus::placeholder { --placeholder-opacity: 0.84 !important; } .sm\:focus\:placeholder-opacity-100:focus::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .sm\:focus\:placeholder-opacity-100:focus::-moz-placeholder { --placeholder-opacity: 1 !important; } .sm\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .sm\:focus\:placeholder-opacity-100:focus::placeholder { --placeholder-opacity: 1 !important; } .sm\:pointer-events-none { pointer-events: none !important; } .sm\:pointer-events-auto { pointer-events: auto !important; } .sm\:static { position: static !important; } .sm\:fixed { position: fixed !important; } .sm\:absolute { position: absolute !important; } .sm\:relative { position: relative !important; } .sm\:sticky { position: -webkit-sticky !important; position: sticky !important; } .sm\:inset-0 { top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; } .sm\:inset-auto { top: auto !important; right: auto !important; bottom: auto !important; left: auto !important; } .sm\:inset-y-0 { top: 0 !important; bottom: 0 !important; } .sm\:inset-x-0 { right: 0 !important; left: 0 !important; } .sm\:inset-y-auto { top: auto !important; bottom: auto !important; } .sm\:inset-x-auto { right: auto !important; left: auto !important; } .sm\:top-0 { top: 0 !important; } .sm\:right-0 { right: 0 !important; } .sm\:bottom-0 { bottom: 0 !important; } .sm\:left-0 { left: 0 !important; } .sm\:top-auto { top: auto !important; } .sm\:right-auto { right: auto !important; } .sm\:bottom-auto { bottom: auto !important; } .sm\:left-auto { left: auto !important; } .sm\:shadow-xs { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .sm\:shadow-sm { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .sm\:shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .sm\:shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .sm\:shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .sm\:shadow-xl { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .sm\:shadow-2xl { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .sm\:shadow-inner { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .sm\:shadow-outline { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .sm\:shadow-none { box-shadow: none !important; } .sm\:shadow-solid { box-shadow: 0 0 0 2px currentColor !important; } .sm\:hover\:shadow-xs:hover { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .sm\:hover\:shadow-sm:hover { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .sm\:hover\:shadow:hover { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .sm\:hover\:shadow-md:hover { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .sm\:hover\:shadow-lg:hover { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .sm\:hover\:shadow-xl:hover { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .sm\:hover\:shadow-2xl:hover { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .sm\:hover\:shadow-inner:hover { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .sm\:hover\:shadow-outline:hover { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .sm\:hover\:shadow-none:hover { box-shadow: none !important; } .sm\:hover\:shadow-solid:hover { box-shadow: 0 0 0 2px currentColor !important; } .sm\:focus\:shadow-xs:focus { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .sm\:focus\:shadow-sm:focus { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .sm\:focus\:shadow:focus { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .sm\:focus\:shadow-md:focus { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .sm\:focus\:shadow-lg:focus { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .sm\:focus\:shadow-xl:focus { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .sm\:focus\:shadow-2xl:focus { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .sm\:focus\:shadow-inner:focus { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .sm\:focus\:shadow-outline:focus { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .sm\:focus\:shadow-none:focus { box-shadow: none !important; } .sm\:focus\:shadow-solid:focus { box-shadow: 0 0 0 2px currentColor !important; } .sm\:fill-current { fill: currentColor !important; } .sm\:stroke-current { stroke: currentColor !important; } .sm\:stroke-0 { stroke-width: 0 !important; } .sm\:stroke-1 { stroke-width: 1 !important; } .sm\:stroke-2 { stroke-width: 2 !important; } .sm\:table-auto { table-layout: auto !important; } .sm\:table-fixed { table-layout: fixed !important; } .sm\:text-left { text-align: left !important; } .sm\:text-center { text-align: center !important; } .sm\:text-right { text-align: right !important; } .sm\:text-justify { text-align: justify !important; } .sm\:text-opacity-0 { --text-opacity: 0 !important; } .sm\:text-opacity-12 { --text-opacity: 0.12 !important; } .sm\:text-opacity-25 { --text-opacity: 0.25 !important; } .sm\:text-opacity-38 { --text-opacity: 0.38 !important; } .sm\:text-opacity-50 { --text-opacity: 0.5 !important; } .sm\:text-opacity-54 { --text-opacity: 0.54 !important; } .sm\:text-opacity-70 { --text-opacity: 0.70 !important; } .sm\:text-opacity-75 { --text-opacity: 0.75 !important; } .sm\:text-opacity-84 { --text-opacity: 0.84 !important; } .sm\:text-opacity-100 { --text-opacity: 1 !important; } .sm\:hover\:text-opacity-0:hover { --text-opacity: 0 !important; } .sm\:hover\:text-opacity-12:hover { --text-opacity: 0.12 !important; } .sm\:hover\:text-opacity-25:hover { --text-opacity: 0.25 !important; } .sm\:hover\:text-opacity-38:hover { --text-opacity: 0.38 !important; } .sm\:hover\:text-opacity-50:hover { --text-opacity: 0.5 !important; } .sm\:hover\:text-opacity-54:hover { --text-opacity: 0.54 !important; } .sm\:hover\:text-opacity-70:hover { --text-opacity: 0.70 !important; } .sm\:hover\:text-opacity-75:hover { --text-opacity: 0.75 !important; } .sm\:hover\:text-opacity-84:hover { --text-opacity: 0.84 !important; } .sm\:hover\:text-opacity-100:hover { --text-opacity: 1 !important; } .sm\:focus\:text-opacity-0:focus { --text-opacity: 0 !important; } .sm\:focus\:text-opacity-12:focus { --text-opacity: 0.12 !important; } .sm\:focus\:text-opacity-25:focus { --text-opacity: 0.25 !important; } .sm\:focus\:text-opacity-38:focus { --text-opacity: 0.38 !important; } .sm\:focus\:text-opacity-50:focus { --text-opacity: 0.5 !important; } .sm\:focus\:text-opacity-54:focus { --text-opacity: 0.54 !important; } .sm\:focus\:text-opacity-70:focus { --text-opacity: 0.70 !important; } .sm\:focus\:text-opacity-75:focus { --text-opacity: 0.75 !important; } .sm\:focus\:text-opacity-84:focus { --text-opacity: 0.84 !important; } .sm\:focus\:text-opacity-100:focus { --text-opacity: 1 !important; } .sm\:italic { font-style: italic !important; } .sm\:not-italic { font-style: normal !important; } .sm\:uppercase { text-transform: uppercase !important; } .sm\:lowercase { text-transform: lowercase !important; } .sm\:capitalize { text-transform: capitalize !important; } .sm\:normal-case { text-transform: none !important; } .sm\:underline { text-decoration: underline !important; } .sm\:line-through { text-decoration: line-through !important; } .sm\:no-underline { text-decoration: none !important; } .sm\:hover\:underline:hover { text-decoration: underline !important; } .sm\:hover\:line-through:hover { text-decoration: line-through !important; } .sm\:hover\:no-underline:hover { text-decoration: none !important; } .sm\:focus\:underline:focus { text-decoration: underline !important; } .sm\:focus\:line-through:focus { text-decoration: line-through !important; } .sm\:focus\:no-underline:focus { text-decoration: none !important; } .sm\:tracking-tighter { letter-spacing: -0.05em !important; } .sm\:tracking-tight { letter-spacing: -0.025em !important; } .sm\:tracking-normal { letter-spacing: 0 !important; } .sm\:tracking-wide { letter-spacing: 0.025em !important; } .sm\:tracking-wider { letter-spacing: 0.05em !important; } .sm\:tracking-widest { letter-spacing: 0.1em !important; } .sm\:select-none { -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important; } .sm\:select-text { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } .sm\:select-all { -webkit-user-select: all !important; -moz-user-select: all !important; -ms-user-select: all !important; user-select: all !important; } .sm\:select-auto { -webkit-user-select: auto !important; -moz-user-select: auto !important; -ms-user-select: auto !important; user-select: auto !important; } .sm\:align-baseline { vertical-align: baseline !important; } .sm\:align-top { vertical-align: top !important; } .sm\:align-middle { vertical-align: middle !important; } .sm\:align-bottom { vertical-align: bottom !important; } .sm\:align-text-top { vertical-align: text-top !important; } .sm\:align-text-bottom { vertical-align: text-bottom !important; } .sm\:visible { visibility: visible !important; } .sm\:invisible { visibility: hidden !important; } .sm\:whitespace-normal { white-space: normal !important; } .sm\:whitespace-no-wrap { white-space: nowrap !important; } .sm\:whitespace-pre { white-space: pre !important; } .sm\:whitespace-pre-line { white-space: pre-line !important; } .sm\:whitespace-pre-wrap { white-space: pre-wrap !important; } .sm\:break-normal { overflow-wrap: normal !important; word-break: normal !important; } .sm\:break-words { overflow-wrap: break-word !important; } .sm\:break-all { word-break: break-all !important; } .sm\:truncate { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } .sm\:w-0 { width: 0 !important; } .sm\:w-1 { width: 0.25rem !important; } .sm\:w-2 { width: 0.5rem !important; } .sm\:w-3 { width: 0.75rem !important; } .sm\:w-4 { width: 1rem !important; } .sm\:w-5 { width: 1.25rem !important; } .sm\:w-6 { width: 1.5rem !important; } .sm\:w-8 { width: 2rem !important; } .sm\:w-10 { width: 2.5rem !important; } .sm\:w-12 { width: 3rem !important; } .sm\:w-14 { width: 3.5rem !important; } .sm\:w-16 { width: 4rem !important; } .sm\:w-18 { width: 4.5rem !important; } .sm\:w-20 { width: 5rem !important; } .sm\:w-22 { width: 5.5rem !important; } .sm\:w-24 { width: 6rem !important; } .sm\:w-26 { width: 6.5rem !important; } .sm\:w-28 { width: 7rem !important; } .sm\:w-30 { width: 7.5rem !important; } .sm\:w-32 { width: 8rem !important; } .sm\:w-36 { width: 9rem !important; } .sm\:w-40 { width: 10rem !important; } .sm\:w-48 { width: 12rem !important; } .sm\:w-50 { width: 12.5rem !important; } .sm\:w-56 { width: 14rem !important; } .sm\:w-60 { width: 15rem !important; } .sm\:w-64 { width: 16rem !important; } .sm\:w-80 { width: 20rem !important; } .sm\:w-90 { width: 24rem !important; } .sm\:w-100 { width: 25rem !important; } .sm\:w-120 { width: 30rem !important; } .sm\:w-128 { width: 32rem !important; } .sm\:w-140 { width: 35rem !important; } .sm\:w-160 { width: 40rem !important; } .sm\:w-180 { width: 45rem !important; } .sm\:w-192 { width: 48rem !important; } .sm\:w-200 { width: 50rem !important; } .sm\:w-240 { width: 60rem !important; } .sm\:w-256 { width: 64rem !important; } .sm\:w-280 { width: 70rem !important; } .sm\:w-320 { width: 80rem !important; } .sm\:w-360 { width: 90rem !important; } .sm\:w-400 { width: 100rem !important; } .sm\:w-480 { width: 120rem !important; } .sm\:w-auto { width: auto !important; } .sm\:w-px { width: 1px !important; } .sm\:w-2px { width: 2px !important; } .sm\:w-1\/2 { width: 50% !important; } .sm\:w-1\/3 { width: 33.33333% !important; } .sm\:w-2\/3 { width: 66.66667% !important; } .sm\:w-1\/4 { width: 25% !important; } .sm\:w-2\/4 { width: 50% !important; } .sm\:w-3\/4 { width: 75% !important; } .sm\:w-1\/5 { width: 20% !important; } .sm\:w-2\/5 { width: 40% !important; } .sm\:w-3\/5 { width: 60% !important; } .sm\:w-4\/5 { width: 80% !important; } .sm\:w-1\/6 { width: 16.666667% !important; } .sm\:w-2\/6 { width: 33.333333% !important; } .sm\:w-3\/6 { width: 50% !important; } .sm\:w-4\/6 { width: 66.666667% !important; } .sm\:w-5\/6 { width: 83.333333% !important; } .sm\:w-1\/12 { width: 8.33333% !important; } .sm\:w-2\/12 { width: 16.66667% !important; } .sm\:w-3\/12 { width: 25% !important; } .sm\:w-4\/12 { width: 33.33333% !important; } .sm\:w-5\/12 { width: 41.66667% !important; } .sm\:w-6\/12 { width: 50% !important; } .sm\:w-7\/12 { width: 58.33333% !important; } .sm\:w-8\/12 { width: 66.66667% !important; } .sm\:w-9\/12 { width: 75% !important; } .sm\:w-10\/12 { width: 83.33333% !important; } .sm\:w-11\/12 { width: 91.66667% !important; } .sm\:w-full { width: 100% !important; } .sm\:w-screen { width: 100vw !important; } .sm\:z-0 { z-index: 0 !important; } .sm\:z-10 { z-index: 10 !important; } .sm\:z-20 { z-index: 20 !important; } .sm\:z-30 { z-index: 30 !important; } .sm\:z-40 { z-index: 40 !important; } .sm\:z-50 { z-index: 50 !important; } .sm\:z-60 { z-index: 60 !important; } .sm\:z-70 { z-index: 70 !important; } .sm\:z-80 { z-index: 80 !important; } .sm\:z-90 { z-index: 90 !important; } .sm\:z-99 { z-index: 99 !important; } .sm\:z-999 { z-index: 999 !important; } .sm\:z-9999 { z-index: 9999 !important; } .sm\:z-99999 { z-index: 99999 !important; } .sm\:z-auto { z-index: auto !important; } .sm\:-z-1 { z-index: -1 !important; } .sm\:gap-0 { grid-gap: 0 !important; gap: 0 !important; } .sm\:gap-1 { grid-gap: 0.25rem !important; gap: 0.25rem !important; } .sm\:gap-2 { grid-gap: 0.5rem !important; gap: 0.5rem !important; } .sm\:gap-3 { grid-gap: 0.75rem !important; gap: 0.75rem !important; } .sm\:gap-4 { grid-gap: 1rem !important; gap: 1rem !important; } .sm\:gap-5 { grid-gap: 1.25rem !important; gap: 1.25rem !important; } .sm\:gap-6 { grid-gap: 1.5rem !important; gap: 1.5rem !important; } .sm\:gap-8 { grid-gap: 2rem !important; gap: 2rem !important; } .sm\:gap-10 { grid-gap: 2.5rem !important; gap: 2.5rem !important; } .sm\:gap-12 { grid-gap: 3rem !important; gap: 3rem !important; } .sm\:gap-14 { grid-gap: 3.5rem !important; gap: 3.5rem !important; } .sm\:gap-16 { grid-gap: 4rem !important; gap: 4rem !important; } .sm\:gap-18 { grid-gap: 4.5rem !important; gap: 4.5rem !important; } .sm\:gap-20 { grid-gap: 5rem !important; gap: 5rem !important; } .sm\:gap-22 { grid-gap: 5.5rem !important; gap: 5.5rem !important; } .sm\:gap-24 { grid-gap: 6rem !important; gap: 6rem !important; } .sm\:gap-26 { grid-gap: 6.5rem !important; gap: 6.5rem !important; } .sm\:gap-28 { grid-gap: 7rem !important; gap: 7rem !important; } .sm\:gap-30 { grid-gap: 7.5rem !important; gap: 7.5rem !important; } .sm\:gap-32 { grid-gap: 8rem !important; gap: 8rem !important; } .sm\:gap-36 { grid-gap: 9rem !important; gap: 9rem !important; } .sm\:gap-40 { grid-gap: 10rem !important; gap: 10rem !important; } .sm\:gap-48 { grid-gap: 12rem !important; gap: 12rem !important; } .sm\:gap-56 { grid-gap: 14rem !important; gap: 14rem !important; } .sm\:gap-64 { grid-gap: 16rem !important; gap: 16rem !important; } .sm\:gap-px { grid-gap: 1px !important; gap: 1px !important; } .sm\:gap-2px { grid-gap: 2px !important; gap: 2px !important; } .sm\:col-gap-0 { grid-column-gap: 0 !important; -moz-column-gap: 0 !important; column-gap: 0 !important; } .sm\:col-gap-1 { grid-column-gap: 0.25rem !important; -moz-column-gap: 0.25rem !important; column-gap: 0.25rem !important; } .sm\:col-gap-2 { grid-column-gap: 0.5rem !important; -moz-column-gap: 0.5rem !important; column-gap: 0.5rem !important; } .sm\:col-gap-3 { grid-column-gap: 0.75rem !important; -moz-column-gap: 0.75rem !important; column-gap: 0.75rem !important; } .sm\:col-gap-4 { grid-column-gap: 1rem !important; -moz-column-gap: 1rem !important; column-gap: 1rem !important; } .sm\:col-gap-5 { grid-column-gap: 1.25rem !important; -moz-column-gap: 1.25rem !important; column-gap: 1.25rem !important; } .sm\:col-gap-6 { grid-column-gap: 1.5rem !important; -moz-column-gap: 1.5rem !important; column-gap: 1.5rem !important; } .sm\:col-gap-8 { grid-column-gap: 2rem !important; -moz-column-gap: 2rem !important; column-gap: 2rem !important; } .sm\:col-gap-10 { grid-column-gap: 2.5rem !important; -moz-column-gap: 2.5rem !important; column-gap: 2.5rem !important; } .sm\:col-gap-12 { grid-column-gap: 3rem !important; -moz-column-gap: 3rem !important; column-gap: 3rem !important; } .sm\:col-gap-14 { grid-column-gap: 3.5rem !important; -moz-column-gap: 3.5rem !important; column-gap: 3.5rem !important; } .sm\:col-gap-16 { grid-column-gap: 4rem !important; -moz-column-gap: 4rem !important; column-gap: 4rem !important; } .sm\:col-gap-18 { grid-column-gap: 4.5rem !important; -moz-column-gap: 4.5rem !important; column-gap: 4.5rem !important; } .sm\:col-gap-20 { grid-column-gap: 5rem !important; -moz-column-gap: 5rem !important; column-gap: 5rem !important; } .sm\:col-gap-22 { grid-column-gap: 5.5rem !important; -moz-column-gap: 5.5rem !important; column-gap: 5.5rem !important; } .sm\:col-gap-24 { grid-column-gap: 6rem !important; -moz-column-gap: 6rem !important; column-gap: 6rem !important; } .sm\:col-gap-26 { grid-column-gap: 6.5rem !important; -moz-column-gap: 6.5rem !important; column-gap: 6.5rem !important; } .sm\:col-gap-28 { grid-column-gap: 7rem !important; -moz-column-gap: 7rem !important; column-gap: 7rem !important; } .sm\:col-gap-30 { grid-column-gap: 7.5rem !important; -moz-column-gap: 7.5rem !important; column-gap: 7.5rem !important; } .sm\:col-gap-32 { grid-column-gap: 8rem !important; -moz-column-gap: 8rem !important; column-gap: 8rem !important; } .sm\:col-gap-36 { grid-column-gap: 9rem !important; -moz-column-gap: 9rem !important; column-gap: 9rem !important; } .sm\:col-gap-40 { grid-column-gap: 10rem !important; -moz-column-gap: 10rem !important; column-gap: 10rem !important; } .sm\:col-gap-48 { grid-column-gap: 12rem !important; -moz-column-gap: 12rem !important; column-gap: 12rem !important; } .sm\:col-gap-56 { grid-column-gap: 14rem !important; -moz-column-gap: 14rem !important; column-gap: 14rem !important; } .sm\:col-gap-64 { grid-column-gap: 16rem !important; -moz-column-gap: 16rem !important; column-gap: 16rem !important; } .sm\:col-gap-px { grid-column-gap: 1px !important; -moz-column-gap: 1px !important; column-gap: 1px !important; } .sm\:col-gap-2px { grid-column-gap: 2px !important; -moz-column-gap: 2px !important; column-gap: 2px !important; } .sm\:row-gap-0 { grid-row-gap: 0 !important; row-gap: 0 !important; } .sm\:row-gap-1 { grid-row-gap: 0.25rem !important; row-gap: 0.25rem !important; } .sm\:row-gap-2 { grid-row-gap: 0.5rem !important; row-gap: 0.5rem !important; } .sm\:row-gap-3 { grid-row-gap: 0.75rem !important; row-gap: 0.75rem !important; } .sm\:row-gap-4 { grid-row-gap: 1rem !important; row-gap: 1rem !important; } .sm\:row-gap-5 { grid-row-gap: 1.25rem !important; row-gap: 1.25rem !important; } .sm\:row-gap-6 { grid-row-gap: 1.5rem !important; row-gap: 1.5rem !important; } .sm\:row-gap-8 { grid-row-gap: 2rem !important; row-gap: 2rem !important; } .sm\:row-gap-10 { grid-row-gap: 2.5rem !important; row-gap: 2.5rem !important; } .sm\:row-gap-12 { grid-row-gap: 3rem !important; row-gap: 3rem !important; } .sm\:row-gap-14 { grid-row-gap: 3.5rem !important; row-gap: 3.5rem !important; } .sm\:row-gap-16 { grid-row-gap: 4rem !important; row-gap: 4rem !important; } .sm\:row-gap-18 { grid-row-gap: 4.5rem !important; row-gap: 4.5rem !important; } .sm\:row-gap-20 { grid-row-gap: 5rem !important; row-gap: 5rem !important; } .sm\:row-gap-22 { grid-row-gap: 5.5rem !important; row-gap: 5.5rem !important; } .sm\:row-gap-24 { grid-row-gap: 6rem !important; row-gap: 6rem !important; } .sm\:row-gap-26 { grid-row-gap: 6.5rem !important; row-gap: 6.5rem !important; } .sm\:row-gap-28 { grid-row-gap: 7rem !important; row-gap: 7rem !important; } .sm\:row-gap-30 { grid-row-gap: 7.5rem !important; row-gap: 7.5rem !important; } .sm\:row-gap-32 { grid-row-gap: 8rem !important; row-gap: 8rem !important; } .sm\:row-gap-36 { grid-row-gap: 9rem !important; row-gap: 9rem !important; } .sm\:row-gap-40 { grid-row-gap: 10rem !important; row-gap: 10rem !important; } .sm\:row-gap-48 { grid-row-gap: 12rem !important; row-gap: 12rem !important; } .sm\:row-gap-56 { grid-row-gap: 14rem !important; row-gap: 14rem !important; } .sm\:row-gap-64 { grid-row-gap: 16rem !important; row-gap: 16rem !important; } .sm\:row-gap-px { grid-row-gap: 1px !important; row-gap: 1px !important; } .sm\:row-gap-2px { grid-row-gap: 2px !important; row-gap: 2px !important; } .sm\:grid-flow-row { grid-auto-flow: row !important; } .sm\:grid-flow-col { grid-auto-flow: column !important; } .sm\:grid-flow-row-dense { grid-auto-flow: row dense !important; } .sm\:grid-flow-col-dense { grid-auto-flow: column dense !important; } .sm\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; } .sm\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } .sm\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; } .sm\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; } .sm\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; } .sm\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; } .sm\:grid-cols-7 { grid-template-columns: repeat(7, minmax(0, 1fr)) !important; } .sm\:grid-cols-8 { grid-template-columns: repeat(8, minmax(0, 1fr)) !important; } .sm\:grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)) !important; } .sm\:grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)) !important; } .sm\:grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)) !important; } .sm\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)) !important; } .sm\:grid-cols-none { grid-template-columns: none !important; } .sm\:col-auto { grid-column: auto !important; } .sm\:col-span-1 { grid-column: span 1 / span 1 !important; } .sm\:col-span-2 { grid-column: span 2 / span 2 !important; } .sm\:col-span-3 { grid-column: span 3 / span 3 !important; } .sm\:col-span-4 { grid-column: span 4 / span 4 !important; } .sm\:col-span-5 { grid-column: span 5 / span 5 !important; } .sm\:col-span-6 { grid-column: span 6 / span 6 !important; } .sm\:col-span-7 { grid-column: span 7 / span 7 !important; } .sm\:col-span-8 { grid-column: span 8 / span 8 !important; } .sm\:col-span-9 { grid-column: span 9 / span 9 !important; } .sm\:col-span-10 { grid-column: span 10 / span 10 !important; } .sm\:col-span-11 { grid-column: span 11 / span 11 !important; } .sm\:col-span-12 { grid-column: span 12 / span 12 !important; } .sm\:col-start-1 { grid-column-start: 1 !important; } .sm\:col-start-2 { grid-column-start: 2 !important; } .sm\:col-start-3 { grid-column-start: 3 !important; } .sm\:col-start-4 { grid-column-start: 4 !important; } .sm\:col-start-5 { grid-column-start: 5 !important; } .sm\:col-start-6 { grid-column-start: 6 !important; } .sm\:col-start-7 { grid-column-start: 7 !important; } .sm\:col-start-8 { grid-column-start: 8 !important; } .sm\:col-start-9 { grid-column-start: 9 !important; } .sm\:col-start-10 { grid-column-start: 10 !important; } .sm\:col-start-11 { grid-column-start: 11 !important; } .sm\:col-start-12 { grid-column-start: 12 !important; } .sm\:col-start-13 { grid-column-start: 13 !important; } .sm\:col-start-auto { grid-column-start: auto !important; } .sm\:col-end-1 { grid-column-end: 1 !important; } .sm\:col-end-2 { grid-column-end: 2 !important; } .sm\:col-end-3 { grid-column-end: 3 !important; } .sm\:col-end-4 { grid-column-end: 4 !important; } .sm\:col-end-5 { grid-column-end: 5 !important; } .sm\:col-end-6 { grid-column-end: 6 !important; } .sm\:col-end-7 { grid-column-end: 7 !important; } .sm\:col-end-8 { grid-column-end: 8 !important; } .sm\:col-end-9 { grid-column-end: 9 !important; } .sm\:col-end-10 { grid-column-end: 10 !important; } .sm\:col-end-11 { grid-column-end: 11 !important; } .sm\:col-end-12 { grid-column-end: 12 !important; } .sm\:col-end-13 { grid-column-end: 13 !important; } .sm\:col-end-auto { grid-column-end: auto !important; } .sm\:grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)) !important; } .sm\:grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)) !important; } .sm\:grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)) !important; } .sm\:grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)) !important; } .sm\:grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)) !important; } .sm\:grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)) !important; } .sm\:grid-rows-none { grid-template-rows: none !important; } .sm\:row-auto { grid-row: auto !important; } .sm\:row-span-1 { grid-row: span 1 / span 1 !important; } .sm\:row-span-2 { grid-row: span 2 / span 2 !important; } .sm\:row-span-3 { grid-row: span 3 / span 3 !important; } .sm\:row-span-4 { grid-row: span 4 / span 4 !important; } .sm\:row-span-5 { grid-row: span 5 / span 5 !important; } .sm\:row-span-6 { grid-row: span 6 / span 6 !important; } .sm\:row-start-1 { grid-row-start: 1 !important; } .sm\:row-start-2 { grid-row-start: 2 !important; } .sm\:row-start-3 { grid-row-start: 3 !important; } .sm\:row-start-4 { grid-row-start: 4 !important; } .sm\:row-start-5 { grid-row-start: 5 !important; } .sm\:row-start-6 { grid-row-start: 6 !important; } .sm\:row-start-7 { grid-row-start: 7 !important; } .sm\:row-start-auto { grid-row-start: auto !important; } .sm\:row-end-1 { grid-row-end: 1 !important; } .sm\:row-end-2 { grid-row-end: 2 !important; } .sm\:row-end-3 { grid-row-end: 3 !important; } .sm\:row-end-4 { grid-row-end: 4 !important; } .sm\:row-end-5 { grid-row-end: 5 !important; } .sm\:row-end-6 { grid-row-end: 6 !important; } .sm\:row-end-7 { grid-row-end: 7 !important; } .sm\:row-end-auto { grid-row-end: auto !important; } .sm\:transform { --transform-translate-x: 0 !important; --transform-translate-y: 0 !important; --transform-rotate: 0 !important; --transform-skew-x: 0 !important; --transform-skew-y: 0 !important; --transform-scale-x: 1 !important; --transform-scale-y: 1 !important; transform: translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y)) !important; } .sm\:transform-none { transform: none !important; } .sm\:origin-center { transform-origin: center !important; } .sm\:origin-top { transform-origin: top !important; } .sm\:origin-top-right { transform-origin: top right !important; } .sm\:origin-right { transform-origin: right !important; } .sm\:origin-bottom-right { transform-origin: bottom right !important; } .sm\:origin-bottom { transform-origin: bottom !important; } .sm\:origin-bottom-left { transform-origin: bottom left !important; } .sm\:origin-left { transform-origin: left !important; } .sm\:origin-top-left { transform-origin: top left !important; } .sm\:icon-size-12 { width: 12px !important; height: 12px !important; min-width: 12px !important; min-height: 12px !important; font-size: 12px !important; line-height: 12px !important; } .sm\:icon-size-12 svg { width: 12px !important; height: 12px !important; } .sm\:icon-size-14 { width: 14px !important; height: 14px !important; min-width: 14px !important; min-height: 14px !important; font-size: 14px !important; line-height: 14px !important; } .sm\:icon-size-14 svg { width: 14px !important; height: 14px !important; } .sm\:icon-size-16 { width: 16px !important; height: 16px !important; min-width: 16px !important; min-height: 16px !important; font-size: 16px !important; line-height: 16px !important; } .sm\:icon-size-16 svg { width: 16px !important; height: 16px !important; } .sm\:icon-size-18 { width: 18px !important; height: 18px !important; min-width: 18px !important; min-height: 18px !important; font-size: 18px !important; line-height: 18px !important; } .sm\:icon-size-18 svg { width: 18px !important; height: 18px !important; } .sm\:icon-size-20 { width: 20px !important; height: 20px !important; min-width: 20px !important; min-height: 20px !important; font-size: 20px !important; line-height: 20px !important; } .sm\:icon-size-20 svg { width: 20px !important; height: 20px !important; } .sm\:icon-size-24 { width: 24px !important; height: 24px !important; min-width: 24px !important; min-height: 24px !important; font-size: 24px !important; line-height: 24px !important; } .sm\:icon-size-24 svg { width: 24px !important; height: 24px !important; } .sm\:icon-size-32 { width: 32px !important; height: 32px !important; min-width: 32px !important; min-height: 32px !important; font-size: 32px !important; line-height: 32px !important; } .sm\:icon-size-32 svg { width: 32px !important; height: 32px !important; } .sm\:icon-size-40 { width: 40px !important; height: 40px !important; min-width: 40px !important; min-height: 40px !important; font-size: 40px !important; line-height: 40px !important; } .sm\:icon-size-40 svg { width: 40px !important; height: 40px !important; } .sm\:icon-size-48 { width: 48px !important; height: 48px !important; min-width: 48px !important; min-height: 48px !important; font-size: 48px !important; line-height: 48px !important; } .sm\:icon-size-48 svg { width: 48px !important; height: 48px !important; } .sm\:icon-size-56 { width: 56px !important; height: 56px !important; min-width: 56px !important; min-height: 56px !important; font-size: 56px !important; line-height: 56px !important; } .sm\:icon-size-56 svg { width: 56px !important; height: 56px !important; } .sm\:icon-size-64 { width: 64px !important; height: 64px !important; min-width: 64px !important; min-height: 64px !important; font-size: 64px !important; line-height: 64px !important; } .sm\:icon-size-64 svg { width: 64px !important; height: 64px !important; } .sm\:icon-size-72 { width: 72px !important; height: 72px !important; min-width: 72px !important; min-height: 72px !important; font-size: 72px !important; line-height: 72px !important; } .sm\:icon-size-72 svg { width: 72px !important; height: 72px !important; } .sm\:icon-size-80 { width: 80px !important; height: 80px !important; min-width: 80px !important; min-height: 80px !important; font-size: 80px !important; line-height: 80px !important; } .sm\:icon-size-80 svg { width: 80px !important; height: 80px !important; } .sm\:icon-size-88 { width: 88px !important; height: 88px !important; min-width: 88px !important; min-height: 88px !important; font-size: 88px !important; line-height: 88px !important; } .sm\:icon-size-88 svg { width: 88px !important; height: 88px !important; } .sm\:icon-size-96 { width: 96px !important; height: 96px !important; min-width: 96px !important; min-height: 96px !important; font-size: 96px !important; line-height: 96px !important; } .sm\:icon-size-96 svg { width: 96px !important; height: 96px !important; } } @media (min-width: 960px) and (max-width: 1279px) { .md\:space-y-0 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0px * var(--space-y-reverse)) !important; } .md\:space-x-0 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0px * var(--space-x-reverse)) !important; margin-left: calc(0px * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.25rem * var(--space-y-reverse)) !important; } .md\:space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.25rem * var(--space-x-reverse)) !important; margin-left: calc(0.25rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.5rem * var(--space-y-reverse)) !important; } .md\:space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.5rem * var(--space-x-reverse)) !important; margin-left: calc(0.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.75rem * var(--space-y-reverse)) !important; } .md\:space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.75rem * var(--space-x-reverse)) !important; margin-left: calc(0.75rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1rem * var(--space-y-reverse)) !important; } .md\:space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1rem * var(--space-x-reverse)) !important; margin-left: calc(1rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.25rem * var(--space-y-reverse)) !important; } .md\:space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.25rem * var(--space-x-reverse)) !important; margin-left: calc(1.25rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.5rem * var(--space-y-reverse)) !important; } .md\:space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.5rem * var(--space-x-reverse)) !important; margin-left: calc(1.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2rem * var(--space-y-reverse)) !important; } .md\:space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2rem * var(--space-x-reverse)) !important; margin-left: calc(2rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2.5rem * var(--space-y-reverse)) !important; } .md\:space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2.5rem * var(--space-x-reverse)) !important; margin-left: calc(2.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3rem * var(--space-y-reverse)) !important; } .md\:space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3rem * var(--space-x-reverse)) !important; margin-left: calc(3rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3.5rem * var(--space-y-reverse)) !important; } .md\:space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3.5rem * var(--space-x-reverse)) !important; margin-left: calc(3.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4rem * var(--space-y-reverse)) !important; } .md\:space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4rem * var(--space-x-reverse)) !important; margin-left: calc(4rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4.5rem * var(--space-y-reverse)) !important; } .md\:space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4.5rem * var(--space-x-reverse)) !important; margin-left: calc(4.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5rem * var(--space-y-reverse)) !important; } .md\:space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5rem * var(--space-x-reverse)) !important; margin-left: calc(5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5.5rem * var(--space-y-reverse)) !important; } .md\:space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5.5rem * var(--space-x-reverse)) !important; margin-left: calc(5.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6rem * var(--space-y-reverse)) !important; } .md\:space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6rem * var(--space-x-reverse)) !important; margin-left: calc(6rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6.5rem * var(--space-y-reverse)) !important; } .md\:space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6.5rem * var(--space-x-reverse)) !important; margin-left: calc(6.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7rem * var(--space-y-reverse)) !important; } .md\:space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7rem * var(--space-x-reverse)) !important; margin-left: calc(7rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7.5rem * var(--space-y-reverse)) !important; } .md\:space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7.5rem * var(--space-x-reverse)) !important; margin-left: calc(7.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(8rem * var(--space-y-reverse)) !important; } .md\:space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(8rem * var(--space-x-reverse)) !important; margin-left: calc(8rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(9rem * var(--space-y-reverse)) !important; } .md\:space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(9rem * var(--space-x-reverse)) !important; margin-left: calc(9rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(10rem * var(--space-y-reverse)) !important; } .md\:space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(10rem * var(--space-x-reverse)) !important; margin-left: calc(10rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(12rem * var(--space-y-reverse)) !important; } .md\:space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(12rem * var(--space-x-reverse)) !important; margin-left: calc(12rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(14rem * var(--space-y-reverse)) !important; } .md\:space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(14rem * var(--space-x-reverse)) !important; margin-left: calc(14rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(16rem * var(--space-y-reverse)) !important; } .md\:space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(16rem * var(--space-x-reverse)) !important; margin-left: calc(16rem * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1px * var(--space-y-reverse)) !important; } .md\:space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1px * var(--space-x-reverse)) !important; margin-left: calc(1px * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2px * var(--space-y-reverse)) !important; } .md\:space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2px * var(--space-x-reverse)) !important; margin-left: calc(2px * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.25rem * var(--space-y-reverse)) !important; } .md\:-space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.25rem * var(--space-x-reverse)) !important; margin-left: calc(-0.25rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.5rem * var(--space-y-reverse)) !important; } .md\:-space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.5rem * var(--space-x-reverse)) !important; margin-left: calc(-0.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.75rem * var(--space-y-reverse)) !important; } .md\:-space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.75rem * var(--space-x-reverse)) !important; margin-left: calc(-0.75rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1rem * var(--space-y-reverse)) !important; } .md\:-space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1rem * var(--space-x-reverse)) !important; margin-left: calc(-1rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.25rem * var(--space-y-reverse)) !important; } .md\:-space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.25rem * var(--space-x-reverse)) !important; margin-left: calc(-1.25rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.5rem * var(--space-y-reverse)) !important; } .md\:-space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.5rem * var(--space-x-reverse)) !important; margin-left: calc(-1.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2rem * var(--space-y-reverse)) !important; } .md\:-space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2rem * var(--space-x-reverse)) !important; margin-left: calc(-2rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2.5rem * var(--space-y-reverse)) !important; } .md\:-space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2.5rem * var(--space-x-reverse)) !important; margin-left: calc(-2.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3rem * var(--space-y-reverse)) !important; } .md\:-space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3rem * var(--space-x-reverse)) !important; margin-left: calc(-3rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3.5rem * var(--space-y-reverse)) !important; } .md\:-space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3.5rem * var(--space-x-reverse)) !important; margin-left: calc(-3.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4rem * var(--space-y-reverse)) !important; } .md\:-space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4rem * var(--space-x-reverse)) !important; margin-left: calc(-4rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4.5rem * var(--space-y-reverse)) !important; } .md\:-space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4.5rem * var(--space-x-reverse)) !important; margin-left: calc(-4.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5rem * var(--space-y-reverse)) !important; } .md\:-space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5rem * var(--space-x-reverse)) !important; margin-left: calc(-5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5.5rem * var(--space-y-reverse)) !important; } .md\:-space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5.5rem * var(--space-x-reverse)) !important; margin-left: calc(-5.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6rem * var(--space-y-reverse)) !important; } .md\:-space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6rem * var(--space-x-reverse)) !important; margin-left: calc(-6rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6.5rem * var(--space-y-reverse)) !important; } .md\:-space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6.5rem * var(--space-x-reverse)) !important; margin-left: calc(-6.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7rem * var(--space-y-reverse)) !important; } .md\:-space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7rem * var(--space-x-reverse)) !important; margin-left: calc(-7rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7.5rem * var(--space-y-reverse)) !important; } .md\:-space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7.5rem * var(--space-x-reverse)) !important; margin-left: calc(-7.5rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-8rem * var(--space-y-reverse)) !important; } .md\:-space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-8rem * var(--space-x-reverse)) !important; margin-left: calc(-8rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-9rem * var(--space-y-reverse)) !important; } .md\:-space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-9rem * var(--space-x-reverse)) !important; margin-left: calc(-9rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-10rem * var(--space-y-reverse)) !important; } .md\:-space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-10rem * var(--space-x-reverse)) !important; margin-left: calc(-10rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-12rem * var(--space-y-reverse)) !important; } .md\:-space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-12rem * var(--space-x-reverse)) !important; margin-left: calc(-12rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-14rem * var(--space-y-reverse)) !important; } .md\:-space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-14rem * var(--space-x-reverse)) !important; margin-left: calc(-14rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-16rem * var(--space-y-reverse)) !important; } .md\:-space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-16rem * var(--space-x-reverse)) !important; margin-left: calc(-16rem * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1px * var(--space-y-reverse)) !important; } .md\:-space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1px * var(--space-x-reverse)) !important; margin-left: calc(-1px * calc(1 - var(--space-x-reverse))) !important; } .md\:-space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2px * var(--space-y-reverse)) !important; } .md\:-space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2px * var(--space-x-reverse)) !important; margin-left: calc(-2px * calc(1 - var(--space-x-reverse))) !important; } .md\:space-y-reverse > :not(template) ~ :not(template) { --space-y-reverse: 1 !important; } .md\:space-x-reverse > :not(template) ~ :not(template) { --space-x-reverse: 1 !important; } .md\:divide-y-0 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(0px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(0px * var(--divide-y-reverse)) !important; } .md\:divide-x-0 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(0px * var(--divide-x-reverse)) !important; border-left-width: calc(0px * calc(1 - var(--divide-x-reverse))) !important; } .md\:divide-y-2 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(2px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(2px * var(--divide-y-reverse)) !important; } .md\:divide-x-2 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(2px * var(--divide-x-reverse)) !important; border-left-width: calc(2px * calc(1 - var(--divide-x-reverse))) !important; } .md\:divide-y-4 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(4px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(4px * var(--divide-y-reverse)) !important; } .md\:divide-x-4 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(4px * var(--divide-x-reverse)) !important; border-left-width: calc(4px * calc(1 - var(--divide-x-reverse))) !important; } .md\:divide-y-8 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(8px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(8px * var(--divide-y-reverse)) !important; } .md\:divide-x-8 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(8px * var(--divide-x-reverse)) !important; border-left-width: calc(8px * calc(1 - var(--divide-x-reverse))) !important; } .md\:divide-y > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(1px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(1px * var(--divide-y-reverse)) !important; } .md\:divide-x > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(1px * var(--divide-x-reverse)) !important; border-left-width: calc(1px * calc(1 - var(--divide-x-reverse))) !important; } .md\:divide-y-reverse > :not(template) ~ :not(template) { --divide-y-reverse: 1 !important; } .md\:divide-x-reverse > :not(template) ~ :not(template) { --divide-x-reverse: 1 !important; } .md\:divide-current > :not(template) ~ :not(template) { border-color: currentColor !important; } .md\:divide-transparent > :not(template) ~ :not(template) { border-color: transparent !important; } .md\:divide-white > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFFFFF !important; border-color: rgba(255, 255, 255, var(--divide-opacity)) !important; } .md\:divide-black > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #000000 !important; border-color: rgba(0, 0, 0, var(--divide-opacity)) !important; } .md\:divide-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F9FAFB !important; border-color: rgba(249, 250, 251, var(--divide-opacity)) !important; } .md\:divide-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F4F5F7 !important; border-color: rgba(244, 245, 247, var(--divide-opacity)) !important; } .md\:divide-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5E7EB !important; border-color: rgba(229, 231, 235, var(--divide-opacity)) !important; } .md\:divide-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D2D6DC !important; border-color: rgba(210, 214, 220, var(--divide-opacity)) !important; } .md\:divide-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9FA6B2 !important; border-color: rgba(159, 166, 178, var(--divide-opacity)) !important; } .md\:divide-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .md\:divide-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4B5563 !important; border-color: rgba(75, 85, 99, var(--divide-opacity)) !important; } .md\:divide-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #374151 !important; border-color: rgba(55, 65, 81, var(--divide-opacity)) !important; } .md\:divide-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #252F3F !important; border-color: rgba(37, 47, 63, var(--divide-opacity)) !important; } .md\:divide-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #161E2E !important; border-color: rgba(22, 30, 46, var(--divide-opacity)) !important; } .md\:divide-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .md\:divide-cool-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBFDFE !important; border-color: rgba(251, 253, 254, var(--divide-opacity)) !important; } .md\:divide-cool-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F1F5F9 !important; border-color: rgba(241, 245, 249, var(--divide-opacity)) !important; } .md\:divide-cool-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E2E8F0 !important; border-color: rgba(226, 232, 240, var(--divide-opacity)) !important; } .md\:divide-cool-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CFD8E3 !important; border-color: rgba(207, 216, 227, var(--divide-opacity)) !important; } .md\:divide-cool-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #97A6BA !important; border-color: rgba(151, 166, 186, var(--divide-opacity)) !important; } .md\:divide-cool-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .md\:divide-cool-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #475569 !important; border-color: rgba(71, 85, 105, var(--divide-opacity)) !important; } .md\:divide-cool-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #364152 !important; border-color: rgba(54, 65, 82, var(--divide-opacity)) !important; } .md\:divide-cool-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #27303F !important; border-color: rgba(39, 48, 63, var(--divide-opacity)) !important; } .md\:divide-cool-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A202E !important; border-color: rgba(26, 32, 46, var(--divide-opacity)) !important; } .md\:divide-cool-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .md\:divide-red-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F2 !important; border-color: rgba(253, 242, 242, var(--divide-opacity)) !important; } .md\:divide-red-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDE8E8 !important; border-color: rgba(253, 232, 232, var(--divide-opacity)) !important; } .md\:divide-red-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBD5D5 !important; border-color: rgba(251, 213, 213, var(--divide-opacity)) !important; } .md\:divide-red-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4B4 !important; border-color: rgba(248, 180, 180, var(--divide-opacity)) !important; } .md\:divide-red-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F98080 !important; border-color: rgba(249, 128, 128, var(--divide-opacity)) !important; } .md\:divide-red-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .md\:divide-red-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E02424 !important; border-color: rgba(224, 36, 36, var(--divide-opacity)) !important; } .md\:divide-red-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C81E1E !important; border-color: rgba(200, 30, 30, var(--divide-opacity)) !important; } .md\:divide-red-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9B1C1C !important; border-color: rgba(155, 28, 28, var(--divide-opacity)) !important; } .md\:divide-red-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .md\:divide-red > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .md\:divide-orange-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFF8F1 !important; border-color: rgba(255, 248, 241, var(--divide-opacity)) !important; } .md\:divide-orange-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FEECDC !important; border-color: rgba(254, 236, 220, var(--divide-opacity)) !important; } .md\:divide-orange-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCD9BD !important; border-color: rgba(252, 217, 189, var(--divide-opacity)) !important; } .md\:divide-orange-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDBA8C !important; border-color: rgba(253, 186, 140, var(--divide-opacity)) !important; } .md\:divide-orange-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF8A4C !important; border-color: rgba(255, 138, 76, var(--divide-opacity)) !important; } .md\:divide-orange-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .md\:divide-orange-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D03801 !important; border-color: rgba(208, 56, 1, var(--divide-opacity)) !important; } .md\:divide-orange-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B43403 !important; border-color: rgba(180, 52, 3, var(--divide-opacity)) !important; } .md\:divide-orange-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8A2C0D !important; border-color: rgba(138, 44, 13, var(--divide-opacity)) !important; } .md\:divide-orange-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .md\:divide-orange > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .md\:divide-yellow-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDFDEA !important; border-color: rgba(253, 253, 234, var(--divide-opacity)) !important; } .md\:divide-yellow-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF6B2 !important; border-color: rgba(253, 246, 178, var(--divide-opacity)) !important; } .md\:divide-yellow-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE96A !important; border-color: rgba(252, 233, 106, var(--divide-opacity)) !important; } .md\:divide-yellow-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FACA15 !important; border-color: rgba(250, 202, 21, var(--divide-opacity)) !important; } .md\:divide-yellow-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E3A008 !important; border-color: rgba(227, 160, 8, var(--divide-opacity)) !important; } .md\:divide-yellow-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .md\:divide-yellow-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9F580A !important; border-color: rgba(159, 88, 10, var(--divide-opacity)) !important; } .md\:divide-yellow-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8E4B10 !important; border-color: rgba(142, 75, 16, var(--divide-opacity)) !important; } .md\:divide-yellow-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #723B13 !important; border-color: rgba(114, 59, 19, var(--divide-opacity)) !important; } .md\:divide-yellow-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #633112 !important; border-color: rgba(99, 49, 18, var(--divide-opacity)) !important; } .md\:divide-yellow > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .md\:divide-green-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F3FAF7 !important; border-color: rgba(243, 250, 247, var(--divide-opacity)) !important; } .md\:divide-green-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DEF7EC !important; border-color: rgba(222, 247, 236, var(--divide-opacity)) !important; } .md\:divide-green-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BCF0DA !important; border-color: rgba(188, 240, 218, var(--divide-opacity)) !important; } .md\:divide-green-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #84E1BC !important; border-color: rgba(132, 225, 188, var(--divide-opacity)) !important; } .md\:divide-green-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #31C48D !important; border-color: rgba(49, 196, 141, var(--divide-opacity)) !important; } .md\:divide-green-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .md\:divide-green-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #057A55 !important; border-color: rgba(5, 122, 85, var(--divide-opacity)) !important; } .md\:divide-green-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #046C4E !important; border-color: rgba(4, 108, 78, var(--divide-opacity)) !important; } .md\:divide-green-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #03543F !important; border-color: rgba(3, 84, 63, var(--divide-opacity)) !important; } .md\:divide-green-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014737 !important; border-color: rgba(1, 71, 55, var(--divide-opacity)) !important; } .md\:divide-green > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .md\:divide-teal-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDFAFA !important; border-color: rgba(237, 250, 250, var(--divide-opacity)) !important; } .md\:divide-teal-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D5F5F6 !important; border-color: rgba(213, 245, 246, var(--divide-opacity)) !important; } .md\:divide-teal-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AFECEF !important; border-color: rgba(175, 236, 239, var(--divide-opacity)) !important; } .md\:divide-teal-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7EDCE2 !important; border-color: rgba(126, 220, 226, var(--divide-opacity)) !important; } .md\:divide-teal-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #16BDCA !important; border-color: rgba(22, 189, 202, var(--divide-opacity)) !important; } .md\:divide-teal-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .md\:divide-teal-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #047481 !important; border-color: rgba(4, 116, 129, var(--divide-opacity)) !important; } .md\:divide-teal-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #036672 !important; border-color: rgba(3, 102, 114, var(--divide-opacity)) !important; } .md\:divide-teal-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #05505C !important; border-color: rgba(5, 80, 92, var(--divide-opacity)) !important; } .md\:divide-teal-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014451 !important; border-color: rgba(1, 68, 81, var(--divide-opacity)) !important; } .md\:divide-teal > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .md\:divide-blue-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EBF5FF !important; border-color: rgba(235, 245, 255, var(--divide-opacity)) !important; } .md\:divide-blue-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E1EFFE !important; border-color: rgba(225, 239, 254, var(--divide-opacity)) !important; } .md\:divide-blue-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C3DDFD !important; border-color: rgba(195, 221, 253, var(--divide-opacity)) !important; } .md\:divide-blue-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #A4CAFE !important; border-color: rgba(164, 202, 254, var(--divide-opacity)) !important; } .md\:divide-blue-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #76A9FA !important; border-color: rgba(118, 169, 250, var(--divide-opacity)) !important; } .md\:divide-blue-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .md\:divide-blue-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1C64F2 !important; border-color: rgba(28, 100, 242, var(--divide-opacity)) !important; } .md\:divide-blue-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A56DB !important; border-color: rgba(26, 86, 219, var(--divide-opacity)) !important; } .md\:divide-blue-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1E429F !important; border-color: rgba(30, 66, 159, var(--divide-opacity)) !important; } .md\:divide-blue-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #233876 !important; border-color: rgba(35, 56, 118, var(--divide-opacity)) !important; } .md\:divide-blue > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .md\:divide-indigo-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F0F5FF !important; border-color: rgba(240, 245, 255, var(--divide-opacity)) !important; } .md\:divide-indigo-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5EDFF !important; border-color: rgba(229, 237, 255, var(--divide-opacity)) !important; } .md\:divide-indigo-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CDDBFE !important; border-color: rgba(205, 219, 254, var(--divide-opacity)) !important; } .md\:divide-indigo-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B4C6FC !important; border-color: rgba(180, 198, 252, var(--divide-opacity)) !important; } .md\:divide-indigo-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8DA2FB !important; border-color: rgba(141, 162, 251, var(--divide-opacity)) !important; } .md\:divide-indigo-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .md\:divide-indigo-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5850EC !important; border-color: rgba(88, 80, 236, var(--divide-opacity)) !important; } .md\:divide-indigo-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5145CD !important; border-color: rgba(81, 69, 205, var(--divide-opacity)) !important; } .md\:divide-indigo-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #42389D !important; border-color: rgba(66, 56, 157, var(--divide-opacity)) !important; } .md\:divide-indigo-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #362F78 !important; border-color: rgba(54, 47, 120, var(--divide-opacity)) !important; } .md\:divide-indigo > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .md\:divide-purple-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F6F5FF !important; border-color: rgba(246, 245, 255, var(--divide-opacity)) !important; } .md\:divide-purple-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDEBFE !important; border-color: rgba(237, 235, 254, var(--divide-opacity)) !important; } .md\:divide-purple-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DCD7FE !important; border-color: rgba(220, 215, 254, var(--divide-opacity)) !important; } .md\:divide-purple-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CABFFD !important; border-color: rgba(202, 191, 253, var(--divide-opacity)) !important; } .md\:divide-purple-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AC94FA !important; border-color: rgba(172, 148, 250, var(--divide-opacity)) !important; } .md\:divide-purple-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .md\:divide-purple-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7E3AF2 !important; border-color: rgba(126, 58, 242, var(--divide-opacity)) !important; } .md\:divide-purple-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6C2BD9 !important; border-color: rgba(108, 43, 217, var(--divide-opacity)) !important; } .md\:divide-purple-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5521B5 !important; border-color: rgba(85, 33, 181, var(--divide-opacity)) !important; } .md\:divide-purple-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4A1D96 !important; border-color: rgba(74, 29, 150, var(--divide-opacity)) !important; } .md\:divide-purple > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .md\:divide-pink-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F8 !important; border-color: rgba(253, 242, 248, var(--divide-opacity)) !important; } .md\:divide-pink-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE8F3 !important; border-color: rgba(252, 232, 243, var(--divide-opacity)) !important; } .md\:divide-pink-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FAD1E8 !important; border-color: rgba(250, 209, 232, var(--divide-opacity)) !important; } .md\:divide-pink-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4D9 !important; border-color: rgba(248, 180, 217, var(--divide-opacity)) !important; } .md\:divide-pink-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F17EB8 !important; border-color: rgba(241, 126, 184, var(--divide-opacity)) !important; } .md\:divide-pink-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .md\:divide-pink-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D61F69 !important; border-color: rgba(214, 31, 105, var(--divide-opacity)) !important; } .md\:divide-pink-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BF125D !important; border-color: rgba(191, 18, 93, var(--divide-opacity)) !important; } .md\:divide-pink-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #99154B !important; border-color: rgba(153, 21, 75, var(--divide-opacity)) !important; } .md\:divide-pink-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #751A3D !important; border-color: rgba(117, 26, 61, var(--divide-opacity)) !important; } .md\:divide-pink > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .md\:divide-opacity-0 > :not(template) ~ :not(template) { --divide-opacity: 0 !important; } .md\:divide-opacity-12 > :not(template) ~ :not(template) { --divide-opacity: 0.12 !important; } .md\:divide-opacity-25 > :not(template) ~ :not(template) { --divide-opacity: 0.25 !important; } .md\:divide-opacity-38 > :not(template) ~ :not(template) { --divide-opacity: 0.38 !important; } .md\:divide-opacity-50 > :not(template) ~ :not(template) { --divide-opacity: 0.5 !important; } .md\:divide-opacity-54 > :not(template) ~ :not(template) { --divide-opacity: 0.54 !important; } .md\:divide-opacity-70 > :not(template) ~ :not(template) { --divide-opacity: 0.70 !important; } .md\:divide-opacity-75 > :not(template) ~ :not(template) { --divide-opacity: 0.75 !important; } .md\:divide-opacity-84 > :not(template) ~ :not(template) { --divide-opacity: 0.84 !important; } .md\:divide-opacity-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; } .md\:sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .md\:not-sr-only { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .md\:focus\:sr-only:focus { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .md\:focus\:not-sr-only:focus { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .md\:appearance-none { -webkit-appearance: none !important; -moz-appearance: none !important; appearance: none !important; } .md\:bg-fixed { background-attachment: fixed !important; } .md\:bg-local { background-attachment: local !important; } .md\:bg-scroll { background-attachment: scroll !important; } .md\:bg-opacity-0 { --bg-opacity: 0 !important; } .md\:bg-opacity-12 { --bg-opacity: 0.12 !important; } .md\:bg-opacity-25 { --bg-opacity: 0.25 !important; } .md\:bg-opacity-38 { --bg-opacity: 0.38 !important; } .md\:bg-opacity-50 { --bg-opacity: 0.5 !important; } .md\:bg-opacity-54 { --bg-opacity: 0.54 !important; } .md\:bg-opacity-70 { --bg-opacity: 0.70 !important; } .md\:bg-opacity-75 { --bg-opacity: 0.75 !important; } .md\:bg-opacity-84 { --bg-opacity: 0.84 !important; } .md\:bg-opacity-100 { --bg-opacity: 1 !important; } .md\:hover\:bg-opacity-0:hover { --bg-opacity: 0 !important; } .md\:hover\:bg-opacity-12:hover { --bg-opacity: 0.12 !important; } .md\:hover\:bg-opacity-25:hover { --bg-opacity: 0.25 !important; } .md\:hover\:bg-opacity-38:hover { --bg-opacity: 0.38 !important; } .md\:hover\:bg-opacity-50:hover { --bg-opacity: 0.5 !important; } .md\:hover\:bg-opacity-54:hover { --bg-opacity: 0.54 !important; } .md\:hover\:bg-opacity-70:hover { --bg-opacity: 0.70 !important; } .md\:hover\:bg-opacity-75:hover { --bg-opacity: 0.75 !important; } .md\:hover\:bg-opacity-84:hover { --bg-opacity: 0.84 !important; } .md\:hover\:bg-opacity-100:hover { --bg-opacity: 1 !important; } .md\:focus\:bg-opacity-0:focus { --bg-opacity: 0 !important; } .md\:focus\:bg-opacity-12:focus { --bg-opacity: 0.12 !important; } .md\:focus\:bg-opacity-25:focus { --bg-opacity: 0.25 !important; } .md\:focus\:bg-opacity-38:focus { --bg-opacity: 0.38 !important; } .md\:focus\:bg-opacity-50:focus { --bg-opacity: 0.5 !important; } .md\:focus\:bg-opacity-54:focus { --bg-opacity: 0.54 !important; } .md\:focus\:bg-opacity-70:focus { --bg-opacity: 0.70 !important; } .md\:focus\:bg-opacity-75:focus { --bg-opacity: 0.75 !important; } .md\:focus\:bg-opacity-84:focus { --bg-opacity: 0.84 !important; } .md\:focus\:bg-opacity-100:focus { --bg-opacity: 1 !important; } .md\:bg-bottom { background-position: bottom !important; } .md\:bg-center { background-position: center !important; } .md\:bg-left { background-position: left !important; } .md\:bg-left-bottom { background-position: left bottom !important; } .md\:bg-left-top { background-position: left top !important; } .md\:bg-right { background-position: right !important; } .md\:bg-right-bottom { background-position: right bottom !important; } .md\:bg-right-top { background-position: right top !important; } .md\:bg-top { background-position: top !important; } .md\:bg-repeat { background-repeat: repeat !important; } .md\:bg-no-repeat { background-repeat: no-repeat !important; } .md\:bg-repeat-x { background-repeat: repeat-x !important; } .md\:bg-repeat-y { background-repeat: repeat-y !important; } .md\:bg-repeat-round { background-repeat: round !important; } .md\:bg-repeat-space { background-repeat: space !important; } .md\:bg-auto { background-size: auto !important; } .md\:bg-cover { background-size: cover !important; } .md\:bg-contain { background-size: contain !important; } .md\:border-collapse { border-collapse: collapse !important; } .md\:border-separate { border-collapse: separate !important; } .md\:border-opacity-0 { --border-opacity: 0 !important; } .md\:border-opacity-12 { --border-opacity: 0.12 !important; } .md\:border-opacity-25 { --border-opacity: 0.25 !important; } .md\:border-opacity-38 { --border-opacity: 0.38 !important; } .md\:border-opacity-50 { --border-opacity: 0.5 !important; } .md\:border-opacity-54 { --border-opacity: 0.54 !important; } .md\:border-opacity-70 { --border-opacity: 0.70 !important; } .md\:border-opacity-75 { --border-opacity: 0.75 !important; } .md\:border-opacity-84 { --border-opacity: 0.84 !important; } .md\:border-opacity-100 { --border-opacity: 1 !important; } .md\:hover\:border-opacity-0:hover { --border-opacity: 0 !important; } .md\:hover\:border-opacity-12:hover { --border-opacity: 0.12 !important; } .md\:hover\:border-opacity-25:hover { --border-opacity: 0.25 !important; } .md\:hover\:border-opacity-38:hover { --border-opacity: 0.38 !important; } .md\:hover\:border-opacity-50:hover { --border-opacity: 0.5 !important; } .md\:hover\:border-opacity-54:hover { --border-opacity: 0.54 !important; } .md\:hover\:border-opacity-70:hover { --border-opacity: 0.70 !important; } .md\:hover\:border-opacity-75:hover { --border-opacity: 0.75 !important; } .md\:hover\:border-opacity-84:hover { --border-opacity: 0.84 !important; } .md\:hover\:border-opacity-100:hover { --border-opacity: 1 !important; } .md\:focus\:border-opacity-0:focus { --border-opacity: 0 !important; } .md\:focus\:border-opacity-12:focus { --border-opacity: 0.12 !important; } .md\:focus\:border-opacity-25:focus { --border-opacity: 0.25 !important; } .md\:focus\:border-opacity-38:focus { --border-opacity: 0.38 !important; } .md\:focus\:border-opacity-50:focus { --border-opacity: 0.5 !important; } .md\:focus\:border-opacity-54:focus { --border-opacity: 0.54 !important; } .md\:focus\:border-opacity-70:focus { --border-opacity: 0.70 !important; } .md\:focus\:border-opacity-75:focus { --border-opacity: 0.75 !important; } .md\:focus\:border-opacity-84:focus { --border-opacity: 0.84 !important; } .md\:focus\:border-opacity-100:focus { --border-opacity: 1 !important; } .md\:rounded-none { border-radius: 0 !important; } .md\:rounded-sm { border-radius: 0.125rem !important; } .md\:rounded { border-radius: 0.25rem !important; } .md\:rounded-md { border-radius: 0.375rem !important; } .md\:rounded-lg { border-radius: 0.5rem !important; } .md\:rounded-full { border-radius: 9999px !important; } .md\:rounded-t-none { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } .md\:rounded-r-none { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } .md\:rounded-b-none { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } .md\:rounded-l-none { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; } .md\:rounded-t-sm { border-top-left-radius: 0.125rem !important; border-top-right-radius: 0.125rem !important; } .md\:rounded-r-sm { border-top-right-radius: 0.125rem !important; border-bottom-right-radius: 0.125rem !important; } .md\:rounded-b-sm { border-bottom-right-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .md\:rounded-l-sm { border-top-left-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .md\:rounded-t { border-top-left-radius: 0.25rem !important; border-top-right-radius: 0.25rem !important; } .md\:rounded-r { border-top-right-radius: 0.25rem !important; border-bottom-right-radius: 0.25rem !important; } .md\:rounded-b { border-bottom-right-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .md\:rounded-l { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .md\:rounded-t-md { border-top-left-radius: 0.375rem !important; border-top-right-radius: 0.375rem !important; } .md\:rounded-r-md { border-top-right-radius: 0.375rem !important; border-bottom-right-radius: 0.375rem !important; } .md\:rounded-b-md { border-bottom-right-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .md\:rounded-l-md { border-top-left-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .md\:rounded-t-lg { border-top-left-radius: 0.5rem !important; border-top-right-radius: 0.5rem !important; } .md\:rounded-r-lg { border-top-right-radius: 0.5rem !important; border-bottom-right-radius: 0.5rem !important; } .md\:rounded-b-lg { border-bottom-right-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .md\:rounded-l-lg { border-top-left-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .md\:rounded-t-full { border-top-left-radius: 9999px !important; border-top-right-radius: 9999px !important; } .md\:rounded-r-full { border-top-right-radius: 9999px !important; border-bottom-right-radius: 9999px !important; } .md\:rounded-b-full { border-bottom-right-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .md\:rounded-l-full { border-top-left-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .md\:rounded-tl-none { border-top-left-radius: 0 !important; } .md\:rounded-tr-none { border-top-right-radius: 0 !important; } .md\:rounded-br-none { border-bottom-right-radius: 0 !important; } .md\:rounded-bl-none { border-bottom-left-radius: 0 !important; } .md\:rounded-tl-sm { border-top-left-radius: 0.125rem !important; } .md\:rounded-tr-sm { border-top-right-radius: 0.125rem !important; } .md\:rounded-br-sm { border-bottom-right-radius: 0.125rem !important; } .md\:rounded-bl-sm { border-bottom-left-radius: 0.125rem !important; } .md\:rounded-tl { border-top-left-radius: 0.25rem !important; } .md\:rounded-tr { border-top-right-radius: 0.25rem !important; } .md\:rounded-br { border-bottom-right-radius: 0.25rem !important; } .md\:rounded-bl { border-bottom-left-radius: 0.25rem !important; } .md\:rounded-tl-md { border-top-left-radius: 0.375rem !important; } .md\:rounded-tr-md { border-top-right-radius: 0.375rem !important; } .md\:rounded-br-md { border-bottom-right-radius: 0.375rem !important; } .md\:rounded-bl-md { border-bottom-left-radius: 0.375rem !important; } .md\:rounded-tl-lg { border-top-left-radius: 0.5rem !important; } .md\:rounded-tr-lg { border-top-right-radius: 0.5rem !important; } .md\:rounded-br-lg { border-bottom-right-radius: 0.5rem !important; } .md\:rounded-bl-lg { border-bottom-left-radius: 0.5rem !important; } .md\:rounded-tl-full { border-top-left-radius: 9999px !important; } .md\:rounded-tr-full { border-top-right-radius: 9999px !important; } .md\:rounded-br-full { border-bottom-right-radius: 9999px !important; } .md\:rounded-bl-full { border-bottom-left-radius: 9999px !important; } .md\:border-solid { border-style: solid !important; } .md\:border-dashed { border-style: dashed !important; } .md\:border-dotted { border-style: dotted !important; } .md\:border-double { border-style: double !important; } .md\:border-none { border-style: none !important; } .md\:border-0 { border-width: 0 !important; } .md\:border-2 { border-width: 2px !important; } .md\:border-4 { border-width: 4px !important; } .md\:border-8 { border-width: 8px !important; } .md\:border { border-width: 1px !important; } .md\:border-t-0 { border-top-width: 0 !important; } .md\:border-r-0 { border-right-width: 0 !important; } .md\:border-b-0 { border-bottom-width: 0 !important; } .md\:border-l-0 { border-left-width: 0 !important; } .md\:border-t-2 { border-top-width: 2px !important; } .md\:border-r-2 { border-right-width: 2px !important; } .md\:border-b-2 { border-bottom-width: 2px !important; } .md\:border-l-2 { border-left-width: 2px !important; } .md\:border-t-4 { border-top-width: 4px !important; } .md\:border-r-4 { border-right-width: 4px !important; } .md\:border-b-4 { border-bottom-width: 4px !important; } .md\:border-l-4 { border-left-width: 4px !important; } .md\:border-t-8 { border-top-width: 8px !important; } .md\:border-r-8 { border-right-width: 8px !important; } .md\:border-b-8 { border-bottom-width: 8px !important; } .md\:border-l-8 { border-left-width: 8px !important; } .md\:border-t { border-top-width: 1px !important; } .md\:border-r { border-right-width: 1px !important; } .md\:border-b { border-bottom-width: 1px !important; } .md\:border-l { border-left-width: 1px !important; } .md\:first\:border-0:first-child { border-width: 0 !important; } .md\:first\:border-2:first-child { border-width: 2px !important; } .md\:first\:border-4:first-child { border-width: 4px !important; } .md\:first\:border-8:first-child { border-width: 8px !important; } .md\:first\:border:first-child { border-width: 1px !important; } .md\:first\:border-t-0:first-child { border-top-width: 0 !important; } .md\:first\:border-r-0:first-child { border-right-width: 0 !important; } .md\:first\:border-b-0:first-child { border-bottom-width: 0 !important; } .md\:first\:border-l-0:first-child { border-left-width: 0 !important; } .md\:first\:border-t-2:first-child { border-top-width: 2px !important; } .md\:first\:border-r-2:first-child { border-right-width: 2px !important; } .md\:first\:border-b-2:first-child { border-bottom-width: 2px !important; } .md\:first\:border-l-2:first-child { border-left-width: 2px !important; } .md\:first\:border-t-4:first-child { border-top-width: 4px !important; } .md\:first\:border-r-4:first-child { border-right-width: 4px !important; } .md\:first\:border-b-4:first-child { border-bottom-width: 4px !important; } .md\:first\:border-l-4:first-child { border-left-width: 4px !important; } .md\:first\:border-t-8:first-child { border-top-width: 8px !important; } .md\:first\:border-r-8:first-child { border-right-width: 8px !important; } .md\:first\:border-b-8:first-child { border-bottom-width: 8px !important; } .md\:first\:border-l-8:first-child { border-left-width: 8px !important; } .md\:first\:border-t:first-child { border-top-width: 1px !important; } .md\:first\:border-r:first-child { border-right-width: 1px !important; } .md\:first\:border-b:first-child { border-bottom-width: 1px !important; } .md\:first\:border-l:first-child { border-left-width: 1px !important; } .md\:last\:border-0:last-child { border-width: 0 !important; } .md\:last\:border-2:last-child { border-width: 2px !important; } .md\:last\:border-4:last-child { border-width: 4px !important; } .md\:last\:border-8:last-child { border-width: 8px !important; } .md\:last\:border:last-child { border-width: 1px !important; } .md\:last\:border-t-0:last-child { border-top-width: 0 !important; } .md\:last\:border-r-0:last-child { border-right-width: 0 !important; } .md\:last\:border-b-0:last-child { border-bottom-width: 0 !important; } .md\:last\:border-l-0:last-child { border-left-width: 0 !important; } .md\:last\:border-t-2:last-child { border-top-width: 2px !important; } .md\:last\:border-r-2:last-child { border-right-width: 2px !important; } .md\:last\:border-b-2:last-child { border-bottom-width: 2px !important; } .md\:last\:border-l-2:last-child { border-left-width: 2px !important; } .md\:last\:border-t-4:last-child { border-top-width: 4px !important; } .md\:last\:border-r-4:last-child { border-right-width: 4px !important; } .md\:last\:border-b-4:last-child { border-bottom-width: 4px !important; } .md\:last\:border-l-4:last-child { border-left-width: 4px !important; } .md\:last\:border-t-8:last-child { border-top-width: 8px !important; } .md\:last\:border-r-8:last-child { border-right-width: 8px !important; } .md\:last\:border-b-8:last-child { border-bottom-width: 8px !important; } .md\:last\:border-l-8:last-child { border-left-width: 8px !important; } .md\:last\:border-t:last-child { border-top-width: 1px !important; } .md\:last\:border-r:last-child { border-right-width: 1px !important; } .md\:last\:border-b:last-child { border-bottom-width: 1px !important; } .md\:last\:border-l:last-child { border-left-width: 1px !important; } .md\:box-border { box-sizing: border-box !important; } .md\:box-content { box-sizing: content-box !important; } .md\:block { display: block !important; } .md\:inline-block { display: inline-block !important; } .md\:inline { display: inline !important; } .md\:flex { display: flex !important; } .md\:inline-flex { display: inline-flex !important; } .md\:table { display: table !important; } .md\:table-caption { display: table-caption !important; } .md\:table-cell { display: table-cell !important; } .md\:table-column { display: table-column !important; } .md\:table-column-group { display: table-column-group !important; } .md\:table-footer-group { display: table-footer-group !important; } .md\:table-header-group { display: table-header-group !important; } .md\:table-row-group { display: table-row-group !important; } .md\:table-row { display: table-row !important; } .md\:flow-root { display: flow-root !important; } .md\:grid { display: grid !important; } .md\:inline-grid { display: inline-grid !important; } .md\:hidden { display: none !important; } .md\:flex-row { flex-direction: row !important; } .md\:flex-row-reverse { flex-direction: row-reverse !important; } .md\:flex-col { flex-direction: column !important; } .md\:flex-col-reverse { flex-direction: column-reverse !important; } .md\:flex-wrap { flex-wrap: wrap !important; } .md\:flex-wrap-reverse { flex-wrap: wrap-reverse !important; } .md\:flex-no-wrap { flex-wrap: nowrap !important; } .md\:items-start { align-items: flex-start !important; } .md\:items-end { align-items: flex-end !important; } .md\:items-center { align-items: center !important; } .md\:items-baseline { align-items: baseline !important; } .md\:items-stretch { align-items: stretch !important; } .md\:self-auto { align-self: auto !important; } .md\:self-start { align-self: flex-start !important; } .md\:self-end { align-self: flex-end !important; } .md\:self-center { align-self: center !important; } .md\:self-stretch { align-self: stretch !important; } .md\:justify-start { justify-content: flex-start !important; } .md\:justify-end { justify-content: flex-end !important; } .md\:justify-center { justify-content: center !important; } .md\:justify-between { justify-content: space-between !important; } .md\:justify-around { justify-content: space-around !important; } .md\:justify-evenly { justify-content: space-evenly !important; } .md\:content-center { align-content: center !important; } .md\:content-start { align-content: flex-start !important; } .md\:content-end { align-content: flex-end !important; } .md\:content-between { align-content: space-between !important; } .md\:content-around { align-content: space-around !important; } .md\:flex-0 { flex: 0 0 auto !important; } .md\:flex-1 { flex: 1 1 0% !important; } .md\:flex-auto { flex: 1 1 auto !important; } .md\:flex-initial { flex: 0 1 auto !important; } .md\:flex-none { flex: none !important; } .md\:flex-grow-0 { flex-grow: 0 !important; } .md\:flex-grow { flex-grow: 1 !important; } .md\:flex-shrink-0 { flex-shrink: 0 !important; } .md\:flex-shrink { flex-shrink: 1 !important; } .md\:order-1 { order: 1 !important; } .md\:order-2 { order: 2 !important; } .md\:order-3 { order: 3 !important; } .md\:order-4 { order: 4 !important; } .md\:order-5 { order: 5 !important; } .md\:order-6 { order: 6 !important; } .md\:order-7 { order: 7 !important; } .md\:order-8 { order: 8 !important; } .md\:order-9 { order: 9 !important; } .md\:order-10 { order: 10 !important; } .md\:order-11 { order: 11 !important; } .md\:order-12 { order: 12 !important; } .md\:order-first { order: -9999 !important; } .md\:order-last { order: 9999 !important; } .md\:order-none { order: 0 !important; } .md\:font-hairline { font-weight: 100 !important; } .md\:font-thin { font-weight: 200 !important; } .md\:font-light { font-weight: 300 !important; } .md\:font-normal { font-weight: 400 !important; } .md\:font-medium { font-weight: 500 !important; } .md\:font-semibold { font-weight: 600 !important; } .md\:font-bold { font-weight: 700 !important; } .md\:font-extrabold { font-weight: 800 !important; } .md\:font-black { font-weight: 900 !important; } .md\:h-0 { height: 0 !important; } .md\:h-1 { height: 0.25rem !important; } .md\:h-2 { height: 0.5rem !important; } .md\:h-3 { height: 0.75rem !important; } .md\:h-4 { height: 1rem !important; } .md\:h-5 { height: 1.25rem !important; } .md\:h-6 { height: 1.5rem !important; } .md\:h-8 { height: 2rem !important; } .md\:h-10 { height: 2.5rem !important; } .md\:h-12 { height: 3rem !important; } .md\:h-14 { height: 3.5rem !important; } .md\:h-16 { height: 4rem !important; } .md\:h-18 { height: 4.5rem !important; } .md\:h-20 { height: 5rem !important; } .md\:h-22 { height: 5.5rem !important; } .md\:h-24 { height: 6rem !important; } .md\:h-26 { height: 6.5rem !important; } .md\:h-28 { height: 7rem !important; } .md\:h-30 { height: 7.5rem !important; } .md\:h-32 { height: 8rem !important; } .md\:h-36 { height: 9rem !important; } .md\:h-40 { height: 10rem !important; } .md\:h-48 { height: 12rem !important; } .md\:h-50 { height: 12.5rem !important; } .md\:h-56 { height: 14rem !important; } .md\:h-60 { height: 15rem !important; } .md\:h-64 { height: 16rem !important; } .md\:h-80 { height: 20rem !important; } .md\:h-90 { height: 24rem !important; } .md\:h-100 { height: 25rem !important; } .md\:h-120 { height: 30rem !important; } .md\:h-128 { height: 32rem !important; } .md\:h-140 { height: 35rem !important; } .md\:h-160 { height: 40rem !important; } .md\:h-180 { height: 45rem !important; } .md\:h-192 { height: 48rem !important; } .md\:h-200 { height: 50rem !important; } .md\:h-240 { height: 60rem !important; } .md\:h-256 { height: 64rem !important; } .md\:h-280 { height: 70rem !important; } .md\:h-320 { height: 80rem !important; } .md\:h-360 { height: 90rem !important; } .md\:h-400 { height: 100rem !important; } .md\:h-480 { height: 120rem !important; } .md\:h-auto { height: auto !important; } .md\:h-px { height: 1px !important; } .md\:h-2px { height: 2px !important; } .md\:h-full { height: 100% !important; } .md\:h-screen { height: 100vh !important; } .md\:h-1\/2 { height: 50% !important; } .md\:h-1\/3 { height: 33.33333% !important; } .md\:h-2\/3 { height: 66.66667% !important; } .md\:h-1\/4 { height: 25% !important; } .md\:h-2\/4 { height: 50% !important; } .md\:h-3\/4 { height: 75% !important; } .md\:h-1\/5 { height: 20% !important; } .md\:h-2\/5 { height: 40% !important; } .md\:h-3\/5 { height: 60% !important; } .md\:h-4\/5 { height: 80% !important; } .md\:h-1\/12 { height: 8.33333% !important; } .md\:h-2\/12 { height: 16.66667% !important; } .md\:h-3\/12 { height: 25% !important; } .md\:h-4\/12 { height: 33.33333% !important; } .md\:h-5\/12 { height: 41.66667% !important; } .md\:h-6\/12 { height: 50% !important; } .md\:h-7\/12 { height: 58.33333% !important; } .md\:h-8\/12 { height: 66.66667% !important; } .md\:h-9\/12 { height: 75% !important; } .md\:h-10\/12 { height: 83.33333% !important; } .md\:h-11\/12 { height: 91.66667% !important; } .md\:text-xs { font-size: 0.625rem !important; } .md\:text-sm { font-size: 0.75rem !important; } .md\:text-md { font-size: 0.8125rem !important; } .md\:text-base { font-size: 0.875rem !important; } .md\:text-lg { font-size: 1rem !important; } .md\:text-xl { font-size: 1.125rem !important; } .md\:text-2xl { font-size: 1.25rem !important; } .md\:text-3xl { font-size: 1.5rem !important; } .md\:text-4xl { font-size: 2rem !important; } .md\:text-5xl { font-size: 2.25rem !important; } .md\:text-6xl { font-size: 2.5rem !important; } .md\:text-7xl { font-size: 3rem !important; } .md\:text-8xl { font-size: 4rem !important; } .md\:text-9xl { font-size: 6rem !important; } .md\:text-10xl { font-size: 8rem !important; } .md\:leading-3 { line-height: .75rem !important; } .md\:leading-4 { line-height: 1rem !important; } .md\:leading-5 { line-height: 1.25rem !important; } .md\:leading-6 { line-height: 1.5rem !important; } .md\:leading-7 { line-height: 1.75rem !important; } .md\:leading-8 { line-height: 2rem !important; } .md\:leading-9 { line-height: 2.25rem !important; } .md\:leading-10 { line-height: 2.5rem !important; } .md\:leading-none { line-height: 1 !important; } .md\:leading-tight { line-height: 1.25 !important; } .md\:leading-snug { line-height: 1.375 !important; } .md\:leading-normal { line-height: 1.5 !important; } .md\:leading-relaxed { line-height: 1.625 !important; } .md\:leading-loose { line-height: 2 !important; } .md\:list-inside { list-style-position: inside !important; } .md\:list-outside { list-style-position: outside !important; } .md\:list-none { list-style-type: none !important; } .md\:list-disc { list-style-type: disc !important; } .md\:list-decimal { list-style-type: decimal !important; } .md\:m-0 { margin: 0 !important; } .md\:m-1 { margin: 0.25rem !important; } .md\:m-2 { margin: 0.5rem !important; } .md\:m-3 { margin: 0.75rem !important; } .md\:m-4 { margin: 1rem !important; } .md\:m-5 { margin: 1.25rem !important; } .md\:m-6 { margin: 1.5rem !important; } .md\:m-8 { margin: 2rem !important; } .md\:m-10 { margin: 2.5rem !important; } .md\:m-12 { margin: 3rem !important; } .md\:m-14 { margin: 3.5rem !important; } .md\:m-16 { margin: 4rem !important; } .md\:m-18 { margin: 4.5rem !important; } .md\:m-20 { margin: 5rem !important; } .md\:m-22 { margin: 5.5rem !important; } .md\:m-24 { margin: 6rem !important; } .md\:m-26 { margin: 6.5rem !important; } .md\:m-28 { margin: 7rem !important; } .md\:m-30 { margin: 7.5rem !important; } .md\:m-32 { margin: 8rem !important; } .md\:m-36 { margin: 9rem !important; } .md\:m-40 { margin: 10rem !important; } .md\:m-48 { margin: 12rem !important; } .md\:m-56 { margin: 14rem !important; } .md\:m-64 { margin: 16rem !important; } .md\:m-auto { margin: auto !important; } .md\:m-px { margin: 1px !important; } .md\:m-2px { margin: 2px !important; } .md\:-m-1 { margin: -0.25rem !important; } .md\:-m-2 { margin: -0.5rem !important; } .md\:-m-3 { margin: -0.75rem !important; } .md\:-m-4 { margin: -1rem !important; } .md\:-m-5 { margin: -1.25rem !important; } .md\:-m-6 { margin: -1.5rem !important; } .md\:-m-8 { margin: -2rem !important; } .md\:-m-10 { margin: -2.5rem !important; } .md\:-m-12 { margin: -3rem !important; } .md\:-m-14 { margin: -3.5rem !important; } .md\:-m-16 { margin: -4rem !important; } .md\:-m-18 { margin: -4.5rem !important; } .md\:-m-20 { margin: -5rem !important; } .md\:-m-22 { margin: -5.5rem !important; } .md\:-m-24 { margin: -6rem !important; } .md\:-m-26 { margin: -6.5rem !important; } .md\:-m-28 { margin: -7rem !important; } .md\:-m-30 { margin: -7.5rem !important; } .md\:-m-32 { margin: -8rem !important; } .md\:-m-36 { margin: -9rem !important; } .md\:-m-40 { margin: -10rem !important; } .md\:-m-48 { margin: -12rem !important; } .md\:-m-56 { margin: -14rem !important; } .md\:-m-64 { margin: -16rem !important; } .md\:-m-px { margin: -1px !important; } .md\:-m-2px { margin: -2px !important; } .md\:my-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .md\:mx-0 { margin-left: 0 !important; margin-right: 0 !important; } .md\:my-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .md\:mx-1 { margin-left: 0.25rem !important; margin-right: 0.25rem !important; } .md\:my-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .md\:mx-2 { margin-left: 0.5rem !important; margin-right: 0.5rem !important; } .md\:my-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .md\:mx-3 { margin-left: 0.75rem !important; margin-right: 0.75rem !important; } .md\:my-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .md\:mx-4 { margin-left: 1rem !important; margin-right: 1rem !important; } .md\:my-5 { margin-top: 1.25rem !important; margin-bottom: 1.25rem !important; } .md\:mx-5 { margin-left: 1.25rem !important; margin-right: 1.25rem !important; } .md\:my-6 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .md\:mx-6 { margin-left: 1.5rem !important; margin-right: 1.5rem !important; } .md\:my-8 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .md\:mx-8 { margin-left: 2rem !important; margin-right: 2rem !important; } .md\:my-10 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .md\:mx-10 { margin-left: 2.5rem !important; margin-right: 2.5rem !important; } .md\:my-12 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .md\:mx-12 { margin-left: 3rem !important; margin-right: 3rem !important; } .md\:my-14 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .md\:mx-14 { margin-left: 3.5rem !important; margin-right: 3.5rem !important; } .md\:my-16 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .md\:mx-16 { margin-left: 4rem !important; margin-right: 4rem !important; } .md\:my-18 { margin-top: 4.5rem !important; margin-bottom: 4.5rem !important; } .md\:mx-18 { margin-left: 4.5rem !important; margin-right: 4.5rem !important; } .md\:my-20 { margin-top: 5rem !important; margin-bottom: 5rem !important; } .md\:mx-20 { margin-left: 5rem !important; margin-right: 5rem !important; } .md\:my-22 { margin-top: 5.5rem !important; margin-bottom: 5.5rem !important; } .md\:mx-22 { margin-left: 5.5rem !important; margin-right: 5.5rem !important; } .md\:my-24 { margin-top: 6rem !important; margin-bottom: 6rem !important; } .md\:mx-24 { margin-left: 6rem !important; margin-right: 6rem !important; } .md\:my-26 { margin-top: 6.5rem !important; margin-bottom: 6.5rem !important; } .md\:mx-26 { margin-left: 6.5rem !important; margin-right: 6.5rem !important; } .md\:my-28 { margin-top: 7rem !important; margin-bottom: 7rem !important; } .md\:mx-28 { margin-left: 7rem !important; margin-right: 7rem !important; } .md\:my-30 { margin-top: 7.5rem !important; margin-bottom: 7.5rem !important; } .md\:mx-30 { margin-left: 7.5rem !important; margin-right: 7.5rem !important; } .md\:my-32 { margin-top: 8rem !important; margin-bottom: 8rem !important; } .md\:mx-32 { margin-left: 8rem !important; margin-right: 8rem !important; } .md\:my-36 { margin-top: 9rem !important; margin-bottom: 9rem !important; } .md\:mx-36 { margin-left: 9rem !important; margin-right: 9rem !important; } .md\:my-40 { margin-top: 10rem !important; margin-bottom: 10rem !important; } .md\:mx-40 { margin-left: 10rem !important; margin-right: 10rem !important; } .md\:my-48 { margin-top: 12rem !important; margin-bottom: 12rem !important; } .md\:mx-48 { margin-left: 12rem !important; margin-right: 12rem !important; } .md\:my-56 { margin-top: 14rem !important; margin-bottom: 14rem !important; } .md\:mx-56 { margin-left: 14rem !important; margin-right: 14rem !important; } .md\:my-64 { margin-top: 16rem !important; margin-bottom: 16rem !important; } .md\:mx-64 { margin-left: 16rem !important; margin-right: 16rem !important; } .md\:my-auto { margin-top: auto !important; margin-bottom: auto !important; } .md\:mx-auto { margin-left: auto !important; margin-right: auto !important; } .md\:my-px { margin-top: 1px !important; margin-bottom: 1px !important; } .md\:mx-px { margin-left: 1px !important; margin-right: 1px !important; } .md\:my-2px { margin-top: 2px !important; margin-bottom: 2px !important; } .md\:mx-2px { margin-left: 2px !important; margin-right: 2px !important; } .md\:-my-1 { margin-top: -0.25rem !important; margin-bottom: -0.25rem !important; } .md\:-mx-1 { margin-left: -0.25rem !important; margin-right: -0.25rem !important; } .md\:-my-2 { margin-top: -0.5rem !important; margin-bottom: -0.5rem !important; } .md\:-mx-2 { margin-left: -0.5rem !important; margin-right: -0.5rem !important; } .md\:-my-3 { margin-top: -0.75rem !important; margin-bottom: -0.75rem !important; } .md\:-mx-3 { margin-left: -0.75rem !important; margin-right: -0.75rem !important; } .md\:-my-4 { margin-top: -1rem !important; margin-bottom: -1rem !important; } .md\:-mx-4 { margin-left: -1rem !important; margin-right: -1rem !important; } .md\:-my-5 { margin-top: -1.25rem !important; margin-bottom: -1.25rem !important; } .md\:-mx-5 { margin-left: -1.25rem !important; margin-right: -1.25rem !important; } .md\:-my-6 { margin-top: -1.5rem !important; margin-bottom: -1.5rem !important; } .md\:-mx-6 { margin-left: -1.5rem !important; margin-right: -1.5rem !important; } .md\:-my-8 { margin-top: -2rem !important; margin-bottom: -2rem !important; } .md\:-mx-8 { margin-left: -2rem !important; margin-right: -2rem !important; } .md\:-my-10 { margin-top: -2.5rem !important; margin-bottom: -2.5rem !important; } .md\:-mx-10 { margin-left: -2.5rem !important; margin-right: -2.5rem !important; } .md\:-my-12 { margin-top: -3rem !important; margin-bottom: -3rem !important; } .md\:-mx-12 { margin-left: -3rem !important; margin-right: -3rem !important; } .md\:-my-14 { margin-top: -3.5rem !important; margin-bottom: -3.5rem !important; } .md\:-mx-14 { margin-left: -3.5rem !important; margin-right: -3.5rem !important; } .md\:-my-16 { margin-top: -4rem !important; margin-bottom: -4rem !important; } .md\:-mx-16 { margin-left: -4rem !important; margin-right: -4rem !important; } .md\:-my-18 { margin-top: -4.5rem !important; margin-bottom: -4.5rem !important; } .md\:-mx-18 { margin-left: -4.5rem !important; margin-right: -4.5rem !important; } .md\:-my-20 { margin-top: -5rem !important; margin-bottom: -5rem !important; } .md\:-mx-20 { margin-left: -5rem !important; margin-right: -5rem !important; } .md\:-my-22 { margin-top: -5.5rem !important; margin-bottom: -5.5rem !important; } .md\:-mx-22 { margin-left: -5.5rem !important; margin-right: -5.5rem !important; } .md\:-my-24 { margin-top: -6rem !important; margin-bottom: -6rem !important; } .md\:-mx-24 { margin-left: -6rem !important; margin-right: -6rem !important; } .md\:-my-26 { margin-top: -6.5rem !important; margin-bottom: -6.5rem !important; } .md\:-mx-26 { margin-left: -6.5rem !important; margin-right: -6.5rem !important; } .md\:-my-28 { margin-top: -7rem !important; margin-bottom: -7rem !important; } .md\:-mx-28 { margin-left: -7rem !important; margin-right: -7rem !important; } .md\:-my-30 { margin-top: -7.5rem !important; margin-bottom: -7.5rem !important; } .md\:-mx-30 { margin-left: -7.5rem !important; margin-right: -7.5rem !important; } .md\:-my-32 { margin-top: -8rem !important; margin-bottom: -8rem !important; } .md\:-mx-32 { margin-left: -8rem !important; margin-right: -8rem !important; } .md\:-my-36 { margin-top: -9rem !important; margin-bottom: -9rem !important; } .md\:-mx-36 { margin-left: -9rem !important; margin-right: -9rem !important; } .md\:-my-40 { margin-top: -10rem !important; margin-bottom: -10rem !important; } .md\:-mx-40 { margin-left: -10rem !important; margin-right: -10rem !important; } .md\:-my-48 { margin-top: -12rem !important; margin-bottom: -12rem !important; } .md\:-mx-48 { margin-left: -12rem !important; margin-right: -12rem !important; } .md\:-my-56 { margin-top: -14rem !important; margin-bottom: -14rem !important; } .md\:-mx-56 { margin-left: -14rem !important; margin-right: -14rem !important; } .md\:-my-64 { margin-top: -16rem !important; margin-bottom: -16rem !important; } .md\:-mx-64 { margin-left: -16rem !important; margin-right: -16rem !important; } .md\:-my-px { margin-top: -1px !important; margin-bottom: -1px !important; } .md\:-mx-px { margin-left: -1px !important; margin-right: -1px !important; } .md\:-my-2px { margin-top: -2px !important; margin-bottom: -2px !important; } .md\:-mx-2px { margin-left: -2px !important; margin-right: -2px !important; } .md\:mt-0 { margin-top: 0 !important; } .md\:mr-0 { margin-right: 0 !important; } .md\:mb-0 { margin-bottom: 0 !important; } .md\:ml-0 { margin-left: 0 !important; } .md\:mt-1 { margin-top: 0.25rem !important; } .md\:mr-1 { margin-right: 0.25rem !important; } .md\:mb-1 { margin-bottom: 0.25rem !important; } .md\:ml-1 { margin-left: 0.25rem !important; } .md\:mt-2 { margin-top: 0.5rem !important; } .md\:mr-2 { margin-right: 0.5rem !important; } .md\:mb-2 { margin-bottom: 0.5rem !important; } .md\:ml-2 { margin-left: 0.5rem !important; } .md\:mt-3 { margin-top: 0.75rem !important; } .md\:mr-3 { margin-right: 0.75rem !important; } .md\:mb-3 { margin-bottom: 0.75rem !important; } .md\:ml-3 { margin-left: 0.75rem !important; } .md\:mt-4 { margin-top: 1rem !important; } .md\:mr-4 { margin-right: 1rem !important; } .md\:mb-4 { margin-bottom: 1rem !important; } .md\:ml-4 { margin-left: 1rem !important; } .md\:mt-5 { margin-top: 1.25rem !important; } .md\:mr-5 { margin-right: 1.25rem !important; } .md\:mb-5 { margin-bottom: 1.25rem !important; } .md\:ml-5 { margin-left: 1.25rem !important; } .md\:mt-6 { margin-top: 1.5rem !important; } .md\:mr-6 { margin-right: 1.5rem !important; } .md\:mb-6 { margin-bottom: 1.5rem !important; } .md\:ml-6 { margin-left: 1.5rem !important; } .md\:mt-8 { margin-top: 2rem !important; } .md\:mr-8 { margin-right: 2rem !important; } .md\:mb-8 { margin-bottom: 2rem !important; } .md\:ml-8 { margin-left: 2rem !important; } .md\:mt-10 { margin-top: 2.5rem !important; } .md\:mr-10 { margin-right: 2.5rem !important; } .md\:mb-10 { margin-bottom: 2.5rem !important; } .md\:ml-10 { margin-left: 2.5rem !important; } .md\:mt-12 { margin-top: 3rem !important; } .md\:mr-12 { margin-right: 3rem !important; } .md\:mb-12 { margin-bottom: 3rem !important; } .md\:ml-12 { margin-left: 3rem !important; } .md\:mt-14 { margin-top: 3.5rem !important; } .md\:mr-14 { margin-right: 3.5rem !important; } .md\:mb-14 { margin-bottom: 3.5rem !important; } .md\:ml-14 { margin-left: 3.5rem !important; } .md\:mt-16 { margin-top: 4rem !important; } .md\:mr-16 { margin-right: 4rem !important; } .md\:mb-16 { margin-bottom: 4rem !important; } .md\:ml-16 { margin-left: 4rem !important; } .md\:mt-18 { margin-top: 4.5rem !important; } .md\:mr-18 { margin-right: 4.5rem !important; } .md\:mb-18 { margin-bottom: 4.5rem !important; } .md\:ml-18 { margin-left: 4.5rem !important; } .md\:mt-20 { margin-top: 5rem !important; } .md\:mr-20 { margin-right: 5rem !important; } .md\:mb-20 { margin-bottom: 5rem !important; } .md\:ml-20 { margin-left: 5rem !important; } .md\:mt-22 { margin-top: 5.5rem !important; } .md\:mr-22 { margin-right: 5.5rem !important; } .md\:mb-22 { margin-bottom: 5.5rem !important; } .md\:ml-22 { margin-left: 5.5rem !important; } .md\:mt-24 { margin-top: 6rem !important; } .md\:mr-24 { margin-right: 6rem !important; } .md\:mb-24 { margin-bottom: 6rem !important; } .md\:ml-24 { margin-left: 6rem !important; } .md\:mt-26 { margin-top: 6.5rem !important; } .md\:mr-26 { margin-right: 6.5rem !important; } .md\:mb-26 { margin-bottom: 6.5rem !important; } .md\:ml-26 { margin-left: 6.5rem !important; } .md\:mt-28 { margin-top: 7rem !important; } .md\:mr-28 { margin-right: 7rem !important; } .md\:mb-28 { margin-bottom: 7rem !important; } .md\:ml-28 { margin-left: 7rem !important; } .md\:mt-30 { margin-top: 7.5rem !important; } .md\:mr-30 { margin-right: 7.5rem !important; } .md\:mb-30 { margin-bottom: 7.5rem !important; } .md\:ml-30 { margin-left: 7.5rem !important; } .md\:mt-32 { margin-top: 8rem !important; } .md\:mr-32 { margin-right: 8rem !important; } .md\:mb-32 { margin-bottom: 8rem !important; } .md\:ml-32 { margin-left: 8rem !important; } .md\:mt-36 { margin-top: 9rem !important; } .md\:mr-36 { margin-right: 9rem !important; } .md\:mb-36 { margin-bottom: 9rem !important; } .md\:ml-36 { margin-left: 9rem !important; } .md\:mt-40 { margin-top: 10rem !important; } .md\:mr-40 { margin-right: 10rem !important; } .md\:mb-40 { margin-bottom: 10rem !important; } .md\:ml-40 { margin-left: 10rem !important; } .md\:mt-48 { margin-top: 12rem !important; } .md\:mr-48 { margin-right: 12rem !important; } .md\:mb-48 { margin-bottom: 12rem !important; } .md\:ml-48 { margin-left: 12rem !important; } .md\:mt-56 { margin-top: 14rem !important; } .md\:mr-56 { margin-right: 14rem !important; } .md\:mb-56 { margin-bottom: 14rem !important; } .md\:ml-56 { margin-left: 14rem !important; } .md\:mt-64 { margin-top: 16rem !important; } .md\:mr-64 { margin-right: 16rem !important; } .md\:mb-64 { margin-bottom: 16rem !important; } .md\:ml-64 { margin-left: 16rem !important; } .md\:mt-auto { margin-top: auto !important; } .md\:mr-auto { margin-right: auto !important; } .md\:mb-auto { margin-bottom: auto !important; } .md\:ml-auto { margin-left: auto !important; } .md\:mt-px { margin-top: 1px !important; } .md\:mr-px { margin-right: 1px !important; } .md\:mb-px { margin-bottom: 1px !important; } .md\:ml-px { margin-left: 1px !important; } .md\:mt-2px { margin-top: 2px !important; } .md\:mr-2px { margin-right: 2px !important; } .md\:mb-2px { margin-bottom: 2px !important; } .md\:ml-2px { margin-left: 2px !important; } .md\:-mt-1 { margin-top: -0.25rem !important; } .md\:-mr-1 { margin-right: -0.25rem !important; } .md\:-mb-1 { margin-bottom: -0.25rem !important; } .md\:-ml-1 { margin-left: -0.25rem !important; } .md\:-mt-2 { margin-top: -0.5rem !important; } .md\:-mr-2 { margin-right: -0.5rem !important; } .md\:-mb-2 { margin-bottom: -0.5rem !important; } .md\:-ml-2 { margin-left: -0.5rem !important; } .md\:-mt-3 { margin-top: -0.75rem !important; } .md\:-mr-3 { margin-right: -0.75rem !important; } .md\:-mb-3 { margin-bottom: -0.75rem !important; } .md\:-ml-3 { margin-left: -0.75rem !important; } .md\:-mt-4 { margin-top: -1rem !important; } .md\:-mr-4 { margin-right: -1rem !important; } .md\:-mb-4 { margin-bottom: -1rem !important; } .md\:-ml-4 { margin-left: -1rem !important; } .md\:-mt-5 { margin-top: -1.25rem !important; } .md\:-mr-5 { margin-right: -1.25rem !important; } .md\:-mb-5 { margin-bottom: -1.25rem !important; } .md\:-ml-5 { margin-left: -1.25rem !important; } .md\:-mt-6 { margin-top: -1.5rem !important; } .md\:-mr-6 { margin-right: -1.5rem !important; } .md\:-mb-6 { margin-bottom: -1.5rem !important; } .md\:-ml-6 { margin-left: -1.5rem !important; } .md\:-mt-8 { margin-top: -2rem !important; } .md\:-mr-8 { margin-right: -2rem !important; } .md\:-mb-8 { margin-bottom: -2rem !important; } .md\:-ml-8 { margin-left: -2rem !important; } .md\:-mt-10 { margin-top: -2.5rem !important; } .md\:-mr-10 { margin-right: -2.5rem !important; } .md\:-mb-10 { margin-bottom: -2.5rem !important; } .md\:-ml-10 { margin-left: -2.5rem !important; } .md\:-mt-12 { margin-top: -3rem !important; } .md\:-mr-12 { margin-right: -3rem !important; } .md\:-mb-12 { margin-bottom: -3rem !important; } .md\:-ml-12 { margin-left: -3rem !important; } .md\:-mt-14 { margin-top: -3.5rem !important; } .md\:-mr-14 { margin-right: -3.5rem !important; } .md\:-mb-14 { margin-bottom: -3.5rem !important; } .md\:-ml-14 { margin-left: -3.5rem !important; } .md\:-mt-16 { margin-top: -4rem !important; } .md\:-mr-16 { margin-right: -4rem !important; } .md\:-mb-16 { margin-bottom: -4rem !important; } .md\:-ml-16 { margin-left: -4rem !important; } .md\:-mt-18 { margin-top: -4.5rem !important; } .md\:-mr-18 { margin-right: -4.5rem !important; } .md\:-mb-18 { margin-bottom: -4.5rem !important; } .md\:-ml-18 { margin-left: -4.5rem !important; } .md\:-mt-20 { margin-top: -5rem !important; } .md\:-mr-20 { margin-right: -5rem !important; } .md\:-mb-20 { margin-bottom: -5rem !important; } .md\:-ml-20 { margin-left: -5rem !important; } .md\:-mt-22 { margin-top: -5.5rem !important; } .md\:-mr-22 { margin-right: -5.5rem !important; } .md\:-mb-22 { margin-bottom: -5.5rem !important; } .md\:-ml-22 { margin-left: -5.5rem !important; } .md\:-mt-24 { margin-top: -6rem !important; } .md\:-mr-24 { margin-right: -6rem !important; } .md\:-mb-24 { margin-bottom: -6rem !important; } .md\:-ml-24 { margin-left: -6rem !important; } .md\:-mt-26 { margin-top: -6.5rem !important; } .md\:-mr-26 { margin-right: -6.5rem !important; } .md\:-mb-26 { margin-bottom: -6.5rem !important; } .md\:-ml-26 { margin-left: -6.5rem !important; } .md\:-mt-28 { margin-top: -7rem !important; } .md\:-mr-28 { margin-right: -7rem !important; } .md\:-mb-28 { margin-bottom: -7rem !important; } .md\:-ml-28 { margin-left: -7rem !important; } .md\:-mt-30 { margin-top: -7.5rem !important; } .md\:-mr-30 { margin-right: -7.5rem !important; } .md\:-mb-30 { margin-bottom: -7.5rem !important; } .md\:-ml-30 { margin-left: -7.5rem !important; } .md\:-mt-32 { margin-top: -8rem !important; } .md\:-mr-32 { margin-right: -8rem !important; } .md\:-mb-32 { margin-bottom: -8rem !important; } .md\:-ml-32 { margin-left: -8rem !important; } .md\:-mt-36 { margin-top: -9rem !important; } .md\:-mr-36 { margin-right: -9rem !important; } .md\:-mb-36 { margin-bottom: -9rem !important; } .md\:-ml-36 { margin-left: -9rem !important; } .md\:-mt-40 { margin-top: -10rem !important; } .md\:-mr-40 { margin-right: -10rem !important; } .md\:-mb-40 { margin-bottom: -10rem !important; } .md\:-ml-40 { margin-left: -10rem !important; } .md\:-mt-48 { margin-top: -12rem !important; } .md\:-mr-48 { margin-right: -12rem !important; } .md\:-mb-48 { margin-bottom: -12rem !important; } .md\:-ml-48 { margin-left: -12rem !important; } .md\:-mt-56 { margin-top: -14rem !important; } .md\:-mr-56 { margin-right: -14rem !important; } .md\:-mb-56 { margin-bottom: -14rem !important; } .md\:-ml-56 { margin-left: -14rem !important; } .md\:-mt-64 { margin-top: -16rem !important; } .md\:-mr-64 { margin-right: -16rem !important; } .md\:-mb-64 { margin-bottom: -16rem !important; } .md\:-ml-64 { margin-left: -16rem !important; } .md\:-mt-px { margin-top: -1px !important; } .md\:-mr-px { margin-right: -1px !important; } .md\:-mb-px { margin-bottom: -1px !important; } .md\:-ml-px { margin-left: -1px !important; } .md\:-mt-2px { margin-top: -2px !important; } .md\:-mr-2px { margin-right: -2px !important; } .md\:-mb-2px { margin-bottom: -2px !important; } .md\:-ml-2px { margin-left: -2px !important; } .md\:max-h-0 { max-height: 0 !important; } .md\:max-h-1 { max-height: 0.25rem !important; } .md\:max-h-2 { max-height: 0.5rem !important; } .md\:max-h-3 { max-height: 0.75rem !important; } .md\:max-h-4 { max-height: 1rem !important; } .md\:max-h-5 { max-height: 1.25rem !important; } .md\:max-h-6 { max-height: 1.5rem !important; } .md\:max-h-8 { max-height: 2rem !important; } .md\:max-h-10 { max-height: 2.5rem !important; } .md\:max-h-12 { max-height: 3rem !important; } .md\:max-h-14 { max-height: 3.5rem !important; } .md\:max-h-16 { max-height: 4rem !important; } .md\:max-h-18 { max-height: 4.5rem !important; } .md\:max-h-20 { max-height: 5rem !important; } .md\:max-h-22 { max-height: 5.5rem !important; } .md\:max-h-24 { max-height: 6rem !important; } .md\:max-h-26 { max-height: 6.5rem !important; } .md\:max-h-28 { max-height: 7rem !important; } .md\:max-h-30 { max-height: 7.5rem !important; } .md\:max-h-32 { max-height: 8rem !important; } .md\:max-h-36 { max-height: 9rem !important; } .md\:max-h-40 { max-height: 10rem !important; } .md\:max-h-48 { max-height: 12rem !important; } .md\:max-h-50 { max-height: 12.5rem !important; } .md\:max-h-56 { max-height: 14rem !important; } .md\:max-h-60 { max-height: 15rem !important; } .md\:max-h-64 { max-height: 16rem !important; } .md\:max-h-80 { max-height: 20rem !important; } .md\:max-h-90 { max-height: 24rem !important; } .md\:max-h-100 { max-height: 25rem !important; } .md\:max-h-120 { max-height: 30rem !important; } .md\:max-h-128 { max-height: 32rem !important; } .md\:max-h-140 { max-height: 35rem !important; } .md\:max-h-160 { max-height: 40rem !important; } .md\:max-h-180 { max-height: 45rem !important; } .md\:max-h-192 { max-height: 48rem !important; } .md\:max-h-200 { max-height: 50rem !important; } .md\:max-h-240 { max-height: 60rem !important; } .md\:max-h-256 { max-height: 64rem !important; } .md\:max-h-280 { max-height: 70rem !important; } .md\:max-h-320 { max-height: 80rem !important; } .md\:max-h-360 { max-height: 90rem !important; } .md\:max-h-400 { max-height: 100rem !important; } .md\:max-h-480 { max-height: 120rem !important; } .md\:max-h-full { max-height: 100% !important; } .md\:max-h-screen { max-height: 100vh !important; } .md\:max-h-none { max-height: none !important; } .md\:max-h-px { max-height: 1px !important; } .md\:max-h-2px { max-height: 2px !important; } .md\:max-h-1\/2 { max-height: 50% !important; } .md\:max-h-1\/3 { max-height: 33.33333% !important; } .md\:max-h-2\/3 { max-height: 66.66667% !important; } .md\:max-h-1\/4 { max-height: 25% !important; } .md\:max-h-2\/4 { max-height: 50% !important; } .md\:max-h-3\/4 { max-height: 75% !important; } .md\:max-h-1\/5 { max-height: 20% !important; } .md\:max-h-2\/5 { max-height: 40% !important; } .md\:max-h-3\/5 { max-height: 60% !important; } .md\:max-h-4\/5 { max-height: 80% !important; } .md\:max-h-1\/12 { max-height: 8.33333% !important; } .md\:max-h-2\/12 { max-height: 16.66667% !important; } .md\:max-h-3\/12 { max-height: 25% !important; } .md\:max-h-4\/12 { max-height: 33.33333% !important; } .md\:max-h-5\/12 { max-height: 41.66667% !important; } .md\:max-h-6\/12 { max-height: 50% !important; } .md\:max-h-7\/12 { max-height: 58.33333% !important; } .md\:max-h-8\/12 { max-height: 66.66667% !important; } .md\:max-h-9\/12 { max-height: 75% !important; } .md\:max-h-10\/12 { max-height: 83.33333% !important; } .md\:max-h-11\/12 { max-height: 91.66667% !important; } .md\:max-w-0 { max-width: 0 !important; } .md\:max-w-1 { max-width: 0.25rem !important; } .md\:max-w-2 { max-width: 0.5rem !important; } .md\:max-w-3 { max-width: 0.75rem !important; } .md\:max-w-4 { max-width: 1rem !important; } .md\:max-w-5 { max-width: 1.25rem !important; } .md\:max-w-6 { max-width: 1.5rem !important; } .md\:max-w-8 { max-width: 2rem !important; } .md\:max-w-10 { max-width: 2.5rem !important; } .md\:max-w-12 { max-width: 3rem !important; } .md\:max-w-14 { max-width: 3.5rem !important; } .md\:max-w-16 { max-width: 4rem !important; } .md\:max-w-18 { max-width: 4.5rem !important; } .md\:max-w-20 { max-width: 5rem !important; } .md\:max-w-22 { max-width: 5.5rem !important; } .md\:max-w-24 { max-width: 6rem !important; } .md\:max-w-26 { max-width: 6.5rem !important; } .md\:max-w-28 { max-width: 7rem !important; } .md\:max-w-30 { max-width: 7.5rem !important; } .md\:max-w-32 { max-width: 8rem !important; } .md\:max-w-36 { max-width: 9rem !important; } .md\:max-w-40 { max-width: 10rem !important; } .md\:max-w-48 { max-width: 12rem !important; } .md\:max-w-50 { max-width: 12.5rem !important; } .md\:max-w-56 { max-width: 14rem !important; } .md\:max-w-60 { max-width: 15rem !important; } .md\:max-w-64 { max-width: 16rem !important; } .md\:max-w-80 { max-width: 20rem !important; } .md\:max-w-90 { max-width: 24rem !important; } .md\:max-w-100 { max-width: 25rem !important; } .md\:max-w-120 { max-width: 30rem !important; } .md\:max-w-128 { max-width: 32rem !important; } .md\:max-w-140 { max-width: 35rem !important; } .md\:max-w-160 { max-width: 40rem !important; } .md\:max-w-180 { max-width: 45rem !important; } .md\:max-w-192 { max-width: 48rem !important; } .md\:max-w-200 { max-width: 50rem !important; } .md\:max-w-240 { max-width: 60rem !important; } .md\:max-w-256 { max-width: 64rem !important; } .md\:max-w-280 { max-width: 70rem !important; } .md\:max-w-320 { max-width: 80rem !important; } .md\:max-w-360 { max-width: 90rem !important; } .md\:max-w-400 { max-width: 100rem !important; } .md\:max-w-480 { max-width: 120rem !important; } .md\:max-w-none { max-width: none !important; } .md\:max-w-xs { max-width: 20rem !important; } .md\:max-w-sm { max-width: 24rem !important; } .md\:max-w-md { max-width: 28rem !important; } .md\:max-w-lg { max-width: 32rem !important; } .md\:max-w-xl { max-width: 36rem !important; } .md\:max-w-2xl { max-width: 42rem !important; } .md\:max-w-3xl { max-width: 48rem !important; } .md\:max-w-4xl { max-width: 56rem !important; } .md\:max-w-5xl { max-width: 64rem !important; } .md\:max-w-6xl { max-width: 72rem !important; } .md\:max-w-full { max-width: 100% !important; } .md\:max-w-screen { max-width: 100vw !important; } .md\:max-w-px { max-width: 1px !important; } .md\:max-w-2px { max-width: 2px !important; } .md\:max-w-1\/2 { max-width: 50% !important; } .md\:max-w-1\/3 { max-width: 33.33333% !important; } .md\:max-w-2\/3 { max-width: 66.66667% !important; } .md\:max-w-1\/4 { max-width: 25% !important; } .md\:max-w-2\/4 { max-width: 50% !important; } .md\:max-w-3\/4 { max-width: 75% !important; } .md\:max-w-1\/5 { max-width: 20% !important; } .md\:max-w-2\/5 { max-width: 40% !important; } .md\:max-w-3\/5 { max-width: 60% !important; } .md\:max-w-4\/5 { max-width: 80% !important; } .md\:max-w-1\/12 { max-width: 8.33333% !important; } .md\:max-w-2\/12 { max-width: 16.66667% !important; } .md\:max-w-3\/12 { max-width: 25% !important; } .md\:max-w-4\/12 { max-width: 33.33333% !important; } .md\:max-w-5\/12 { max-width: 41.66667% !important; } .md\:max-w-6\/12 { max-width: 50% !important; } .md\:max-w-7\/12 { max-width: 58.33333% !important; } .md\:max-w-8\/12 { max-width: 66.66667% !important; } .md\:max-w-9\/12 { max-width: 75% !important; } .md\:max-w-10\/12 { max-width: 83.33333% !important; } .md\:max-w-11\/12 { max-width: 91.66667% !important; } .md\:min-h-0 { min-height: 0 !important; } .md\:min-h-1 { min-height: 0.25rem !important; } .md\:min-h-2 { min-height: 0.5rem !important; } .md\:min-h-3 { min-height: 0.75rem !important; } .md\:min-h-4 { min-height: 1rem !important; } .md\:min-h-5 { min-height: 1.25rem !important; } .md\:min-h-6 { min-height: 1.5rem !important; } .md\:min-h-8 { min-height: 2rem !important; } .md\:min-h-10 { min-height: 2.5rem !important; } .md\:min-h-12 { min-height: 3rem !important; } .md\:min-h-14 { min-height: 3.5rem !important; } .md\:min-h-16 { min-height: 4rem !important; } .md\:min-h-18 { min-height: 4.5rem !important; } .md\:min-h-20 { min-height: 5rem !important; } .md\:min-h-22 { min-height: 5.5rem !important; } .md\:min-h-24 { min-height: 6rem !important; } .md\:min-h-26 { min-height: 6.5rem !important; } .md\:min-h-28 { min-height: 7rem !important; } .md\:min-h-30 { min-height: 7.5rem !important; } .md\:min-h-32 { min-height: 8rem !important; } .md\:min-h-36 { min-height: 9rem !important; } .md\:min-h-40 { min-height: 10rem !important; } .md\:min-h-48 { min-height: 12rem !important; } .md\:min-h-50 { min-height: 12.5rem !important; } .md\:min-h-56 { min-height: 14rem !important; } .md\:min-h-60 { min-height: 15rem !important; } .md\:min-h-64 { min-height: 16rem !important; } .md\:min-h-80 { min-height: 20rem !important; } .md\:min-h-90 { min-height: 24rem !important; } .md\:min-h-100 { min-height: 25rem !important; } .md\:min-h-120 { min-height: 30rem !important; } .md\:min-h-128 { min-height: 32rem !important; } .md\:min-h-140 { min-height: 35rem !important; } .md\:min-h-160 { min-height: 40rem !important; } .md\:min-h-180 { min-height: 45rem !important; } .md\:min-h-192 { min-height: 48rem !important; } .md\:min-h-200 { min-height: 50rem !important; } .md\:min-h-240 { min-height: 60rem !important; } .md\:min-h-256 { min-height: 64rem !important; } .md\:min-h-280 { min-height: 70rem !important; } .md\:min-h-320 { min-height: 80rem !important; } .md\:min-h-360 { min-height: 90rem !important; } .md\:min-h-400 { min-height: 100rem !important; } .md\:min-h-480 { min-height: 120rem !important; } .md\:min-h-full { min-height: 100% !important; } .md\:min-h-screen { min-height: 100vh !important; } .md\:min-h-px { min-height: 1px !important; } .md\:min-h-2px { min-height: 2px !important; } .md\:min-h-1\/2 { min-height: 50% !important; } .md\:min-h-1\/3 { min-height: 33.33333% !important; } .md\:min-h-2\/3 { min-height: 66.66667% !important; } .md\:min-h-1\/4 { min-height: 25% !important; } .md\:min-h-2\/4 { min-height: 50% !important; } .md\:min-h-3\/4 { min-height: 75% !important; } .md\:min-h-1\/5 { min-height: 20% !important; } .md\:min-h-2\/5 { min-height: 40% !important; } .md\:min-h-3\/5 { min-height: 60% !important; } .md\:min-h-4\/5 { min-height: 80% !important; } .md\:min-h-1\/12 { min-height: 8.33333% !important; } .md\:min-h-2\/12 { min-height: 16.66667% !important; } .md\:min-h-3\/12 { min-height: 25% !important; } .md\:min-h-4\/12 { min-height: 33.33333% !important; } .md\:min-h-5\/12 { min-height: 41.66667% !important; } .md\:min-h-6\/12 { min-height: 50% !important; } .md\:min-h-7\/12 { min-height: 58.33333% !important; } .md\:min-h-8\/12 { min-height: 66.66667% !important; } .md\:min-h-9\/12 { min-height: 75% !important; } .md\:min-h-10\/12 { min-height: 83.33333% !important; } .md\:min-h-11\/12 { min-height: 91.66667% !important; } .md\:min-w-0 { min-width: 0 !important; } .md\:min-w-1 { min-width: 0.25rem !important; } .md\:min-w-2 { min-width: 0.5rem !important; } .md\:min-w-3 { min-width: 0.75rem !important; } .md\:min-w-4 { min-width: 1rem !important; } .md\:min-w-5 { min-width: 1.25rem !important; } .md\:min-w-6 { min-width: 1.5rem !important; } .md\:min-w-8 { min-width: 2rem !important; } .md\:min-w-10 { min-width: 2.5rem !important; } .md\:min-w-12 { min-width: 3rem !important; } .md\:min-w-14 { min-width: 3.5rem !important; } .md\:min-w-16 { min-width: 4rem !important; } .md\:min-w-18 { min-width: 4.5rem !important; } .md\:min-w-20 { min-width: 5rem !important; } .md\:min-w-22 { min-width: 5.5rem !important; } .md\:min-w-24 { min-width: 6rem !important; } .md\:min-w-26 { min-width: 6.5rem !important; } .md\:min-w-28 { min-width: 7rem !important; } .md\:min-w-30 { min-width: 7.5rem !important; } .md\:min-w-32 { min-width: 8rem !important; } .md\:min-w-36 { min-width: 9rem !important; } .md\:min-w-40 { min-width: 10rem !important; } .md\:min-w-48 { min-width: 12rem !important; } .md\:min-w-50 { min-width: 12.5rem !important; } .md\:min-w-56 { min-width: 14rem !important; } .md\:min-w-60 { min-width: 15rem !important; } .md\:min-w-64 { min-width: 16rem !important; } .md\:min-w-80 { min-width: 20rem !important; } .md\:min-w-90 { min-width: 24rem !important; } .md\:min-w-100 { min-width: 25rem !important; } .md\:min-w-120 { min-width: 30rem !important; } .md\:min-w-128 { min-width: 32rem !important; } .md\:min-w-140 { min-width: 35rem !important; } .md\:min-w-160 { min-width: 40rem !important; } .md\:min-w-180 { min-width: 45rem !important; } .md\:min-w-192 { min-width: 48rem !important; } .md\:min-w-200 { min-width: 50rem !important; } .md\:min-w-240 { min-width: 60rem !important; } .md\:min-w-256 { min-width: 64rem !important; } .md\:min-w-280 { min-width: 70rem !important; } .md\:min-w-320 { min-width: 80rem !important; } .md\:min-w-360 { min-width: 90rem !important; } .md\:min-w-400 { min-width: 100rem !important; } .md\:min-w-480 { min-width: 120rem !important; } .md\:min-w-full { min-width: 100% !important; } .md\:min-w-screen { min-width: 100vw !important; } .md\:min-w-px { min-width: 1px !important; } .md\:min-w-2px { min-width: 2px !important; } .md\:min-w-1\/2 { min-width: 50% !important; } .md\:min-w-1\/3 { min-width: 33.33333% !important; } .md\:min-w-2\/3 { min-width: 66.66667% !important; } .md\:min-w-1\/4 { min-width: 25% !important; } .md\:min-w-2\/4 { min-width: 50% !important; } .md\:min-w-3\/4 { min-width: 75% !important; } .md\:min-w-1\/5 { min-width: 20% !important; } .md\:min-w-2\/5 { min-width: 40% !important; } .md\:min-w-3\/5 { min-width: 60% !important; } .md\:min-w-4\/5 { min-width: 80% !important; } .md\:min-w-1\/12 { min-width: 8.33333% !important; } .md\:min-w-2\/12 { min-width: 16.66667% !important; } .md\:min-w-3\/12 { min-width: 25% !important; } .md\:min-w-4\/12 { min-width: 33.33333% !important; } .md\:min-w-5\/12 { min-width: 41.66667% !important; } .md\:min-w-6\/12 { min-width: 50% !important; } .md\:min-w-7\/12 { min-width: 58.33333% !important; } .md\:min-w-8\/12 { min-width: 66.66667% !important; } .md\:min-w-9\/12 { min-width: 75% !important; } .md\:min-w-10\/12 { min-width: 83.33333% !important; } .md\:min-w-11\/12 { min-width: 91.66667% !important; } .md\:object-contain { -o-object-fit: contain !important; object-fit: contain !important; } .md\:object-cover { -o-object-fit: cover !important; object-fit: cover !important; } .md\:object-fill { -o-object-fit: fill !important; object-fit: fill !important; } .md\:object-none { -o-object-fit: none !important; object-fit: none !important; } .md\:object-scale-down { -o-object-fit: scale-down !important; object-fit: scale-down !important; } .md\:object-bottom { -o-object-position: bottom !important; object-position: bottom !important; } .md\:object-center { -o-object-position: center !important; object-position: center !important; } .md\:object-left { -o-object-position: left !important; object-position: left !important; } .md\:object-left-bottom { -o-object-position: left bottom !important; object-position: left bottom !important; } .md\:object-left-top { -o-object-position: left top !important; object-position: left top !important; } .md\:object-right { -o-object-position: right !important; object-position: right !important; } .md\:object-right-bottom { -o-object-position: right bottom !important; object-position: right bottom !important; } .md\:object-right-top { -o-object-position: right top !important; object-position: right top !important; } .md\:object-top { -o-object-position: top !important; object-position: top !important; } .md\:opacity-0 { opacity: 0 !important; } .md\:opacity-12 { opacity: 0.12 !important; } .md\:opacity-25 { opacity: 0.25 !important; } .md\:opacity-38 { opacity: 0.38 !important; } .md\:opacity-50 { opacity: 0.5 !important; } .md\:opacity-54 { opacity: 0.54 !important; } .md\:opacity-70 { opacity: 0.70 !important; } .md\:opacity-75 { opacity: 0.75 !important; } .md\:opacity-84 { opacity: 0.84 !important; } .md\:opacity-100 { opacity: 1 !important; } .md\:hover\:opacity-0:hover { opacity: 0 !important; } .md\:hover\:opacity-12:hover { opacity: 0.12 !important; } .md\:hover\:opacity-25:hover { opacity: 0.25 !important; } .md\:hover\:opacity-38:hover { opacity: 0.38 !important; } .md\:hover\:opacity-50:hover { opacity: 0.5 !important; } .md\:hover\:opacity-54:hover { opacity: 0.54 !important; } .md\:hover\:opacity-70:hover { opacity: 0.70 !important; } .md\:hover\:opacity-75:hover { opacity: 0.75 !important; } .md\:hover\:opacity-84:hover { opacity: 0.84 !important; } .md\:hover\:opacity-100:hover { opacity: 1 !important; } .md\:focus\:opacity-0:focus { opacity: 0 !important; } .md\:focus\:opacity-12:focus { opacity: 0.12 !important; } .md\:focus\:opacity-25:focus { opacity: 0.25 !important; } .md\:focus\:opacity-38:focus { opacity: 0.38 !important; } .md\:focus\:opacity-50:focus { opacity: 0.5 !important; } .md\:focus\:opacity-54:focus { opacity: 0.54 !important; } .md\:focus\:opacity-70:focus { opacity: 0.70 !important; } .md\:focus\:opacity-75:focus { opacity: 0.75 !important; } .md\:focus\:opacity-84:focus { opacity: 0.84 !important; } .md\:focus\:opacity-100:focus { opacity: 1 !important; } .md\:outline-none { outline: 0 !important; } .md\:focus\:outline-none:focus { outline: 0 !important; } .md\:overflow-auto { overflow: auto !important; } .md\:overflow-hidden { overflow: hidden !important; } .md\:overflow-visible { overflow: visible !important; } .md\:overflow-scroll { overflow: scroll !important; } .md\:overflow-x-auto { overflow-x: auto !important; } .md\:overflow-y-auto { overflow-y: auto !important; } .md\:overflow-x-hidden { overflow-x: hidden !important; } .md\:overflow-y-hidden { overflow-y: hidden !important; } .md\:overflow-x-visible { overflow-x: visible !important; } .md\:overflow-y-visible { overflow-y: visible !important; } .md\:overflow-x-scroll { overflow-x: scroll !important; } .md\:overflow-y-scroll { overflow-y: scroll !important; } .md\:scrolling-touch { -webkit-overflow-scrolling: touch !important; } .md\:scrolling-auto { -webkit-overflow-scrolling: auto !important; } .md\:p-0 { padding: 0 !important; } .md\:p-1 { padding: 0.25rem !important; } .md\:p-2 { padding: 0.5rem !important; } .md\:p-3 { padding: 0.75rem !important; } .md\:p-4 { padding: 1rem !important; } .md\:p-5 { padding: 1.25rem !important; } .md\:p-6 { padding: 1.5rem !important; } .md\:p-8 { padding: 2rem !important; } .md\:p-10 { padding: 2.5rem !important; } .md\:p-12 { padding: 3rem !important; } .md\:p-14 { padding: 3.5rem !important; } .md\:p-16 { padding: 4rem !important; } .md\:p-18 { padding: 4.5rem !important; } .md\:p-20 { padding: 5rem !important; } .md\:p-22 { padding: 5.5rem !important; } .md\:p-24 { padding: 6rem !important; } .md\:p-26 { padding: 6.5rem !important; } .md\:p-28 { padding: 7rem !important; } .md\:p-30 { padding: 7.5rem !important; } .md\:p-32 { padding: 8rem !important; } .md\:p-36 { padding: 9rem !important; } .md\:p-40 { padding: 10rem !important; } .md\:p-48 { padding: 12rem !important; } .md\:p-56 { padding: 14rem !important; } .md\:p-64 { padding: 16rem !important; } .md\:p-px { padding: 1px !important; } .md\:p-2px { padding: 2px !important; } .md\:py-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .md\:px-0 { padding-left: 0 !important; padding-right: 0 !important; } .md\:py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .md\:px-1 { padding-left: 0.25rem !important; padding-right: 0.25rem !important; } .md\:py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .md\:px-2 { padding-left: 0.5rem !important; padding-right: 0.5rem !important; } .md\:py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .md\:px-3 { padding-left: 0.75rem !important; padding-right: 0.75rem !important; } .md\:py-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .md\:px-4 { padding-left: 1rem !important; padding-right: 1rem !important; } .md\:py-5 { padding-top: 1.25rem !important; padding-bottom: 1.25rem !important; } .md\:px-5 { padding-left: 1.25rem !important; padding-right: 1.25rem !important; } .md\:py-6 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .md\:px-6 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } .md\:py-8 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .md\:px-8 { padding-left: 2rem !important; padding-right: 2rem !important; } .md\:py-10 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .md\:px-10 { padding-left: 2.5rem !important; padding-right: 2.5rem !important; } .md\:py-12 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .md\:px-12 { padding-left: 3rem !important; padding-right: 3rem !important; } .md\:py-14 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .md\:px-14 { padding-left: 3.5rem !important; padding-right: 3.5rem !important; } .md\:py-16 { padding-top: 4rem !important; padding-bottom: 4rem !important; } .md\:px-16 { padding-left: 4rem !important; padding-right: 4rem !important; } .md\:py-18 { padding-top: 4.5rem !important; padding-bottom: 4.5rem !important; } .md\:px-18 { padding-left: 4.5rem !important; padding-right: 4.5rem !important; } .md\:py-20 { padding-top: 5rem !important; padding-bottom: 5rem !important; } .md\:px-20 { padding-left: 5rem !important; padding-right: 5rem !important; } .md\:py-22 { padding-top: 5.5rem !important; padding-bottom: 5.5rem !important; } .md\:px-22 { padding-left: 5.5rem !important; padding-right: 5.5rem !important; } .md\:py-24 { padding-top: 6rem !important; padding-bottom: 6rem !important; } .md\:px-24 { padding-left: 6rem !important; padding-right: 6rem !important; } .md\:py-26 { padding-top: 6.5rem !important; padding-bottom: 6.5rem !important; } .md\:px-26 { padding-left: 6.5rem !important; padding-right: 6.5rem !important; } .md\:py-28 { padding-top: 7rem !important; padding-bottom: 7rem !important; } .md\:px-28 { padding-left: 7rem !important; padding-right: 7rem !important; } .md\:py-30 { padding-top: 7.5rem !important; padding-bottom: 7.5rem !important; } .md\:px-30 { padding-left: 7.5rem !important; padding-right: 7.5rem !important; } .md\:py-32 { padding-top: 8rem !important; padding-bottom: 8rem !important; } .md\:px-32 { padding-left: 8rem !important; padding-right: 8rem !important; } .md\:py-36 { padding-top: 9rem !important; padding-bottom: 9rem !important; } .md\:px-36 { padding-left: 9rem !important; padding-right: 9rem !important; } .md\:py-40 { padding-top: 10rem !important; padding-bottom: 10rem !important; } .md\:px-40 { padding-left: 10rem !important; padding-right: 10rem !important; } .md\:py-48 { padding-top: 12rem !important; padding-bottom: 12rem !important; } .md\:px-48 { padding-left: 12rem !important; padding-right: 12rem !important; } .md\:py-56 { padding-top: 14rem !important; padding-bottom: 14rem !important; } .md\:px-56 { padding-left: 14rem !important; padding-right: 14rem !important; } .md\:py-64 { padding-top: 16rem !important; padding-bottom: 16rem !important; } .md\:px-64 { padding-left: 16rem !important; padding-right: 16rem !important; } .md\:py-px { padding-top: 1px !important; padding-bottom: 1px !important; } .md\:px-px { padding-left: 1px !important; padding-right: 1px !important; } .md\:py-2px { padding-top: 2px !important; padding-bottom: 2px !important; } .md\:px-2px { padding-left: 2px !important; padding-right: 2px !important; } .md\:pt-0 { padding-top: 0 !important; } .md\:pr-0 { padding-right: 0 !important; } .md\:pb-0 { padding-bottom: 0 !important; } .md\:pl-0 { padding-left: 0 !important; } .md\:pt-1 { padding-top: 0.25rem !important; } .md\:pr-1 { padding-right: 0.25rem !important; } .md\:pb-1 { padding-bottom: 0.25rem !important; } .md\:pl-1 { padding-left: 0.25rem !important; } .md\:pt-2 { padding-top: 0.5rem !important; } .md\:pr-2 { padding-right: 0.5rem !important; } .md\:pb-2 { padding-bottom: 0.5rem !important; } .md\:pl-2 { padding-left: 0.5rem !important; } .md\:pt-3 { padding-top: 0.75rem !important; } .md\:pr-3 { padding-right: 0.75rem !important; } .md\:pb-3 { padding-bottom: 0.75rem !important; } .md\:pl-3 { padding-left: 0.75rem !important; } .md\:pt-4 { padding-top: 1rem !important; } .md\:pr-4 { padding-right: 1rem !important; } .md\:pb-4 { padding-bottom: 1rem !important; } .md\:pl-4 { padding-left: 1rem !important; } .md\:pt-5 { padding-top: 1.25rem !important; } .md\:pr-5 { padding-right: 1.25rem !important; } .md\:pb-5 { padding-bottom: 1.25rem !important; } .md\:pl-5 { padding-left: 1.25rem !important; } .md\:pt-6 { padding-top: 1.5rem !important; } .md\:pr-6 { padding-right: 1.5rem !important; } .md\:pb-6 { padding-bottom: 1.5rem !important; } .md\:pl-6 { padding-left: 1.5rem !important; } .md\:pt-8 { padding-top: 2rem !important; } .md\:pr-8 { padding-right: 2rem !important; } .md\:pb-8 { padding-bottom: 2rem !important; } .md\:pl-8 { padding-left: 2rem !important; } .md\:pt-10 { padding-top: 2.5rem !important; } .md\:pr-10 { padding-right: 2.5rem !important; } .md\:pb-10 { padding-bottom: 2.5rem !important; } .md\:pl-10 { padding-left: 2.5rem !important; } .md\:pt-12 { padding-top: 3rem !important; } .md\:pr-12 { padding-right: 3rem !important; } .md\:pb-12 { padding-bottom: 3rem !important; } .md\:pl-12 { padding-left: 3rem !important; } .md\:pt-14 { padding-top: 3.5rem !important; } .md\:pr-14 { padding-right: 3.5rem !important; } .md\:pb-14 { padding-bottom: 3.5rem !important; } .md\:pl-14 { padding-left: 3.5rem !important; } .md\:pt-16 { padding-top: 4rem !important; } .md\:pr-16 { padding-right: 4rem !important; } .md\:pb-16 { padding-bottom: 4rem !important; } .md\:pl-16 { padding-left: 4rem !important; } .md\:pt-18 { padding-top: 4.5rem !important; } .md\:pr-18 { padding-right: 4.5rem !important; } .md\:pb-18 { padding-bottom: 4.5rem !important; } .md\:pl-18 { padding-left: 4.5rem !important; } .md\:pt-20 { padding-top: 5rem !important; } .md\:pr-20 { padding-right: 5rem !important; } .md\:pb-20 { padding-bottom: 5rem !important; } .md\:pl-20 { padding-left: 5rem !important; } .md\:pt-22 { padding-top: 5.5rem !important; } .md\:pr-22 { padding-right: 5.5rem !important; } .md\:pb-22 { padding-bottom: 5.5rem !important; } .md\:pl-22 { padding-left: 5.5rem !important; } .md\:pt-24 { padding-top: 6rem !important; } .md\:pr-24 { padding-right: 6rem !important; } .md\:pb-24 { padding-bottom: 6rem !important; } .md\:pl-24 { padding-left: 6rem !important; } .md\:pt-26 { padding-top: 6.5rem !important; } .md\:pr-26 { padding-right: 6.5rem !important; } .md\:pb-26 { padding-bottom: 6.5rem !important; } .md\:pl-26 { padding-left: 6.5rem !important; } .md\:pt-28 { padding-top: 7rem !important; } .md\:pr-28 { padding-right: 7rem !important; } .md\:pb-28 { padding-bottom: 7rem !important; } .md\:pl-28 { padding-left: 7rem !important; } .md\:pt-30 { padding-top: 7.5rem !important; } .md\:pr-30 { padding-right: 7.5rem !important; } .md\:pb-30 { padding-bottom: 7.5rem !important; } .md\:pl-30 { padding-left: 7.5rem !important; } .md\:pt-32 { padding-top: 8rem !important; } .md\:pr-32 { padding-right: 8rem !important; } .md\:pb-32 { padding-bottom: 8rem !important; } .md\:pl-32 { padding-left: 8rem !important; } .md\:pt-36 { padding-top: 9rem !important; } .md\:pr-36 { padding-right: 9rem !important; } .md\:pb-36 { padding-bottom: 9rem !important; } .md\:pl-36 { padding-left: 9rem !important; } .md\:pt-40 { padding-top: 10rem !important; } .md\:pr-40 { padding-right: 10rem !important; } .md\:pb-40 { padding-bottom: 10rem !important; } .md\:pl-40 { padding-left: 10rem !important; } .md\:pt-48 { padding-top: 12rem !important; } .md\:pr-48 { padding-right: 12rem !important; } .md\:pb-48 { padding-bottom: 12rem !important; } .md\:pl-48 { padding-left: 12rem !important; } .md\:pt-56 { padding-top: 14rem !important; } .md\:pr-56 { padding-right: 14rem !important; } .md\:pb-56 { padding-bottom: 14rem !important; } .md\:pl-56 { padding-left: 14rem !important; } .md\:pt-64 { padding-top: 16rem !important; } .md\:pr-64 { padding-right: 16rem !important; } .md\:pb-64 { padding-bottom: 16rem !important; } .md\:pl-64 { padding-left: 16rem !important; } .md\:pt-px { padding-top: 1px !important; } .md\:pr-px { padding-right: 1px !important; } .md\:pb-px { padding-bottom: 1px !important; } .md\:pl-px { padding-left: 1px !important; } .md\:pt-2px { padding-top: 2px !important; } .md\:pr-2px { padding-right: 2px !important; } .md\:pb-2px { padding-bottom: 2px !important; } .md\:pl-2px { padding-left: 2px !important; } .md\:placeholder-opacity-0::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .md\:placeholder-opacity-0::-moz-placeholder { --placeholder-opacity: 0 !important; } .md\:placeholder-opacity-0::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .md\:placeholder-opacity-0::placeholder { --placeholder-opacity: 0 !important; } .md\:placeholder-opacity-12::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .md\:placeholder-opacity-12::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .md\:placeholder-opacity-12::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .md\:placeholder-opacity-12::placeholder { --placeholder-opacity: 0.12 !important; } .md\:placeholder-opacity-25::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .md\:placeholder-opacity-25::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .md\:placeholder-opacity-25::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .md\:placeholder-opacity-25::placeholder { --placeholder-opacity: 0.25 !important; } .md\:placeholder-opacity-38::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .md\:placeholder-opacity-38::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .md\:placeholder-opacity-38::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .md\:placeholder-opacity-38::placeholder { --placeholder-opacity: 0.38 !important; } .md\:placeholder-opacity-50::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .md\:placeholder-opacity-50::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .md\:placeholder-opacity-50::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .md\:placeholder-opacity-50::placeholder { --placeholder-opacity: 0.5 !important; } .md\:placeholder-opacity-54::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .md\:placeholder-opacity-54::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .md\:placeholder-opacity-54::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .md\:placeholder-opacity-54::placeholder { --placeholder-opacity: 0.54 !important; } .md\:placeholder-opacity-70::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .md\:placeholder-opacity-70::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .md\:placeholder-opacity-70::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .md\:placeholder-opacity-70::placeholder { --placeholder-opacity: 0.70 !important; } .md\:placeholder-opacity-75::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .md\:placeholder-opacity-75::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .md\:placeholder-opacity-75::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .md\:placeholder-opacity-75::placeholder { --placeholder-opacity: 0.75 !important; } .md\:placeholder-opacity-84::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .md\:placeholder-opacity-84::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .md\:placeholder-opacity-84::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .md\:placeholder-opacity-84::placeholder { --placeholder-opacity: 0.84 !important; } .md\:placeholder-opacity-100::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .md\:placeholder-opacity-100::-moz-placeholder { --placeholder-opacity: 1 !important; } .md\:placeholder-opacity-100::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .md\:placeholder-opacity-100::placeholder { --placeholder-opacity: 1 !important; } .md\:focus\:placeholder-opacity-0:focus::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .md\:focus\:placeholder-opacity-0:focus::-moz-placeholder { --placeholder-opacity: 0 !important; } .md\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .md\:focus\:placeholder-opacity-0:focus::placeholder { --placeholder-opacity: 0 !important; } .md\:focus\:placeholder-opacity-12:focus::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .md\:focus\:placeholder-opacity-12:focus::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .md\:focus\:placeholder-opacity-12:focus::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .md\:focus\:placeholder-opacity-12:focus::placeholder { --placeholder-opacity: 0.12 !important; } .md\:focus\:placeholder-opacity-25:focus::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .md\:focus\:placeholder-opacity-25:focus::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .md\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .md\:focus\:placeholder-opacity-25:focus::placeholder { --placeholder-opacity: 0.25 !important; } .md\:focus\:placeholder-opacity-38:focus::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .md\:focus\:placeholder-opacity-38:focus::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .md\:focus\:placeholder-opacity-38:focus::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .md\:focus\:placeholder-opacity-38:focus::placeholder { --placeholder-opacity: 0.38 !important; } .md\:focus\:placeholder-opacity-50:focus::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .md\:focus\:placeholder-opacity-50:focus::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .md\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .md\:focus\:placeholder-opacity-50:focus::placeholder { --placeholder-opacity: 0.5 !important; } .md\:focus\:placeholder-opacity-54:focus::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .md\:focus\:placeholder-opacity-54:focus::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .md\:focus\:placeholder-opacity-54:focus::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .md\:focus\:placeholder-opacity-54:focus::placeholder { --placeholder-opacity: 0.54 !important; } .md\:focus\:placeholder-opacity-70:focus::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .md\:focus\:placeholder-opacity-70:focus::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .md\:focus\:placeholder-opacity-70:focus::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .md\:focus\:placeholder-opacity-70:focus::placeholder { --placeholder-opacity: 0.70 !important; } .md\:focus\:placeholder-opacity-75:focus::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .md\:focus\:placeholder-opacity-75:focus::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .md\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .md\:focus\:placeholder-opacity-75:focus::placeholder { --placeholder-opacity: 0.75 !important; } .md\:focus\:placeholder-opacity-84:focus::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .md\:focus\:placeholder-opacity-84:focus::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .md\:focus\:placeholder-opacity-84:focus::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .md\:focus\:placeholder-opacity-84:focus::placeholder { --placeholder-opacity: 0.84 !important; } .md\:focus\:placeholder-opacity-100:focus::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .md\:focus\:placeholder-opacity-100:focus::-moz-placeholder { --placeholder-opacity: 1 !important; } .md\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .md\:focus\:placeholder-opacity-100:focus::placeholder { --placeholder-opacity: 1 !important; } .md\:pointer-events-none { pointer-events: none !important; } .md\:pointer-events-auto { pointer-events: auto !important; } .md\:static { position: static !important; } .md\:fixed { position: fixed !important; } .md\:absolute { position: absolute !important; } .md\:relative { position: relative !important; } .md\:sticky { position: -webkit-sticky !important; position: sticky !important; } .md\:inset-0 { top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; } .md\:inset-auto { top: auto !important; right: auto !important; bottom: auto !important; left: auto !important; } .md\:inset-y-0 { top: 0 !important; bottom: 0 !important; } .md\:inset-x-0 { right: 0 !important; left: 0 !important; } .md\:inset-y-auto { top: auto !important; bottom: auto !important; } .md\:inset-x-auto { right: auto !important; left: auto !important; } .md\:top-0 { top: 0 !important; } .md\:right-0 { right: 0 !important; } .md\:bottom-0 { bottom: 0 !important; } .md\:left-0 { left: 0 !important; } .md\:top-auto { top: auto !important; } .md\:right-auto { right: auto !important; } .md\:bottom-auto { bottom: auto !important; } .md\:left-auto { left: auto !important; } .md\:shadow-xs { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .md\:shadow-sm { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .md\:shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .md\:shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .md\:shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .md\:shadow-xl { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .md\:shadow-2xl { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .md\:shadow-inner { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .md\:shadow-outline { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .md\:shadow-none { box-shadow: none !important; } .md\:shadow-solid { box-shadow: 0 0 0 2px currentColor !important; } .md\:hover\:shadow-xs:hover { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .md\:hover\:shadow-sm:hover { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .md\:hover\:shadow:hover { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .md\:hover\:shadow-md:hover { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .md\:hover\:shadow-lg:hover { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .md\:hover\:shadow-xl:hover { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .md\:hover\:shadow-2xl:hover { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .md\:hover\:shadow-inner:hover { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .md\:hover\:shadow-outline:hover { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .md\:hover\:shadow-none:hover { box-shadow: none !important; } .md\:hover\:shadow-solid:hover { box-shadow: 0 0 0 2px currentColor !important; } .md\:focus\:shadow-xs:focus { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .md\:focus\:shadow-sm:focus { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .md\:focus\:shadow:focus { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .md\:focus\:shadow-md:focus { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .md\:focus\:shadow-lg:focus { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .md\:focus\:shadow-xl:focus { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .md\:focus\:shadow-2xl:focus { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .md\:focus\:shadow-inner:focus { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .md\:focus\:shadow-outline:focus { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .md\:focus\:shadow-none:focus { box-shadow: none !important; } .md\:focus\:shadow-solid:focus { box-shadow: 0 0 0 2px currentColor !important; } .md\:fill-current { fill: currentColor !important; } .md\:stroke-current { stroke: currentColor !important; } .md\:stroke-0 { stroke-width: 0 !important; } .md\:stroke-1 { stroke-width: 1 !important; } .md\:stroke-2 { stroke-width: 2 !important; } .md\:table-auto { table-layout: auto !important; } .md\:table-fixed { table-layout: fixed !important; } .md\:text-left { text-align: left !important; } .md\:text-center { text-align: center !important; } .md\:text-right { text-align: right !important; } .md\:text-justify { text-align: justify !important; } .md\:text-opacity-0 { --text-opacity: 0 !important; } .md\:text-opacity-12 { --text-opacity: 0.12 !important; } .md\:text-opacity-25 { --text-opacity: 0.25 !important; } .md\:text-opacity-38 { --text-opacity: 0.38 !important; } .md\:text-opacity-50 { --text-opacity: 0.5 !important; } .md\:text-opacity-54 { --text-opacity: 0.54 !important; } .md\:text-opacity-70 { --text-opacity: 0.70 !important; } .md\:text-opacity-75 { --text-opacity: 0.75 !important; } .md\:text-opacity-84 { --text-opacity: 0.84 !important; } .md\:text-opacity-100 { --text-opacity: 1 !important; } .md\:hover\:text-opacity-0:hover { --text-opacity: 0 !important; } .md\:hover\:text-opacity-12:hover { --text-opacity: 0.12 !important; } .md\:hover\:text-opacity-25:hover { --text-opacity: 0.25 !important; } .md\:hover\:text-opacity-38:hover { --text-opacity: 0.38 !important; } .md\:hover\:text-opacity-50:hover { --text-opacity: 0.5 !important; } .md\:hover\:text-opacity-54:hover { --text-opacity: 0.54 !important; } .md\:hover\:text-opacity-70:hover { --text-opacity: 0.70 !important; } .md\:hover\:text-opacity-75:hover { --text-opacity: 0.75 !important; } .md\:hover\:text-opacity-84:hover { --text-opacity: 0.84 !important; } .md\:hover\:text-opacity-100:hover { --text-opacity: 1 !important; } .md\:focus\:text-opacity-0:focus { --text-opacity: 0 !important; } .md\:focus\:text-opacity-12:focus { --text-opacity: 0.12 !important; } .md\:focus\:text-opacity-25:focus { --text-opacity: 0.25 !important; } .md\:focus\:text-opacity-38:focus { --text-opacity: 0.38 !important; } .md\:focus\:text-opacity-50:focus { --text-opacity: 0.5 !important; } .md\:focus\:text-opacity-54:focus { --text-opacity: 0.54 !important; } .md\:focus\:text-opacity-70:focus { --text-opacity: 0.70 !important; } .md\:focus\:text-opacity-75:focus { --text-opacity: 0.75 !important; } .md\:focus\:text-opacity-84:focus { --text-opacity: 0.84 !important; } .md\:focus\:text-opacity-100:focus { --text-opacity: 1 !important; } .md\:italic { font-style: italic !important; } .md\:not-italic { font-style: normal !important; } .md\:uppercase { text-transform: uppercase !important; } .md\:lowercase { text-transform: lowercase !important; } .md\:capitalize { text-transform: capitalize !important; } .md\:normal-case { text-transform: none !important; } .md\:underline { text-decoration: underline !important; } .md\:line-through { text-decoration: line-through !important; } .md\:no-underline { text-decoration: none !important; } .md\:hover\:underline:hover { text-decoration: underline !important; } .md\:hover\:line-through:hover { text-decoration: line-through !important; } .md\:hover\:no-underline:hover { text-decoration: none !important; } .md\:focus\:underline:focus { text-decoration: underline !important; } .md\:focus\:line-through:focus { text-decoration: line-through !important; } .md\:focus\:no-underline:focus { text-decoration: none !important; } .md\:tracking-tighter { letter-spacing: -0.05em !important; } .md\:tracking-tight { letter-spacing: -0.025em !important; } .md\:tracking-normal { letter-spacing: 0 !important; } .md\:tracking-wide { letter-spacing: 0.025em !important; } .md\:tracking-wider { letter-spacing: 0.05em !important; } .md\:tracking-widest { letter-spacing: 0.1em !important; } .md\:select-none { -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important; } .md\:select-text { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } .md\:select-all { -webkit-user-select: all !important; -moz-user-select: all !important; -ms-user-select: all !important; user-select: all !important; } .md\:select-auto { -webkit-user-select: auto !important; -moz-user-select: auto !important; -ms-user-select: auto !important; user-select: auto !important; } .md\:align-baseline { vertical-align: baseline !important; } .md\:align-top { vertical-align: top !important; } .md\:align-middle { vertical-align: middle !important; } .md\:align-bottom { vertical-align: bottom !important; } .md\:align-text-top { vertical-align: text-top !important; } .md\:align-text-bottom { vertical-align: text-bottom !important; } .md\:visible { visibility: visible !important; } .md\:invisible { visibility: hidden !important; } .md\:whitespace-normal { white-space: normal !important; } .md\:whitespace-no-wrap { white-space: nowrap !important; } .md\:whitespace-pre { white-space: pre !important; } .md\:whitespace-pre-line { white-space: pre-line !important; } .md\:whitespace-pre-wrap { white-space: pre-wrap !important; } .md\:break-normal { overflow-wrap: normal !important; word-break: normal !important; } .md\:break-words { overflow-wrap: break-word !important; } .md\:break-all { word-break: break-all !important; } .md\:truncate { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } .md\:w-0 { width: 0 !important; } .md\:w-1 { width: 0.25rem !important; } .md\:w-2 { width: 0.5rem !important; } .md\:w-3 { width: 0.75rem !important; } .md\:w-4 { width: 1rem !important; } .md\:w-5 { width: 1.25rem !important; } .md\:w-6 { width: 1.5rem !important; } .md\:w-8 { width: 2rem !important; } .md\:w-10 { width: 2.5rem !important; } .md\:w-12 { width: 3rem !important; } .md\:w-14 { width: 3.5rem !important; } .md\:w-16 { width: 4rem !important; } .md\:w-18 { width: 4.5rem !important; } .md\:w-20 { width: 5rem !important; } .md\:w-22 { width: 5.5rem !important; } .md\:w-24 { width: 6rem !important; } .md\:w-26 { width: 6.5rem !important; } .md\:w-28 { width: 7rem !important; } .md\:w-30 { width: 7.5rem !important; } .md\:w-32 { width: 8rem !important; } .md\:w-36 { width: 9rem !important; } .md\:w-40 { width: 10rem !important; } .md\:w-48 { width: 12rem !important; } .md\:w-50 { width: 12.5rem !important; } .md\:w-56 { width: 14rem !important; } .md\:w-60 { width: 15rem !important; } .md\:w-64 { width: 16rem !important; } .md\:w-80 { width: 20rem !important; } .md\:w-90 { width: 24rem !important; } .md\:w-100 { width: 25rem !important; } .md\:w-120 { width: 30rem !important; } .md\:w-128 { width: 32rem !important; } .md\:w-140 { width: 35rem !important; } .md\:w-160 { width: 40rem !important; } .md\:w-180 { width: 45rem !important; } .md\:w-192 { width: 48rem !important; } .md\:w-200 { width: 50rem !important; } .md\:w-240 { width: 60rem !important; } .md\:w-256 { width: 64rem !important; } .md\:w-280 { width: 70rem !important; } .md\:w-320 { width: 80rem !important; } .md\:w-360 { width: 90rem !important; } .md\:w-400 { width: 100rem !important; } .md\:w-480 { width: 120rem !important; } .md\:w-auto { width: auto !important; } .md\:w-px { width: 1px !important; } .md\:w-2px { width: 2px !important; } .md\:w-1\/2 { width: 50% !important; } .md\:w-1\/3 { width: 33.33333% !important; } .md\:w-2\/3 { width: 66.66667% !important; } .md\:w-1\/4 { width: 25% !important; } .md\:w-2\/4 { width: 50% !important; } .md\:w-3\/4 { width: 75% !important; } .md\:w-1\/5 { width: 20% !important; } .md\:w-2\/5 { width: 40% !important; } .md\:w-3\/5 { width: 60% !important; } .md\:w-4\/5 { width: 80% !important; } .md\:w-1\/6 { width: 16.666667% !important; } .md\:w-2\/6 { width: 33.333333% !important; } .md\:w-3\/6 { width: 50% !important; } .md\:w-4\/6 { width: 66.666667% !important; } .md\:w-5\/6 { width: 83.333333% !important; } .md\:w-1\/12 { width: 8.33333% !important; } .md\:w-2\/12 { width: 16.66667% !important; } .md\:w-3\/12 { width: 25% !important; } .md\:w-4\/12 { width: 33.33333% !important; } .md\:w-5\/12 { width: 41.66667% !important; } .md\:w-6\/12 { width: 50% !important; } .md\:w-7\/12 { width: 58.33333% !important; } .md\:w-8\/12 { width: 66.66667% !important; } .md\:w-9\/12 { width: 75% !important; } .md\:w-10\/12 { width: 83.33333% !important; } .md\:w-11\/12 { width: 91.66667% !important; } .md\:w-full { width: 100% !important; } .md\:w-screen { width: 100vw !important; } .md\:z-0 { z-index: 0 !important; } .md\:z-10 { z-index: 10 !important; } .md\:z-20 { z-index: 20 !important; } .md\:z-30 { z-index: 30 !important; } .md\:z-40 { z-index: 40 !important; } .md\:z-50 { z-index: 50 !important; } .md\:z-60 { z-index: 60 !important; } .md\:z-70 { z-index: 70 !important; } .md\:z-80 { z-index: 80 !important; } .md\:z-90 { z-index: 90 !important; } .md\:z-99 { z-index: 99 !important; } .md\:z-999 { z-index: 999 !important; } .md\:z-9999 { z-index: 9999 !important; } .md\:z-99999 { z-index: 99999 !important; } .md\:z-auto { z-index: auto !important; } .md\:-z-1 { z-index: -1 !important; } .md\:gap-0 { grid-gap: 0 !important; gap: 0 !important; } .md\:gap-1 { grid-gap: 0.25rem !important; gap: 0.25rem !important; } .md\:gap-2 { grid-gap: 0.5rem !important; gap: 0.5rem !important; } .md\:gap-3 { grid-gap: 0.75rem !important; gap: 0.75rem !important; } .md\:gap-4 { grid-gap: 1rem !important; gap: 1rem !important; } .md\:gap-5 { grid-gap: 1.25rem !important; gap: 1.25rem !important; } .md\:gap-6 { grid-gap: 1.5rem !important; gap: 1.5rem !important; } .md\:gap-8 { grid-gap: 2rem !important; gap: 2rem !important; } .md\:gap-10 { grid-gap: 2.5rem !important; gap: 2.5rem !important; } .md\:gap-12 { grid-gap: 3rem !important; gap: 3rem !important; } .md\:gap-14 { grid-gap: 3.5rem !important; gap: 3.5rem !important; } .md\:gap-16 { grid-gap: 4rem !important; gap: 4rem !important; } .md\:gap-18 { grid-gap: 4.5rem !important; gap: 4.5rem !important; } .md\:gap-20 { grid-gap: 5rem !important; gap: 5rem !important; } .md\:gap-22 { grid-gap: 5.5rem !important; gap: 5.5rem !important; } .md\:gap-24 { grid-gap: 6rem !important; gap: 6rem !important; } .md\:gap-26 { grid-gap: 6.5rem !important; gap: 6.5rem !important; } .md\:gap-28 { grid-gap: 7rem !important; gap: 7rem !important; } .md\:gap-30 { grid-gap: 7.5rem !important; gap: 7.5rem !important; } .md\:gap-32 { grid-gap: 8rem !important; gap: 8rem !important; } .md\:gap-36 { grid-gap: 9rem !important; gap: 9rem !important; } .md\:gap-40 { grid-gap: 10rem !important; gap: 10rem !important; } .md\:gap-48 { grid-gap: 12rem !important; gap: 12rem !important; } .md\:gap-56 { grid-gap: 14rem !important; gap: 14rem !important; } .md\:gap-64 { grid-gap: 16rem !important; gap: 16rem !important; } .md\:gap-px { grid-gap: 1px !important; gap: 1px !important; } .md\:gap-2px { grid-gap: 2px !important; gap: 2px !important; } .md\:col-gap-0 { grid-column-gap: 0 !important; -moz-column-gap: 0 !important; column-gap: 0 !important; } .md\:col-gap-1 { grid-column-gap: 0.25rem !important; -moz-column-gap: 0.25rem !important; column-gap: 0.25rem !important; } .md\:col-gap-2 { grid-column-gap: 0.5rem !important; -moz-column-gap: 0.5rem !important; column-gap: 0.5rem !important; } .md\:col-gap-3 { grid-column-gap: 0.75rem !important; -moz-column-gap: 0.75rem !important; column-gap: 0.75rem !important; } .md\:col-gap-4 { grid-column-gap: 1rem !important; -moz-column-gap: 1rem !important; column-gap: 1rem !important; } .md\:col-gap-5 { grid-column-gap: 1.25rem !important; -moz-column-gap: 1.25rem !important; column-gap: 1.25rem !important; } .md\:col-gap-6 { grid-column-gap: 1.5rem !important; -moz-column-gap: 1.5rem !important; column-gap: 1.5rem !important; } .md\:col-gap-8 { grid-column-gap: 2rem !important; -moz-column-gap: 2rem !important; column-gap: 2rem !important; } .md\:col-gap-10 { grid-column-gap: 2.5rem !important; -moz-column-gap: 2.5rem !important; column-gap: 2.5rem !important; } .md\:col-gap-12 { grid-column-gap: 3rem !important; -moz-column-gap: 3rem !important; column-gap: 3rem !important; } .md\:col-gap-14 { grid-column-gap: 3.5rem !important; -moz-column-gap: 3.5rem !important; column-gap: 3.5rem !important; } .md\:col-gap-16 { grid-column-gap: 4rem !important; -moz-column-gap: 4rem !important; column-gap: 4rem !important; } .md\:col-gap-18 { grid-column-gap: 4.5rem !important; -moz-column-gap: 4.5rem !important; column-gap: 4.5rem !important; } .md\:col-gap-20 { grid-column-gap: 5rem !important; -moz-column-gap: 5rem !important; column-gap: 5rem !important; } .md\:col-gap-22 { grid-column-gap: 5.5rem !important; -moz-column-gap: 5.5rem !important; column-gap: 5.5rem !important; } .md\:col-gap-24 { grid-column-gap: 6rem !important; -moz-column-gap: 6rem !important; column-gap: 6rem !important; } .md\:col-gap-26 { grid-column-gap: 6.5rem !important; -moz-column-gap: 6.5rem !important; column-gap: 6.5rem !important; } .md\:col-gap-28 { grid-column-gap: 7rem !important; -moz-column-gap: 7rem !important; column-gap: 7rem !important; } .md\:col-gap-30 { grid-column-gap: 7.5rem !important; -moz-column-gap: 7.5rem !important; column-gap: 7.5rem !important; } .md\:col-gap-32 { grid-column-gap: 8rem !important; -moz-column-gap: 8rem !important; column-gap: 8rem !important; } .md\:col-gap-36 { grid-column-gap: 9rem !important; -moz-column-gap: 9rem !important; column-gap: 9rem !important; } .md\:col-gap-40 { grid-column-gap: 10rem !important; -moz-column-gap: 10rem !important; column-gap: 10rem !important; } .md\:col-gap-48 { grid-column-gap: 12rem !important; -moz-column-gap: 12rem !important; column-gap: 12rem !important; } .md\:col-gap-56 { grid-column-gap: 14rem !important; -moz-column-gap: 14rem !important; column-gap: 14rem !important; } .md\:col-gap-64 { grid-column-gap: 16rem !important; -moz-column-gap: 16rem !important; column-gap: 16rem !important; } .md\:col-gap-px { grid-column-gap: 1px !important; -moz-column-gap: 1px !important; column-gap: 1px !important; } .md\:col-gap-2px { grid-column-gap: 2px !important; -moz-column-gap: 2px !important; column-gap: 2px !important; } .md\:row-gap-0 { grid-row-gap: 0 !important; row-gap: 0 !important; } .md\:row-gap-1 { grid-row-gap: 0.25rem !important; row-gap: 0.25rem !important; } .md\:row-gap-2 { grid-row-gap: 0.5rem !important; row-gap: 0.5rem !important; } .md\:row-gap-3 { grid-row-gap: 0.75rem !important; row-gap: 0.75rem !important; } .md\:row-gap-4 { grid-row-gap: 1rem !important; row-gap: 1rem !important; } .md\:row-gap-5 { grid-row-gap: 1.25rem !important; row-gap: 1.25rem !important; } .md\:row-gap-6 { grid-row-gap: 1.5rem !important; row-gap: 1.5rem !important; } .md\:row-gap-8 { grid-row-gap: 2rem !important; row-gap: 2rem !important; } .md\:row-gap-10 { grid-row-gap: 2.5rem !important; row-gap: 2.5rem !important; } .md\:row-gap-12 { grid-row-gap: 3rem !important; row-gap: 3rem !important; } .md\:row-gap-14 { grid-row-gap: 3.5rem !important; row-gap: 3.5rem !important; } .md\:row-gap-16 { grid-row-gap: 4rem !important; row-gap: 4rem !important; } .md\:row-gap-18 { grid-row-gap: 4.5rem !important; row-gap: 4.5rem !important; } .md\:row-gap-20 { grid-row-gap: 5rem !important; row-gap: 5rem !important; } .md\:row-gap-22 { grid-row-gap: 5.5rem !important; row-gap: 5.5rem !important; } .md\:row-gap-24 { grid-row-gap: 6rem !important; row-gap: 6rem !important; } .md\:row-gap-26 { grid-row-gap: 6.5rem !important; row-gap: 6.5rem !important; } .md\:row-gap-28 { grid-row-gap: 7rem !important; row-gap: 7rem !important; } .md\:row-gap-30 { grid-row-gap: 7.5rem !important; row-gap: 7.5rem !important; } .md\:row-gap-32 { grid-row-gap: 8rem !important; row-gap: 8rem !important; } .md\:row-gap-36 { grid-row-gap: 9rem !important; row-gap: 9rem !important; } .md\:row-gap-40 { grid-row-gap: 10rem !important; row-gap: 10rem !important; } .md\:row-gap-48 { grid-row-gap: 12rem !important; row-gap: 12rem !important; } .md\:row-gap-56 { grid-row-gap: 14rem !important; row-gap: 14rem !important; } .md\:row-gap-64 { grid-row-gap: 16rem !important; row-gap: 16rem !important; } .md\:row-gap-px { grid-row-gap: 1px !important; row-gap: 1px !important; } .md\:row-gap-2px { grid-row-gap: 2px !important; row-gap: 2px !important; } .md\:grid-flow-row { grid-auto-flow: row !important; } .md\:grid-flow-col { grid-auto-flow: column !important; } .md\:grid-flow-row-dense { grid-auto-flow: row dense !important; } .md\:grid-flow-col-dense { grid-auto-flow: column dense !important; } .md\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; } .md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } .md\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; } .md\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; } .md\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; } .md\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; } .md\:grid-cols-7 { grid-template-columns: repeat(7, minmax(0, 1fr)) !important; } .md\:grid-cols-8 { grid-template-columns: repeat(8, minmax(0, 1fr)) !important; } .md\:grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)) !important; } .md\:grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)) !important; } .md\:grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)) !important; } .md\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)) !important; } .md\:grid-cols-none { grid-template-columns: none !important; } .md\:col-auto { grid-column: auto !important; } .md\:col-span-1 { grid-column: span 1 / span 1 !important; } .md\:col-span-2 { grid-column: span 2 / span 2 !important; } .md\:col-span-3 { grid-column: span 3 / span 3 !important; } .md\:col-span-4 { grid-column: span 4 / span 4 !important; } .md\:col-span-5 { grid-column: span 5 / span 5 !important; } .md\:col-span-6 { grid-column: span 6 / span 6 !important; } .md\:col-span-7 { grid-column: span 7 / span 7 !important; } .md\:col-span-8 { grid-column: span 8 / span 8 !important; } .md\:col-span-9 { grid-column: span 9 / span 9 !important; } .md\:col-span-10 { grid-column: span 10 / span 10 !important; } .md\:col-span-11 { grid-column: span 11 / span 11 !important; } .md\:col-span-12 { grid-column: span 12 / span 12 !important; } .md\:col-start-1 { grid-column-start: 1 !important; } .md\:col-start-2 { grid-column-start: 2 !important; } .md\:col-start-3 { grid-column-start: 3 !important; } .md\:col-start-4 { grid-column-start: 4 !important; } .md\:col-start-5 { grid-column-start: 5 !important; } .md\:col-start-6 { grid-column-start: 6 !important; } .md\:col-start-7 { grid-column-start: 7 !important; } .md\:col-start-8 { grid-column-start: 8 !important; } .md\:col-start-9 { grid-column-start: 9 !important; } .md\:col-start-10 { grid-column-start: 10 !important; } .md\:col-start-11 { grid-column-start: 11 !important; } .md\:col-start-12 { grid-column-start: 12 !important; } .md\:col-start-13 { grid-column-start: 13 !important; } .md\:col-start-auto { grid-column-start: auto !important; } .md\:col-end-1 { grid-column-end: 1 !important; } .md\:col-end-2 { grid-column-end: 2 !important; } .md\:col-end-3 { grid-column-end: 3 !important; } .md\:col-end-4 { grid-column-end: 4 !important; } .md\:col-end-5 { grid-column-end: 5 !important; } .md\:col-end-6 { grid-column-end: 6 !important; } .md\:col-end-7 { grid-column-end: 7 !important; } .md\:col-end-8 { grid-column-end: 8 !important; } .md\:col-end-9 { grid-column-end: 9 !important; } .md\:col-end-10 { grid-column-end: 10 !important; } .md\:col-end-11 { grid-column-end: 11 !important; } .md\:col-end-12 { grid-column-end: 12 !important; } .md\:col-end-13 { grid-column-end: 13 !important; } .md\:col-end-auto { grid-column-end: auto !important; } .md\:grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)) !important; } .md\:grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)) !important; } .md\:grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)) !important; } .md\:grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)) !important; } .md\:grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)) !important; } .md\:grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)) !important; } .md\:grid-rows-none { grid-template-rows: none !important; } .md\:row-auto { grid-row: auto !important; } .md\:row-span-1 { grid-row: span 1 / span 1 !important; } .md\:row-span-2 { grid-row: span 2 / span 2 !important; } .md\:row-span-3 { grid-row: span 3 / span 3 !important; } .md\:row-span-4 { grid-row: span 4 / span 4 !important; } .md\:row-span-5 { grid-row: span 5 / span 5 !important; } .md\:row-span-6 { grid-row: span 6 / span 6 !important; } .md\:row-start-1 { grid-row-start: 1 !important; } .md\:row-start-2 { grid-row-start: 2 !important; } .md\:row-start-3 { grid-row-start: 3 !important; } .md\:row-start-4 { grid-row-start: 4 !important; } .md\:row-start-5 { grid-row-start: 5 !important; } .md\:row-start-6 { grid-row-start: 6 !important; } .md\:row-start-7 { grid-row-start: 7 !important; } .md\:row-start-auto { grid-row-start: auto !important; } .md\:row-end-1 { grid-row-end: 1 !important; } .md\:row-end-2 { grid-row-end: 2 !important; } .md\:row-end-3 { grid-row-end: 3 !important; } .md\:row-end-4 { grid-row-end: 4 !important; } .md\:row-end-5 { grid-row-end: 5 !important; } .md\:row-end-6 { grid-row-end: 6 !important; } .md\:row-end-7 { grid-row-end: 7 !important; } .md\:row-end-auto { grid-row-end: auto !important; } .md\:transform { --transform-translate-x: 0 !important; --transform-translate-y: 0 !important; --transform-rotate: 0 !important; --transform-skew-x: 0 !important; --transform-skew-y: 0 !important; --transform-scale-x: 1 !important; --transform-scale-y: 1 !important; transform: translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y)) !important; } .md\:transform-none { transform: none !important; } .md\:origin-center { transform-origin: center !important; } .md\:origin-top { transform-origin: top !important; } .md\:origin-top-right { transform-origin: top right !important; } .md\:origin-right { transform-origin: right !important; } .md\:origin-bottom-right { transform-origin: bottom right !important; } .md\:origin-bottom { transform-origin: bottom !important; } .md\:origin-bottom-left { transform-origin: bottom left !important; } .md\:origin-left { transform-origin: left !important; } .md\:origin-top-left { transform-origin: top left !important; } .md\:icon-size-12 { width: 12px !important; height: 12px !important; min-width: 12px !important; min-height: 12px !important; font-size: 12px !important; line-height: 12px !important; } .md\:icon-size-12 svg { width: 12px !important; height: 12px !important; } .md\:icon-size-14 { width: 14px !important; height: 14px !important; min-width: 14px !important; min-height: 14px !important; font-size: 14px !important; line-height: 14px !important; } .md\:icon-size-14 svg { width: 14px !important; height: 14px !important; } .md\:icon-size-16 { width: 16px !important; height: 16px !important; min-width: 16px !important; min-height: 16px !important; font-size: 16px !important; line-height: 16px !important; } .md\:icon-size-16 svg { width: 16px !important; height: 16px !important; } .md\:icon-size-18 { width: 18px !important; height: 18px !important; min-width: 18px !important; min-height: 18px !important; font-size: 18px !important; line-height: 18px !important; } .md\:icon-size-18 svg { width: 18px !important; height: 18px !important; } .md\:icon-size-20 { width: 20px !important; height: 20px !important; min-width: 20px !important; min-height: 20px !important; font-size: 20px !important; line-height: 20px !important; } .md\:icon-size-20 svg { width: 20px !important; height: 20px !important; } .md\:icon-size-24 { width: 24px !important; height: 24px !important; min-width: 24px !important; min-height: 24px !important; font-size: 24px !important; line-height: 24px !important; } .md\:icon-size-24 svg { width: 24px !important; height: 24px !important; } .md\:icon-size-32 { width: 32px !important; height: 32px !important; min-width: 32px !important; min-height: 32px !important; font-size: 32px !important; line-height: 32px !important; } .md\:icon-size-32 svg { width: 32px !important; height: 32px !important; } .md\:icon-size-40 { width: 40px !important; height: 40px !important; min-width: 40px !important; min-height: 40px !important; font-size: 40px !important; line-height: 40px !important; } .md\:icon-size-40 svg { width: 40px !important; height: 40px !important; } .md\:icon-size-48 { width: 48px !important; height: 48px !important; min-width: 48px !important; min-height: 48px !important; font-size: 48px !important; line-height: 48px !important; } .md\:icon-size-48 svg { width: 48px !important; height: 48px !important; } .md\:icon-size-56 { width: 56px !important; height: 56px !important; min-width: 56px !important; min-height: 56px !important; font-size: 56px !important; line-height: 56px !important; } .md\:icon-size-56 svg { width: 56px !important; height: 56px !important; } .md\:icon-size-64 { width: 64px !important; height: 64px !important; min-width: 64px !important; min-height: 64px !important; font-size: 64px !important; line-height: 64px !important; } .md\:icon-size-64 svg { width: 64px !important; height: 64px !important; } .md\:icon-size-72 { width: 72px !important; height: 72px !important; min-width: 72px !important; min-height: 72px !important; font-size: 72px !important; line-height: 72px !important; } .md\:icon-size-72 svg { width: 72px !important; height: 72px !important; } .md\:icon-size-80 { width: 80px !important; height: 80px !important; min-width: 80px !important; min-height: 80px !important; font-size: 80px !important; line-height: 80px !important; } .md\:icon-size-80 svg { width: 80px !important; height: 80px !important; } .md\:icon-size-88 { width: 88px !important; height: 88px !important; min-width: 88px !important; min-height: 88px !important; font-size: 88px !important; line-height: 88px !important; } .md\:icon-size-88 svg { width: 88px !important; height: 88px !important; } .md\:icon-size-96 { width: 96px !important; height: 96px !important; min-width: 96px !important; min-height: 96px !important; font-size: 96px !important; line-height: 96px !important; } .md\:icon-size-96 svg { width: 96px !important; height: 96px !important; } } @media (min-width: 1280px) and (max-width: 1439px) { .lg\:space-y-0 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0px * var(--space-y-reverse)) !important; } .lg\:space-x-0 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0px * var(--space-x-reverse)) !important; margin-left: calc(0px * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.25rem * var(--space-y-reverse)) !important; } .lg\:space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.25rem * var(--space-x-reverse)) !important; margin-left: calc(0.25rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.5rem * var(--space-y-reverse)) !important; } .lg\:space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.5rem * var(--space-x-reverse)) !important; margin-left: calc(0.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.75rem * var(--space-y-reverse)) !important; } .lg\:space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.75rem * var(--space-x-reverse)) !important; margin-left: calc(0.75rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1rem * var(--space-y-reverse)) !important; } .lg\:space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1rem * var(--space-x-reverse)) !important; margin-left: calc(1rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.25rem * var(--space-y-reverse)) !important; } .lg\:space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.25rem * var(--space-x-reverse)) !important; margin-left: calc(1.25rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.5rem * var(--space-y-reverse)) !important; } .lg\:space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.5rem * var(--space-x-reverse)) !important; margin-left: calc(1.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2rem * var(--space-y-reverse)) !important; } .lg\:space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2rem * var(--space-x-reverse)) !important; margin-left: calc(2rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2.5rem * var(--space-y-reverse)) !important; } .lg\:space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2.5rem * var(--space-x-reverse)) !important; margin-left: calc(2.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3rem * var(--space-y-reverse)) !important; } .lg\:space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3rem * var(--space-x-reverse)) !important; margin-left: calc(3rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3.5rem * var(--space-y-reverse)) !important; } .lg\:space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3.5rem * var(--space-x-reverse)) !important; margin-left: calc(3.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4rem * var(--space-y-reverse)) !important; } .lg\:space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4rem * var(--space-x-reverse)) !important; margin-left: calc(4rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4.5rem * var(--space-y-reverse)) !important; } .lg\:space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4.5rem * var(--space-x-reverse)) !important; margin-left: calc(4.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5rem * var(--space-y-reverse)) !important; } .lg\:space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5rem * var(--space-x-reverse)) !important; margin-left: calc(5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5.5rem * var(--space-y-reverse)) !important; } .lg\:space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5.5rem * var(--space-x-reverse)) !important; margin-left: calc(5.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6rem * var(--space-y-reverse)) !important; } .lg\:space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6rem * var(--space-x-reverse)) !important; margin-left: calc(6rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6.5rem * var(--space-y-reverse)) !important; } .lg\:space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6.5rem * var(--space-x-reverse)) !important; margin-left: calc(6.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7rem * var(--space-y-reverse)) !important; } .lg\:space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7rem * var(--space-x-reverse)) !important; margin-left: calc(7rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7.5rem * var(--space-y-reverse)) !important; } .lg\:space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7.5rem * var(--space-x-reverse)) !important; margin-left: calc(7.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(8rem * var(--space-y-reverse)) !important; } .lg\:space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(8rem * var(--space-x-reverse)) !important; margin-left: calc(8rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(9rem * var(--space-y-reverse)) !important; } .lg\:space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(9rem * var(--space-x-reverse)) !important; margin-left: calc(9rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(10rem * var(--space-y-reverse)) !important; } .lg\:space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(10rem * var(--space-x-reverse)) !important; margin-left: calc(10rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(12rem * var(--space-y-reverse)) !important; } .lg\:space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(12rem * var(--space-x-reverse)) !important; margin-left: calc(12rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(14rem * var(--space-y-reverse)) !important; } .lg\:space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(14rem * var(--space-x-reverse)) !important; margin-left: calc(14rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(16rem * var(--space-y-reverse)) !important; } .lg\:space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(16rem * var(--space-x-reverse)) !important; margin-left: calc(16rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1px * var(--space-y-reverse)) !important; } .lg\:space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1px * var(--space-x-reverse)) !important; margin-left: calc(1px * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2px * var(--space-y-reverse)) !important; } .lg\:space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2px * var(--space-x-reverse)) !important; margin-left: calc(2px * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.25rem * var(--space-y-reverse)) !important; } .lg\:-space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.25rem * var(--space-x-reverse)) !important; margin-left: calc(-0.25rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.5rem * var(--space-y-reverse)) !important; } .lg\:-space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.5rem * var(--space-x-reverse)) !important; margin-left: calc(-0.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.75rem * var(--space-y-reverse)) !important; } .lg\:-space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.75rem * var(--space-x-reverse)) !important; margin-left: calc(-0.75rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1rem * var(--space-y-reverse)) !important; } .lg\:-space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1rem * var(--space-x-reverse)) !important; margin-left: calc(-1rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.25rem * var(--space-y-reverse)) !important; } .lg\:-space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.25rem * var(--space-x-reverse)) !important; margin-left: calc(-1.25rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.5rem * var(--space-y-reverse)) !important; } .lg\:-space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.5rem * var(--space-x-reverse)) !important; margin-left: calc(-1.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2rem * var(--space-y-reverse)) !important; } .lg\:-space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2rem * var(--space-x-reverse)) !important; margin-left: calc(-2rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2.5rem * var(--space-y-reverse)) !important; } .lg\:-space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2.5rem * var(--space-x-reverse)) !important; margin-left: calc(-2.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3rem * var(--space-y-reverse)) !important; } .lg\:-space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3rem * var(--space-x-reverse)) !important; margin-left: calc(-3rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3.5rem * var(--space-y-reverse)) !important; } .lg\:-space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3.5rem * var(--space-x-reverse)) !important; margin-left: calc(-3.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4rem * var(--space-y-reverse)) !important; } .lg\:-space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4rem * var(--space-x-reverse)) !important; margin-left: calc(-4rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4.5rem * var(--space-y-reverse)) !important; } .lg\:-space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4.5rem * var(--space-x-reverse)) !important; margin-left: calc(-4.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5rem * var(--space-y-reverse)) !important; } .lg\:-space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5rem * var(--space-x-reverse)) !important; margin-left: calc(-5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5.5rem * var(--space-y-reverse)) !important; } .lg\:-space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5.5rem * var(--space-x-reverse)) !important; margin-left: calc(-5.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6rem * var(--space-y-reverse)) !important; } .lg\:-space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6rem * var(--space-x-reverse)) !important; margin-left: calc(-6rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6.5rem * var(--space-y-reverse)) !important; } .lg\:-space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6.5rem * var(--space-x-reverse)) !important; margin-left: calc(-6.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7rem * var(--space-y-reverse)) !important; } .lg\:-space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7rem * var(--space-x-reverse)) !important; margin-left: calc(-7rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7.5rem * var(--space-y-reverse)) !important; } .lg\:-space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7.5rem * var(--space-x-reverse)) !important; margin-left: calc(-7.5rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-8rem * var(--space-y-reverse)) !important; } .lg\:-space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-8rem * var(--space-x-reverse)) !important; margin-left: calc(-8rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-9rem * var(--space-y-reverse)) !important; } .lg\:-space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-9rem * var(--space-x-reverse)) !important; margin-left: calc(-9rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-10rem * var(--space-y-reverse)) !important; } .lg\:-space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-10rem * var(--space-x-reverse)) !important; margin-left: calc(-10rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-12rem * var(--space-y-reverse)) !important; } .lg\:-space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-12rem * var(--space-x-reverse)) !important; margin-left: calc(-12rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-14rem * var(--space-y-reverse)) !important; } .lg\:-space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-14rem * var(--space-x-reverse)) !important; margin-left: calc(-14rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-16rem * var(--space-y-reverse)) !important; } .lg\:-space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-16rem * var(--space-x-reverse)) !important; margin-left: calc(-16rem * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1px * var(--space-y-reverse)) !important; } .lg\:-space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1px * var(--space-x-reverse)) !important; margin-left: calc(-1px * calc(1 - var(--space-x-reverse))) !important; } .lg\:-space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2px * var(--space-y-reverse)) !important; } .lg\:-space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2px * var(--space-x-reverse)) !important; margin-left: calc(-2px * calc(1 - var(--space-x-reverse))) !important; } .lg\:space-y-reverse > :not(template) ~ :not(template) { --space-y-reverse: 1 !important; } .lg\:space-x-reverse > :not(template) ~ :not(template) { --space-x-reverse: 1 !important; } .lg\:divide-y-0 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(0px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(0px * var(--divide-y-reverse)) !important; } .lg\:divide-x-0 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(0px * var(--divide-x-reverse)) !important; border-left-width: calc(0px * calc(1 - var(--divide-x-reverse))) !important; } .lg\:divide-y-2 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(2px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(2px * var(--divide-y-reverse)) !important; } .lg\:divide-x-2 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(2px * var(--divide-x-reverse)) !important; border-left-width: calc(2px * calc(1 - var(--divide-x-reverse))) !important; } .lg\:divide-y-4 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(4px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(4px * var(--divide-y-reverse)) !important; } .lg\:divide-x-4 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(4px * var(--divide-x-reverse)) !important; border-left-width: calc(4px * calc(1 - var(--divide-x-reverse))) !important; } .lg\:divide-y-8 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(8px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(8px * var(--divide-y-reverse)) !important; } .lg\:divide-x-8 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(8px * var(--divide-x-reverse)) !important; border-left-width: calc(8px * calc(1 - var(--divide-x-reverse))) !important; } .lg\:divide-y > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(1px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(1px * var(--divide-y-reverse)) !important; } .lg\:divide-x > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(1px * var(--divide-x-reverse)) !important; border-left-width: calc(1px * calc(1 - var(--divide-x-reverse))) !important; } .lg\:divide-y-reverse > :not(template) ~ :not(template) { --divide-y-reverse: 1 !important; } .lg\:divide-x-reverse > :not(template) ~ :not(template) { --divide-x-reverse: 1 !important; } .lg\:divide-current > :not(template) ~ :not(template) { border-color: currentColor !important; } .lg\:divide-transparent > :not(template) ~ :not(template) { border-color: transparent !important; } .lg\:divide-white > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFFFFF !important; border-color: rgba(255, 255, 255, var(--divide-opacity)) !important; } .lg\:divide-black > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #000000 !important; border-color: rgba(0, 0, 0, var(--divide-opacity)) !important; } .lg\:divide-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F9FAFB !important; border-color: rgba(249, 250, 251, var(--divide-opacity)) !important; } .lg\:divide-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F4F5F7 !important; border-color: rgba(244, 245, 247, var(--divide-opacity)) !important; } .lg\:divide-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5E7EB !important; border-color: rgba(229, 231, 235, var(--divide-opacity)) !important; } .lg\:divide-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D2D6DC !important; border-color: rgba(210, 214, 220, var(--divide-opacity)) !important; } .lg\:divide-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9FA6B2 !important; border-color: rgba(159, 166, 178, var(--divide-opacity)) !important; } .lg\:divide-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .lg\:divide-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4B5563 !important; border-color: rgba(75, 85, 99, var(--divide-opacity)) !important; } .lg\:divide-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #374151 !important; border-color: rgba(55, 65, 81, var(--divide-opacity)) !important; } .lg\:divide-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #252F3F !important; border-color: rgba(37, 47, 63, var(--divide-opacity)) !important; } .lg\:divide-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #161E2E !important; border-color: rgba(22, 30, 46, var(--divide-opacity)) !important; } .lg\:divide-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .lg\:divide-cool-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBFDFE !important; border-color: rgba(251, 253, 254, var(--divide-opacity)) !important; } .lg\:divide-cool-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F1F5F9 !important; border-color: rgba(241, 245, 249, var(--divide-opacity)) !important; } .lg\:divide-cool-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E2E8F0 !important; border-color: rgba(226, 232, 240, var(--divide-opacity)) !important; } .lg\:divide-cool-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CFD8E3 !important; border-color: rgba(207, 216, 227, var(--divide-opacity)) !important; } .lg\:divide-cool-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #97A6BA !important; border-color: rgba(151, 166, 186, var(--divide-opacity)) !important; } .lg\:divide-cool-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .lg\:divide-cool-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #475569 !important; border-color: rgba(71, 85, 105, var(--divide-opacity)) !important; } .lg\:divide-cool-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #364152 !important; border-color: rgba(54, 65, 82, var(--divide-opacity)) !important; } .lg\:divide-cool-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #27303F !important; border-color: rgba(39, 48, 63, var(--divide-opacity)) !important; } .lg\:divide-cool-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A202E !important; border-color: rgba(26, 32, 46, var(--divide-opacity)) !important; } .lg\:divide-cool-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .lg\:divide-red-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F2 !important; border-color: rgba(253, 242, 242, var(--divide-opacity)) !important; } .lg\:divide-red-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDE8E8 !important; border-color: rgba(253, 232, 232, var(--divide-opacity)) !important; } .lg\:divide-red-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBD5D5 !important; border-color: rgba(251, 213, 213, var(--divide-opacity)) !important; } .lg\:divide-red-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4B4 !important; border-color: rgba(248, 180, 180, var(--divide-opacity)) !important; } .lg\:divide-red-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F98080 !important; border-color: rgba(249, 128, 128, var(--divide-opacity)) !important; } .lg\:divide-red-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .lg\:divide-red-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E02424 !important; border-color: rgba(224, 36, 36, var(--divide-opacity)) !important; } .lg\:divide-red-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C81E1E !important; border-color: rgba(200, 30, 30, var(--divide-opacity)) !important; } .lg\:divide-red-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9B1C1C !important; border-color: rgba(155, 28, 28, var(--divide-opacity)) !important; } .lg\:divide-red-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .lg\:divide-red > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .lg\:divide-orange-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFF8F1 !important; border-color: rgba(255, 248, 241, var(--divide-opacity)) !important; } .lg\:divide-orange-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FEECDC !important; border-color: rgba(254, 236, 220, var(--divide-opacity)) !important; } .lg\:divide-orange-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCD9BD !important; border-color: rgba(252, 217, 189, var(--divide-opacity)) !important; } .lg\:divide-orange-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDBA8C !important; border-color: rgba(253, 186, 140, var(--divide-opacity)) !important; } .lg\:divide-orange-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF8A4C !important; border-color: rgba(255, 138, 76, var(--divide-opacity)) !important; } .lg\:divide-orange-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .lg\:divide-orange-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D03801 !important; border-color: rgba(208, 56, 1, var(--divide-opacity)) !important; } .lg\:divide-orange-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B43403 !important; border-color: rgba(180, 52, 3, var(--divide-opacity)) !important; } .lg\:divide-orange-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8A2C0D !important; border-color: rgba(138, 44, 13, var(--divide-opacity)) !important; } .lg\:divide-orange-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .lg\:divide-orange > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .lg\:divide-yellow-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDFDEA !important; border-color: rgba(253, 253, 234, var(--divide-opacity)) !important; } .lg\:divide-yellow-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF6B2 !important; border-color: rgba(253, 246, 178, var(--divide-opacity)) !important; } .lg\:divide-yellow-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE96A !important; border-color: rgba(252, 233, 106, var(--divide-opacity)) !important; } .lg\:divide-yellow-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FACA15 !important; border-color: rgba(250, 202, 21, var(--divide-opacity)) !important; } .lg\:divide-yellow-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E3A008 !important; border-color: rgba(227, 160, 8, var(--divide-opacity)) !important; } .lg\:divide-yellow-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .lg\:divide-yellow-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9F580A !important; border-color: rgba(159, 88, 10, var(--divide-opacity)) !important; } .lg\:divide-yellow-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8E4B10 !important; border-color: rgba(142, 75, 16, var(--divide-opacity)) !important; } .lg\:divide-yellow-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #723B13 !important; border-color: rgba(114, 59, 19, var(--divide-opacity)) !important; } .lg\:divide-yellow-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #633112 !important; border-color: rgba(99, 49, 18, var(--divide-opacity)) !important; } .lg\:divide-yellow > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .lg\:divide-green-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F3FAF7 !important; border-color: rgba(243, 250, 247, var(--divide-opacity)) !important; } .lg\:divide-green-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DEF7EC !important; border-color: rgba(222, 247, 236, var(--divide-opacity)) !important; } .lg\:divide-green-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BCF0DA !important; border-color: rgba(188, 240, 218, var(--divide-opacity)) !important; } .lg\:divide-green-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #84E1BC !important; border-color: rgba(132, 225, 188, var(--divide-opacity)) !important; } .lg\:divide-green-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #31C48D !important; border-color: rgba(49, 196, 141, var(--divide-opacity)) !important; } .lg\:divide-green-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .lg\:divide-green-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #057A55 !important; border-color: rgba(5, 122, 85, var(--divide-opacity)) !important; } .lg\:divide-green-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #046C4E !important; border-color: rgba(4, 108, 78, var(--divide-opacity)) !important; } .lg\:divide-green-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #03543F !important; border-color: rgba(3, 84, 63, var(--divide-opacity)) !important; } .lg\:divide-green-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014737 !important; border-color: rgba(1, 71, 55, var(--divide-opacity)) !important; } .lg\:divide-green > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .lg\:divide-teal-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDFAFA !important; border-color: rgba(237, 250, 250, var(--divide-opacity)) !important; } .lg\:divide-teal-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D5F5F6 !important; border-color: rgba(213, 245, 246, var(--divide-opacity)) !important; } .lg\:divide-teal-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AFECEF !important; border-color: rgba(175, 236, 239, var(--divide-opacity)) !important; } .lg\:divide-teal-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7EDCE2 !important; border-color: rgba(126, 220, 226, var(--divide-opacity)) !important; } .lg\:divide-teal-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #16BDCA !important; border-color: rgba(22, 189, 202, var(--divide-opacity)) !important; } .lg\:divide-teal-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .lg\:divide-teal-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #047481 !important; border-color: rgba(4, 116, 129, var(--divide-opacity)) !important; } .lg\:divide-teal-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #036672 !important; border-color: rgba(3, 102, 114, var(--divide-opacity)) !important; } .lg\:divide-teal-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #05505C !important; border-color: rgba(5, 80, 92, var(--divide-opacity)) !important; } .lg\:divide-teal-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014451 !important; border-color: rgba(1, 68, 81, var(--divide-opacity)) !important; } .lg\:divide-teal > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .lg\:divide-blue-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EBF5FF !important; border-color: rgba(235, 245, 255, var(--divide-opacity)) !important; } .lg\:divide-blue-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E1EFFE !important; border-color: rgba(225, 239, 254, var(--divide-opacity)) !important; } .lg\:divide-blue-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C3DDFD !important; border-color: rgba(195, 221, 253, var(--divide-opacity)) !important; } .lg\:divide-blue-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #A4CAFE !important; border-color: rgba(164, 202, 254, var(--divide-opacity)) !important; } .lg\:divide-blue-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #76A9FA !important; border-color: rgba(118, 169, 250, var(--divide-opacity)) !important; } .lg\:divide-blue-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .lg\:divide-blue-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1C64F2 !important; border-color: rgba(28, 100, 242, var(--divide-opacity)) !important; } .lg\:divide-blue-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A56DB !important; border-color: rgba(26, 86, 219, var(--divide-opacity)) !important; } .lg\:divide-blue-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1E429F !important; border-color: rgba(30, 66, 159, var(--divide-opacity)) !important; } .lg\:divide-blue-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #233876 !important; border-color: rgba(35, 56, 118, var(--divide-opacity)) !important; } .lg\:divide-blue > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .lg\:divide-indigo-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F0F5FF !important; border-color: rgba(240, 245, 255, var(--divide-opacity)) !important; } .lg\:divide-indigo-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5EDFF !important; border-color: rgba(229, 237, 255, var(--divide-opacity)) !important; } .lg\:divide-indigo-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CDDBFE !important; border-color: rgba(205, 219, 254, var(--divide-opacity)) !important; } .lg\:divide-indigo-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B4C6FC !important; border-color: rgba(180, 198, 252, var(--divide-opacity)) !important; } .lg\:divide-indigo-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8DA2FB !important; border-color: rgba(141, 162, 251, var(--divide-opacity)) !important; } .lg\:divide-indigo-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .lg\:divide-indigo-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5850EC !important; border-color: rgba(88, 80, 236, var(--divide-opacity)) !important; } .lg\:divide-indigo-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5145CD !important; border-color: rgba(81, 69, 205, var(--divide-opacity)) !important; } .lg\:divide-indigo-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #42389D !important; border-color: rgba(66, 56, 157, var(--divide-opacity)) !important; } .lg\:divide-indigo-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #362F78 !important; border-color: rgba(54, 47, 120, var(--divide-opacity)) !important; } .lg\:divide-indigo > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .lg\:divide-purple-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F6F5FF !important; border-color: rgba(246, 245, 255, var(--divide-opacity)) !important; } .lg\:divide-purple-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDEBFE !important; border-color: rgba(237, 235, 254, var(--divide-opacity)) !important; } .lg\:divide-purple-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DCD7FE !important; border-color: rgba(220, 215, 254, var(--divide-opacity)) !important; } .lg\:divide-purple-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CABFFD !important; border-color: rgba(202, 191, 253, var(--divide-opacity)) !important; } .lg\:divide-purple-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AC94FA !important; border-color: rgba(172, 148, 250, var(--divide-opacity)) !important; } .lg\:divide-purple-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .lg\:divide-purple-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7E3AF2 !important; border-color: rgba(126, 58, 242, var(--divide-opacity)) !important; } .lg\:divide-purple-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6C2BD9 !important; border-color: rgba(108, 43, 217, var(--divide-opacity)) !important; } .lg\:divide-purple-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5521B5 !important; border-color: rgba(85, 33, 181, var(--divide-opacity)) !important; } .lg\:divide-purple-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4A1D96 !important; border-color: rgba(74, 29, 150, var(--divide-opacity)) !important; } .lg\:divide-purple > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .lg\:divide-pink-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F8 !important; border-color: rgba(253, 242, 248, var(--divide-opacity)) !important; } .lg\:divide-pink-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE8F3 !important; border-color: rgba(252, 232, 243, var(--divide-opacity)) !important; } .lg\:divide-pink-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FAD1E8 !important; border-color: rgba(250, 209, 232, var(--divide-opacity)) !important; } .lg\:divide-pink-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4D9 !important; border-color: rgba(248, 180, 217, var(--divide-opacity)) !important; } .lg\:divide-pink-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F17EB8 !important; border-color: rgba(241, 126, 184, var(--divide-opacity)) !important; } .lg\:divide-pink-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .lg\:divide-pink-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D61F69 !important; border-color: rgba(214, 31, 105, var(--divide-opacity)) !important; } .lg\:divide-pink-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BF125D !important; border-color: rgba(191, 18, 93, var(--divide-opacity)) !important; } .lg\:divide-pink-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #99154B !important; border-color: rgba(153, 21, 75, var(--divide-opacity)) !important; } .lg\:divide-pink-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #751A3D !important; border-color: rgba(117, 26, 61, var(--divide-opacity)) !important; } .lg\:divide-pink > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .lg\:divide-opacity-0 > :not(template) ~ :not(template) { --divide-opacity: 0 !important; } .lg\:divide-opacity-12 > :not(template) ~ :not(template) { --divide-opacity: 0.12 !important; } .lg\:divide-opacity-25 > :not(template) ~ :not(template) { --divide-opacity: 0.25 !important; } .lg\:divide-opacity-38 > :not(template) ~ :not(template) { --divide-opacity: 0.38 !important; } .lg\:divide-opacity-50 > :not(template) ~ :not(template) { --divide-opacity: 0.5 !important; } .lg\:divide-opacity-54 > :not(template) ~ :not(template) { --divide-opacity: 0.54 !important; } .lg\:divide-opacity-70 > :not(template) ~ :not(template) { --divide-opacity: 0.70 !important; } .lg\:divide-opacity-75 > :not(template) ~ :not(template) { --divide-opacity: 0.75 !important; } .lg\:divide-opacity-84 > :not(template) ~ :not(template) { --divide-opacity: 0.84 !important; } .lg\:divide-opacity-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; } .lg\:sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .lg\:not-sr-only { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .lg\:focus\:sr-only:focus { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .lg\:focus\:not-sr-only:focus { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .lg\:appearance-none { -webkit-appearance: none !important; -moz-appearance: none !important; appearance: none !important; } .lg\:bg-fixed { background-attachment: fixed !important; } .lg\:bg-local { background-attachment: local !important; } .lg\:bg-scroll { background-attachment: scroll !important; } .lg\:bg-opacity-0 { --bg-opacity: 0 !important; } .lg\:bg-opacity-12 { --bg-opacity: 0.12 !important; } .lg\:bg-opacity-25 { --bg-opacity: 0.25 !important; } .lg\:bg-opacity-38 { --bg-opacity: 0.38 !important; } .lg\:bg-opacity-50 { --bg-opacity: 0.5 !important; } .lg\:bg-opacity-54 { --bg-opacity: 0.54 !important; } .lg\:bg-opacity-70 { --bg-opacity: 0.70 !important; } .lg\:bg-opacity-75 { --bg-opacity: 0.75 !important; } .lg\:bg-opacity-84 { --bg-opacity: 0.84 !important; } .lg\:bg-opacity-100 { --bg-opacity: 1 !important; } .lg\:hover\:bg-opacity-0:hover { --bg-opacity: 0 !important; } .lg\:hover\:bg-opacity-12:hover { --bg-opacity: 0.12 !important; } .lg\:hover\:bg-opacity-25:hover { --bg-opacity: 0.25 !important; } .lg\:hover\:bg-opacity-38:hover { --bg-opacity: 0.38 !important; } .lg\:hover\:bg-opacity-50:hover { --bg-opacity: 0.5 !important; } .lg\:hover\:bg-opacity-54:hover { --bg-opacity: 0.54 !important; } .lg\:hover\:bg-opacity-70:hover { --bg-opacity: 0.70 !important; } .lg\:hover\:bg-opacity-75:hover { --bg-opacity: 0.75 !important; } .lg\:hover\:bg-opacity-84:hover { --bg-opacity: 0.84 !important; } .lg\:hover\:bg-opacity-100:hover { --bg-opacity: 1 !important; } .lg\:focus\:bg-opacity-0:focus { --bg-opacity: 0 !important; } .lg\:focus\:bg-opacity-12:focus { --bg-opacity: 0.12 !important; } .lg\:focus\:bg-opacity-25:focus { --bg-opacity: 0.25 !important; } .lg\:focus\:bg-opacity-38:focus { --bg-opacity: 0.38 !important; } .lg\:focus\:bg-opacity-50:focus { --bg-opacity: 0.5 !important; } .lg\:focus\:bg-opacity-54:focus { --bg-opacity: 0.54 !important; } .lg\:focus\:bg-opacity-70:focus { --bg-opacity: 0.70 !important; } .lg\:focus\:bg-opacity-75:focus { --bg-opacity: 0.75 !important; } .lg\:focus\:bg-opacity-84:focus { --bg-opacity: 0.84 !important; } .lg\:focus\:bg-opacity-100:focus { --bg-opacity: 1 !important; } .lg\:bg-bottom { background-position: bottom !important; } .lg\:bg-center { background-position: center !important; } .lg\:bg-left { background-position: left !important; } .lg\:bg-left-bottom { background-position: left bottom !important; } .lg\:bg-left-top { background-position: left top !important; } .lg\:bg-right { background-position: right !important; } .lg\:bg-right-bottom { background-position: right bottom !important; } .lg\:bg-right-top { background-position: right top !important; } .lg\:bg-top { background-position: top !important; } .lg\:bg-repeat { background-repeat: repeat !important; } .lg\:bg-no-repeat { background-repeat: no-repeat !important; } .lg\:bg-repeat-x { background-repeat: repeat-x !important; } .lg\:bg-repeat-y { background-repeat: repeat-y !important; } .lg\:bg-repeat-round { background-repeat: round !important; } .lg\:bg-repeat-space { background-repeat: space !important; } .lg\:bg-auto { background-size: auto !important; } .lg\:bg-cover { background-size: cover !important; } .lg\:bg-contain { background-size: contain !important; } .lg\:border-collapse { border-collapse: collapse !important; } .lg\:border-separate { border-collapse: separate !important; } .lg\:border-opacity-0 { --border-opacity: 0 !important; } .lg\:border-opacity-12 { --border-opacity: 0.12 !important; } .lg\:border-opacity-25 { --border-opacity: 0.25 !important; } .lg\:border-opacity-38 { --border-opacity: 0.38 !important; } .lg\:border-opacity-50 { --border-opacity: 0.5 !important; } .lg\:border-opacity-54 { --border-opacity: 0.54 !important; } .lg\:border-opacity-70 { --border-opacity: 0.70 !important; } .lg\:border-opacity-75 { --border-opacity: 0.75 !important; } .lg\:border-opacity-84 { --border-opacity: 0.84 !important; } .lg\:border-opacity-100 { --border-opacity: 1 !important; } .lg\:hover\:border-opacity-0:hover { --border-opacity: 0 !important; } .lg\:hover\:border-opacity-12:hover { --border-opacity: 0.12 !important; } .lg\:hover\:border-opacity-25:hover { --border-opacity: 0.25 !important; } .lg\:hover\:border-opacity-38:hover { --border-opacity: 0.38 !important; } .lg\:hover\:border-opacity-50:hover { --border-opacity: 0.5 !important; } .lg\:hover\:border-opacity-54:hover { --border-opacity: 0.54 !important; } .lg\:hover\:border-opacity-70:hover { --border-opacity: 0.70 !important; } .lg\:hover\:border-opacity-75:hover { --border-opacity: 0.75 !important; } .lg\:hover\:border-opacity-84:hover { --border-opacity: 0.84 !important; } .lg\:hover\:border-opacity-100:hover { --border-opacity: 1 !important; } .lg\:focus\:border-opacity-0:focus { --border-opacity: 0 !important; } .lg\:focus\:border-opacity-12:focus { --border-opacity: 0.12 !important; } .lg\:focus\:border-opacity-25:focus { --border-opacity: 0.25 !important; } .lg\:focus\:border-opacity-38:focus { --border-opacity: 0.38 !important; } .lg\:focus\:border-opacity-50:focus { --border-opacity: 0.5 !important; } .lg\:focus\:border-opacity-54:focus { --border-opacity: 0.54 !important; } .lg\:focus\:border-opacity-70:focus { --border-opacity: 0.70 !important; } .lg\:focus\:border-opacity-75:focus { --border-opacity: 0.75 !important; } .lg\:focus\:border-opacity-84:focus { --border-opacity: 0.84 !important; } .lg\:focus\:border-opacity-100:focus { --border-opacity: 1 !important; } .lg\:rounded-none { border-radius: 0 !important; } .lg\:rounded-sm { border-radius: 0.125rem !important; } .lg\:rounded { border-radius: 0.25rem !important; } .lg\:rounded-md { border-radius: 0.375rem !important; } .lg\:rounded-lg { border-radius: 0.5rem !important; } .lg\:rounded-full { border-radius: 9999px !important; } .lg\:rounded-t-none { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } .lg\:rounded-r-none { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } .lg\:rounded-b-none { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } .lg\:rounded-l-none { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; } .lg\:rounded-t-sm { border-top-left-radius: 0.125rem !important; border-top-right-radius: 0.125rem !important; } .lg\:rounded-r-sm { border-top-right-radius: 0.125rem !important; border-bottom-right-radius: 0.125rem !important; } .lg\:rounded-b-sm { border-bottom-right-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .lg\:rounded-l-sm { border-top-left-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .lg\:rounded-t { border-top-left-radius: 0.25rem !important; border-top-right-radius: 0.25rem !important; } .lg\:rounded-r { border-top-right-radius: 0.25rem !important; border-bottom-right-radius: 0.25rem !important; } .lg\:rounded-b { border-bottom-right-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .lg\:rounded-l { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .lg\:rounded-t-md { border-top-left-radius: 0.375rem !important; border-top-right-radius: 0.375rem !important; } .lg\:rounded-r-md { border-top-right-radius: 0.375rem !important; border-bottom-right-radius: 0.375rem !important; } .lg\:rounded-b-md { border-bottom-right-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .lg\:rounded-l-md { border-top-left-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .lg\:rounded-t-lg { border-top-left-radius: 0.5rem !important; border-top-right-radius: 0.5rem !important; } .lg\:rounded-r-lg { border-top-right-radius: 0.5rem !important; border-bottom-right-radius: 0.5rem !important; } .lg\:rounded-b-lg { border-bottom-right-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .lg\:rounded-l-lg { border-top-left-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .lg\:rounded-t-full { border-top-left-radius: 9999px !important; border-top-right-radius: 9999px !important; } .lg\:rounded-r-full { border-top-right-radius: 9999px !important; border-bottom-right-radius: 9999px !important; } .lg\:rounded-b-full { border-bottom-right-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .lg\:rounded-l-full { border-top-left-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .lg\:rounded-tl-none { border-top-left-radius: 0 !important; } .lg\:rounded-tr-none { border-top-right-radius: 0 !important; } .lg\:rounded-br-none { border-bottom-right-radius: 0 !important; } .lg\:rounded-bl-none { border-bottom-left-radius: 0 !important; } .lg\:rounded-tl-sm { border-top-left-radius: 0.125rem !important; } .lg\:rounded-tr-sm { border-top-right-radius: 0.125rem !important; } .lg\:rounded-br-sm { border-bottom-right-radius: 0.125rem !important; } .lg\:rounded-bl-sm { border-bottom-left-radius: 0.125rem !important; } .lg\:rounded-tl { border-top-left-radius: 0.25rem !important; } .lg\:rounded-tr { border-top-right-radius: 0.25rem !important; } .lg\:rounded-br { border-bottom-right-radius: 0.25rem !important; } .lg\:rounded-bl { border-bottom-left-radius: 0.25rem !important; } .lg\:rounded-tl-md { border-top-left-radius: 0.375rem !important; } .lg\:rounded-tr-md { border-top-right-radius: 0.375rem !important; } .lg\:rounded-br-md { border-bottom-right-radius: 0.375rem !important; } .lg\:rounded-bl-md { border-bottom-left-radius: 0.375rem !important; } .lg\:rounded-tl-lg { border-top-left-radius: 0.5rem !important; } .lg\:rounded-tr-lg { border-top-right-radius: 0.5rem !important; } .lg\:rounded-br-lg { border-bottom-right-radius: 0.5rem !important; } .lg\:rounded-bl-lg { border-bottom-left-radius: 0.5rem !important; } .lg\:rounded-tl-full { border-top-left-radius: 9999px !important; } .lg\:rounded-tr-full { border-top-right-radius: 9999px !important; } .lg\:rounded-br-full { border-bottom-right-radius: 9999px !important; } .lg\:rounded-bl-full { border-bottom-left-radius: 9999px !important; } .lg\:border-solid { border-style: solid !important; } .lg\:border-dashed { border-style: dashed !important; } .lg\:border-dotted { border-style: dotted !important; } .lg\:border-double { border-style: double !important; } .lg\:border-none { border-style: none !important; } .lg\:border-0 { border-width: 0 !important; } .lg\:border-2 { border-width: 2px !important; } .lg\:border-4 { border-width: 4px !important; } .lg\:border-8 { border-width: 8px !important; } .lg\:border { border-width: 1px !important; } .lg\:border-t-0 { border-top-width: 0 !important; } .lg\:border-r-0 { border-right-width: 0 !important; } .lg\:border-b-0 { border-bottom-width: 0 !important; } .lg\:border-l-0 { border-left-width: 0 !important; } .lg\:border-t-2 { border-top-width: 2px !important; } .lg\:border-r-2 { border-right-width: 2px !important; } .lg\:border-b-2 { border-bottom-width: 2px !important; } .lg\:border-l-2 { border-left-width: 2px !important; } .lg\:border-t-4 { border-top-width: 4px !important; } .lg\:border-r-4 { border-right-width: 4px !important; } .lg\:border-b-4 { border-bottom-width: 4px !important; } .lg\:border-l-4 { border-left-width: 4px !important; } .lg\:border-t-8 { border-top-width: 8px !important; } .lg\:border-r-8 { border-right-width: 8px !important; } .lg\:border-b-8 { border-bottom-width: 8px !important; } .lg\:border-l-8 { border-left-width: 8px !important; } .lg\:border-t { border-top-width: 1px !important; } .lg\:border-r { border-right-width: 1px !important; } .lg\:border-b { border-bottom-width: 1px !important; } .lg\:border-l { border-left-width: 1px !important; } .lg\:first\:border-0:first-child { border-width: 0 !important; } .lg\:first\:border-2:first-child { border-width: 2px !important; } .lg\:first\:border-4:first-child { border-width: 4px !important; } .lg\:first\:border-8:first-child { border-width: 8px !important; } .lg\:first\:border:first-child { border-width: 1px !important; } .lg\:first\:border-t-0:first-child { border-top-width: 0 !important; } .lg\:first\:border-r-0:first-child { border-right-width: 0 !important; } .lg\:first\:border-b-0:first-child { border-bottom-width: 0 !important; } .lg\:first\:border-l-0:first-child { border-left-width: 0 !important; } .lg\:first\:border-t-2:first-child { border-top-width: 2px !important; } .lg\:first\:border-r-2:first-child { border-right-width: 2px !important; } .lg\:first\:border-b-2:first-child { border-bottom-width: 2px !important; } .lg\:first\:border-l-2:first-child { border-left-width: 2px !important; } .lg\:first\:border-t-4:first-child { border-top-width: 4px !important; } .lg\:first\:border-r-4:first-child { border-right-width: 4px !important; } .lg\:first\:border-b-4:first-child { border-bottom-width: 4px !important; } .lg\:first\:border-l-4:first-child { border-left-width: 4px !important; } .lg\:first\:border-t-8:first-child { border-top-width: 8px !important; } .lg\:first\:border-r-8:first-child { border-right-width: 8px !important; } .lg\:first\:border-b-8:first-child { border-bottom-width: 8px !important; } .lg\:first\:border-l-8:first-child { border-left-width: 8px !important; } .lg\:first\:border-t:first-child { border-top-width: 1px !important; } .lg\:first\:border-r:first-child { border-right-width: 1px !important; } .lg\:first\:border-b:first-child { border-bottom-width: 1px !important; } .lg\:first\:border-l:first-child { border-left-width: 1px !important; } .lg\:last\:border-0:last-child { border-width: 0 !important; } .lg\:last\:border-2:last-child { border-width: 2px !important; } .lg\:last\:border-4:last-child { border-width: 4px !important; } .lg\:last\:border-8:last-child { border-width: 8px !important; } .lg\:last\:border:last-child { border-width: 1px !important; } .lg\:last\:border-t-0:last-child { border-top-width: 0 !important; } .lg\:last\:border-r-0:last-child { border-right-width: 0 !important; } .lg\:last\:border-b-0:last-child { border-bottom-width: 0 !important; } .lg\:last\:border-l-0:last-child { border-left-width: 0 !important; } .lg\:last\:border-t-2:last-child { border-top-width: 2px !important; } .lg\:last\:border-r-2:last-child { border-right-width: 2px !important; } .lg\:last\:border-b-2:last-child { border-bottom-width: 2px !important; } .lg\:last\:border-l-2:last-child { border-left-width: 2px !important; } .lg\:last\:border-t-4:last-child { border-top-width: 4px !important; } .lg\:last\:border-r-4:last-child { border-right-width: 4px !important; } .lg\:last\:border-b-4:last-child { border-bottom-width: 4px !important; } .lg\:last\:border-l-4:last-child { border-left-width: 4px !important; } .lg\:last\:border-t-8:last-child { border-top-width: 8px !important; } .lg\:last\:border-r-8:last-child { border-right-width: 8px !important; } .lg\:last\:border-b-8:last-child { border-bottom-width: 8px !important; } .lg\:last\:border-l-8:last-child { border-left-width: 8px !important; } .lg\:last\:border-t:last-child { border-top-width: 1px !important; } .lg\:last\:border-r:last-child { border-right-width: 1px !important; } .lg\:last\:border-b:last-child { border-bottom-width: 1px !important; } .lg\:last\:border-l:last-child { border-left-width: 1px !important; } .lg\:box-border { box-sizing: border-box !important; } .lg\:box-content { box-sizing: content-box !important; } .lg\:block { display: block !important; } .lg\:inline-block { display: inline-block !important; } .lg\:inline { display: inline !important; } .lg\:flex { display: flex !important; } .lg\:inline-flex { display: inline-flex !important; } .lg\:table { display: table !important; } .lg\:table-caption { display: table-caption !important; } .lg\:table-cell { display: table-cell !important; } .lg\:table-column { display: table-column !important; } .lg\:table-column-group { display: table-column-group !important; } .lg\:table-footer-group { display: table-footer-group !important; } .lg\:table-header-group { display: table-header-group !important; } .lg\:table-row-group { display: table-row-group !important; } .lg\:table-row { display: table-row !important; } .lg\:flow-root { display: flow-root !important; } .lg\:grid { display: grid !important; } .lg\:inline-grid { display: inline-grid !important; } .lg\:hidden { display: none !important; } .lg\:flex-row { flex-direction: row !important; } .lg\:flex-row-reverse { flex-direction: row-reverse !important; } .lg\:flex-col { flex-direction: column !important; } .lg\:flex-col-reverse { flex-direction: column-reverse !important; } .lg\:flex-wrap { flex-wrap: wrap !important; } .lg\:flex-wrap-reverse { flex-wrap: wrap-reverse !important; } .lg\:flex-no-wrap { flex-wrap: nowrap !important; } .lg\:items-start { align-items: flex-start !important; } .lg\:items-end { align-items: flex-end !important; } .lg\:items-center { align-items: center !important; } .lg\:items-baseline { align-items: baseline !important; } .lg\:items-stretch { align-items: stretch !important; } .lg\:self-auto { align-self: auto !important; } .lg\:self-start { align-self: flex-start !important; } .lg\:self-end { align-self: flex-end !important; } .lg\:self-center { align-self: center !important; } .lg\:self-stretch { align-self: stretch !important; } .lg\:justify-start { justify-content: flex-start !important; } .lg\:justify-end { justify-content: flex-end !important; } .lg\:justify-center { justify-content: center !important; } .lg\:justify-between { justify-content: space-between !important; } .lg\:justify-around { justify-content: space-around !important; } .lg\:justify-evenly { justify-content: space-evenly !important; } .lg\:content-center { align-content: center !important; } .lg\:content-start { align-content: flex-start !important; } .lg\:content-end { align-content: flex-end !important; } .lg\:content-between { align-content: space-between !important; } .lg\:content-around { align-content: space-around !important; } .lg\:flex-0 { flex: 0 0 auto !important; } .lg\:flex-1 { flex: 1 1 0% !important; } .lg\:flex-auto { flex: 1 1 auto !important; } .lg\:flex-initial { flex: 0 1 auto !important; } .lg\:flex-none { flex: none !important; } .lg\:flex-grow-0 { flex-grow: 0 !important; } .lg\:flex-grow { flex-grow: 1 !important; } .lg\:flex-shrink-0 { flex-shrink: 0 !important; } .lg\:flex-shrink { flex-shrink: 1 !important; } .lg\:order-1 { order: 1 !important; } .lg\:order-2 { order: 2 !important; } .lg\:order-3 { order: 3 !important; } .lg\:order-4 { order: 4 !important; } .lg\:order-5 { order: 5 !important; } .lg\:order-6 { order: 6 !important; } .lg\:order-7 { order: 7 !important; } .lg\:order-8 { order: 8 !important; } .lg\:order-9 { order: 9 !important; } .lg\:order-10 { order: 10 !important; } .lg\:order-11 { order: 11 !important; } .lg\:order-12 { order: 12 !important; } .lg\:order-first { order: -9999 !important; } .lg\:order-last { order: 9999 !important; } .lg\:order-none { order: 0 !important; } .lg\:font-hairline { font-weight: 100 !important; } .lg\:font-thin { font-weight: 200 !important; } .lg\:font-light { font-weight: 300 !important; } .lg\:font-normal { font-weight: 400 !important; } .lg\:font-medium { font-weight: 500 !important; } .lg\:font-semibold { font-weight: 600 !important; } .lg\:font-bold { font-weight: 700 !important; } .lg\:font-extrabold { font-weight: 800 !important; } .lg\:font-black { font-weight: 900 !important; } .lg\:h-0 { height: 0 !important; } .lg\:h-1 { height: 0.25rem !important; } .lg\:h-2 { height: 0.5rem !important; } .lg\:h-3 { height: 0.75rem !important; } .lg\:h-4 { height: 1rem !important; } .lg\:h-5 { height: 1.25rem !important; } .lg\:h-6 { height: 1.5rem !important; } .lg\:h-8 { height: 2rem !important; } .lg\:h-10 { height: 2.5rem !important; } .lg\:h-12 { height: 3rem !important; } .lg\:h-14 { height: 3.5rem !important; } .lg\:h-16 { height: 4rem !important; } .lg\:h-18 { height: 4.5rem !important; } .lg\:h-20 { height: 5rem !important; } .lg\:h-22 { height: 5.5rem !important; } .lg\:h-24 { height: 6rem !important; } .lg\:h-26 { height: 6.5rem !important; } .lg\:h-28 { height: 7rem !important; } .lg\:h-30 { height: 7.5rem !important; } .lg\:h-32 { height: 8rem !important; } .lg\:h-36 { height: 9rem !important; } .lg\:h-40 { height: 10rem !important; } .lg\:h-48 { height: 12rem !important; } .lg\:h-50 { height: 12.5rem !important; } .lg\:h-56 { height: 14rem !important; } .lg\:h-60 { height: 15rem !important; } .lg\:h-64 { height: 16rem !important; } .lg\:h-80 { height: 20rem !important; } .lg\:h-90 { height: 24rem !important; } .lg\:h-100 { height: 25rem !important; } .lg\:h-120 { height: 30rem !important; } .lg\:h-128 { height: 32rem !important; } .lg\:h-140 { height: 35rem !important; } .lg\:h-160 { height: 40rem !important; } .lg\:h-180 { height: 45rem !important; } .lg\:h-192 { height: 48rem !important; } .lg\:h-200 { height: 50rem !important; } .lg\:h-240 { height: 60rem !important; } .lg\:h-256 { height: 64rem !important; } .lg\:h-280 { height: 70rem !important; } .lg\:h-320 { height: 80rem !important; } .lg\:h-360 { height: 90rem !important; } .lg\:h-400 { height: 100rem !important; } .lg\:h-480 { height: 120rem !important; } .lg\:h-auto { height: auto !important; } .lg\:h-px { height: 1px !important; } .lg\:h-2px { height: 2px !important; } .lg\:h-full { height: 100% !important; } .lg\:h-screen { height: 100vh !important; } .lg\:h-1\/2 { height: 50% !important; } .lg\:h-1\/3 { height: 33.33333% !important; } .lg\:h-2\/3 { height: 66.66667% !important; } .lg\:h-1\/4 { height: 25% !important; } .lg\:h-2\/4 { height: 50% !important; } .lg\:h-3\/4 { height: 75% !important; } .lg\:h-1\/5 { height: 20% !important; } .lg\:h-2\/5 { height: 40% !important; } .lg\:h-3\/5 { height: 60% !important; } .lg\:h-4\/5 { height: 80% !important; } .lg\:h-1\/12 { height: 8.33333% !important; } .lg\:h-2\/12 { height: 16.66667% !important; } .lg\:h-3\/12 { height: 25% !important; } .lg\:h-4\/12 { height: 33.33333% !important; } .lg\:h-5\/12 { height: 41.66667% !important; } .lg\:h-6\/12 { height: 50% !important; } .lg\:h-7\/12 { height: 58.33333% !important; } .lg\:h-8\/12 { height: 66.66667% !important; } .lg\:h-9\/12 { height: 75% !important; } .lg\:h-10\/12 { height: 83.33333% !important; } .lg\:h-11\/12 { height: 91.66667% !important; } .lg\:text-xs { font-size: 0.625rem !important; } .lg\:text-sm { font-size: 0.75rem !important; } .lg\:text-md { font-size: 0.8125rem !important; } .lg\:text-base { font-size: 0.875rem !important; } .lg\:text-lg { font-size: 1rem !important; } .lg\:text-xl { font-size: 1.125rem !important; } .lg\:text-2xl { font-size: 1.25rem !important; } .lg\:text-3xl { font-size: 1.5rem !important; } .lg\:text-4xl { font-size: 2rem !important; } .lg\:text-5xl { font-size: 2.25rem !important; } .lg\:text-6xl { font-size: 2.5rem !important; } .lg\:text-7xl { font-size: 3rem !important; } .lg\:text-8xl { font-size: 4rem !important; } .lg\:text-9xl { font-size: 6rem !important; } .lg\:text-10xl { font-size: 8rem !important; } .lg\:leading-3 { line-height: .75rem !important; } .lg\:leading-4 { line-height: 1rem !important; } .lg\:leading-5 { line-height: 1.25rem !important; } .lg\:leading-6 { line-height: 1.5rem !important; } .lg\:leading-7 { line-height: 1.75rem !important; } .lg\:leading-8 { line-height: 2rem !important; } .lg\:leading-9 { line-height: 2.25rem !important; } .lg\:leading-10 { line-height: 2.5rem !important; } .lg\:leading-none { line-height: 1 !important; } .lg\:leading-tight { line-height: 1.25 !important; } .lg\:leading-snug { line-height: 1.375 !important; } .lg\:leading-normal { line-height: 1.5 !important; } .lg\:leading-relaxed { line-height: 1.625 !important; } .lg\:leading-loose { line-height: 2 !important; } .lg\:list-inside { list-style-position: inside !important; } .lg\:list-outside { list-style-position: outside !important; } .lg\:list-none { list-style-type: none !important; } .lg\:list-disc { list-style-type: disc !important; } .lg\:list-decimal { list-style-type: decimal !important; } .lg\:m-0 { margin: 0 !important; } .lg\:m-1 { margin: 0.25rem !important; } .lg\:m-2 { margin: 0.5rem !important; } .lg\:m-3 { margin: 0.75rem !important; } .lg\:m-4 { margin: 1rem !important; } .lg\:m-5 { margin: 1.25rem !important; } .lg\:m-6 { margin: 1.5rem !important; } .lg\:m-8 { margin: 2rem !important; } .lg\:m-10 { margin: 2.5rem !important; } .lg\:m-12 { margin: 3rem !important; } .lg\:m-14 { margin: 3.5rem !important; } .lg\:m-16 { margin: 4rem !important; } .lg\:m-18 { margin: 4.5rem !important; } .lg\:m-20 { margin: 5rem !important; } .lg\:m-22 { margin: 5.5rem !important; } .lg\:m-24 { margin: 6rem !important; } .lg\:m-26 { margin: 6.5rem !important; } .lg\:m-28 { margin: 7rem !important; } .lg\:m-30 { margin: 7.5rem !important; } .lg\:m-32 { margin: 8rem !important; } .lg\:m-36 { margin: 9rem !important; } .lg\:m-40 { margin: 10rem !important; } .lg\:m-48 { margin: 12rem !important; } .lg\:m-56 { margin: 14rem !important; } .lg\:m-64 { margin: 16rem !important; } .lg\:m-auto { margin: auto !important; } .lg\:m-px { margin: 1px !important; } .lg\:m-2px { margin: 2px !important; } .lg\:-m-1 { margin: -0.25rem !important; } .lg\:-m-2 { margin: -0.5rem !important; } .lg\:-m-3 { margin: -0.75rem !important; } .lg\:-m-4 { margin: -1rem !important; } .lg\:-m-5 { margin: -1.25rem !important; } .lg\:-m-6 { margin: -1.5rem !important; } .lg\:-m-8 { margin: -2rem !important; } .lg\:-m-10 { margin: -2.5rem !important; } .lg\:-m-12 { margin: -3rem !important; } .lg\:-m-14 { margin: -3.5rem !important; } .lg\:-m-16 { margin: -4rem !important; } .lg\:-m-18 { margin: -4.5rem !important; } .lg\:-m-20 { margin: -5rem !important; } .lg\:-m-22 { margin: -5.5rem !important; } .lg\:-m-24 { margin: -6rem !important; } .lg\:-m-26 { margin: -6.5rem !important; } .lg\:-m-28 { margin: -7rem !important; } .lg\:-m-30 { margin: -7.5rem !important; } .lg\:-m-32 { margin: -8rem !important; } .lg\:-m-36 { margin: -9rem !important; } .lg\:-m-40 { margin: -10rem !important; } .lg\:-m-48 { margin: -12rem !important; } .lg\:-m-56 { margin: -14rem !important; } .lg\:-m-64 { margin: -16rem !important; } .lg\:-m-px { margin: -1px !important; } .lg\:-m-2px { margin: -2px !important; } .lg\:my-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .lg\:mx-0 { margin-left: 0 !important; margin-right: 0 !important; } .lg\:my-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .lg\:mx-1 { margin-left: 0.25rem !important; margin-right: 0.25rem !important; } .lg\:my-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .lg\:mx-2 { margin-left: 0.5rem !important; margin-right: 0.5rem !important; } .lg\:my-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .lg\:mx-3 { margin-left: 0.75rem !important; margin-right: 0.75rem !important; } .lg\:my-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .lg\:mx-4 { margin-left: 1rem !important; margin-right: 1rem !important; } .lg\:my-5 { margin-top: 1.25rem !important; margin-bottom: 1.25rem !important; } .lg\:mx-5 { margin-left: 1.25rem !important; margin-right: 1.25rem !important; } .lg\:my-6 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .lg\:mx-6 { margin-left: 1.5rem !important; margin-right: 1.5rem !important; } .lg\:my-8 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .lg\:mx-8 { margin-left: 2rem !important; margin-right: 2rem !important; } .lg\:my-10 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .lg\:mx-10 { margin-left: 2.5rem !important; margin-right: 2.5rem !important; } .lg\:my-12 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .lg\:mx-12 { margin-left: 3rem !important; margin-right: 3rem !important; } .lg\:my-14 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .lg\:mx-14 { margin-left: 3.5rem !important; margin-right: 3.5rem !important; } .lg\:my-16 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .lg\:mx-16 { margin-left: 4rem !important; margin-right: 4rem !important; } .lg\:my-18 { margin-top: 4.5rem !important; margin-bottom: 4.5rem !important; } .lg\:mx-18 { margin-left: 4.5rem !important; margin-right: 4.5rem !important; } .lg\:my-20 { margin-top: 5rem !important; margin-bottom: 5rem !important; } .lg\:mx-20 { margin-left: 5rem !important; margin-right: 5rem !important; } .lg\:my-22 { margin-top: 5.5rem !important; margin-bottom: 5.5rem !important; } .lg\:mx-22 { margin-left: 5.5rem !important; margin-right: 5.5rem !important; } .lg\:my-24 { margin-top: 6rem !important; margin-bottom: 6rem !important; } .lg\:mx-24 { margin-left: 6rem !important; margin-right: 6rem !important; } .lg\:my-26 { margin-top: 6.5rem !important; margin-bottom: 6.5rem !important; } .lg\:mx-26 { margin-left: 6.5rem !important; margin-right: 6.5rem !important; } .lg\:my-28 { margin-top: 7rem !important; margin-bottom: 7rem !important; } .lg\:mx-28 { margin-left: 7rem !important; margin-right: 7rem !important; } .lg\:my-30 { margin-top: 7.5rem !important; margin-bottom: 7.5rem !important; } .lg\:mx-30 { margin-left: 7.5rem !important; margin-right: 7.5rem !important; } .lg\:my-32 { margin-top: 8rem !important; margin-bottom: 8rem !important; } .lg\:mx-32 { margin-left: 8rem !important; margin-right: 8rem !important; } .lg\:my-36 { margin-top: 9rem !important; margin-bottom: 9rem !important; } .lg\:mx-36 { margin-left: 9rem !important; margin-right: 9rem !important; } .lg\:my-40 { margin-top: 10rem !important; margin-bottom: 10rem !important; } .lg\:mx-40 { margin-left: 10rem !important; margin-right: 10rem !important; } .lg\:my-48 { margin-top: 12rem !important; margin-bottom: 12rem !important; } .lg\:mx-48 { margin-left: 12rem !important; margin-right: 12rem !important; } .lg\:my-56 { margin-top: 14rem !important; margin-bottom: 14rem !important; } .lg\:mx-56 { margin-left: 14rem !important; margin-right: 14rem !important; } .lg\:my-64 { margin-top: 16rem !important; margin-bottom: 16rem !important; } .lg\:mx-64 { margin-left: 16rem !important; margin-right: 16rem !important; } .lg\:my-auto { margin-top: auto !important; margin-bottom: auto !important; } .lg\:mx-auto { margin-left: auto !important; margin-right: auto !important; } .lg\:my-px { margin-top: 1px !important; margin-bottom: 1px !important; } .lg\:mx-px { margin-left: 1px !important; margin-right: 1px !important; } .lg\:my-2px { margin-top: 2px !important; margin-bottom: 2px !important; } .lg\:mx-2px { margin-left: 2px !important; margin-right: 2px !important; } .lg\:-my-1 { margin-top: -0.25rem !important; margin-bottom: -0.25rem !important; } .lg\:-mx-1 { margin-left: -0.25rem !important; margin-right: -0.25rem !important; } .lg\:-my-2 { margin-top: -0.5rem !important; margin-bottom: -0.5rem !important; } .lg\:-mx-2 { margin-left: -0.5rem !important; margin-right: -0.5rem !important; } .lg\:-my-3 { margin-top: -0.75rem !important; margin-bottom: -0.75rem !important; } .lg\:-mx-3 { margin-left: -0.75rem !important; margin-right: -0.75rem !important; } .lg\:-my-4 { margin-top: -1rem !important; margin-bottom: -1rem !important; } .lg\:-mx-4 { margin-left: -1rem !important; margin-right: -1rem !important; } .lg\:-my-5 { margin-top: -1.25rem !important; margin-bottom: -1.25rem !important; } .lg\:-mx-5 { margin-left: -1.25rem !important; margin-right: -1.25rem !important; } .lg\:-my-6 { margin-top: -1.5rem !important; margin-bottom: -1.5rem !important; } .lg\:-mx-6 { margin-left: -1.5rem !important; margin-right: -1.5rem !important; } .lg\:-my-8 { margin-top: -2rem !important; margin-bottom: -2rem !important; } .lg\:-mx-8 { margin-left: -2rem !important; margin-right: -2rem !important; } .lg\:-my-10 { margin-top: -2.5rem !important; margin-bottom: -2.5rem !important; } .lg\:-mx-10 { margin-left: -2.5rem !important; margin-right: -2.5rem !important; } .lg\:-my-12 { margin-top: -3rem !important; margin-bottom: -3rem !important; } .lg\:-mx-12 { margin-left: -3rem !important; margin-right: -3rem !important; } .lg\:-my-14 { margin-top: -3.5rem !important; margin-bottom: -3.5rem !important; } .lg\:-mx-14 { margin-left: -3.5rem !important; margin-right: -3.5rem !important; } .lg\:-my-16 { margin-top: -4rem !important; margin-bottom: -4rem !important; } .lg\:-mx-16 { margin-left: -4rem !important; margin-right: -4rem !important; } .lg\:-my-18 { margin-top: -4.5rem !important; margin-bottom: -4.5rem !important; } .lg\:-mx-18 { margin-left: -4.5rem !important; margin-right: -4.5rem !important; } .lg\:-my-20 { margin-top: -5rem !important; margin-bottom: -5rem !important; } .lg\:-mx-20 { margin-left: -5rem !important; margin-right: -5rem !important; } .lg\:-my-22 { margin-top: -5.5rem !important; margin-bottom: -5.5rem !important; } .lg\:-mx-22 { margin-left: -5.5rem !important; margin-right: -5.5rem !important; } .lg\:-my-24 { margin-top: -6rem !important; margin-bottom: -6rem !important; } .lg\:-mx-24 { margin-left: -6rem !important; margin-right: -6rem !important; } .lg\:-my-26 { margin-top: -6.5rem !important; margin-bottom: -6.5rem !important; } .lg\:-mx-26 { margin-left: -6.5rem !important; margin-right: -6.5rem !important; } .lg\:-my-28 { margin-top: -7rem !important; margin-bottom: -7rem !important; } .lg\:-mx-28 { margin-left: -7rem !important; margin-right: -7rem !important; } .lg\:-my-30 { margin-top: -7.5rem !important; margin-bottom: -7.5rem !important; } .lg\:-mx-30 { margin-left: -7.5rem !important; margin-right: -7.5rem !important; } .lg\:-my-32 { margin-top: -8rem !important; margin-bottom: -8rem !important; } .lg\:-mx-32 { margin-left: -8rem !important; margin-right: -8rem !important; } .lg\:-my-36 { margin-top: -9rem !important; margin-bottom: -9rem !important; } .lg\:-mx-36 { margin-left: -9rem !important; margin-right: -9rem !important; } .lg\:-my-40 { margin-top: -10rem !important; margin-bottom: -10rem !important; } .lg\:-mx-40 { margin-left: -10rem !important; margin-right: -10rem !important; } .lg\:-my-48 { margin-top: -12rem !important; margin-bottom: -12rem !important; } .lg\:-mx-48 { margin-left: -12rem !important; margin-right: -12rem !important; } .lg\:-my-56 { margin-top: -14rem !important; margin-bottom: -14rem !important; } .lg\:-mx-56 { margin-left: -14rem !important; margin-right: -14rem !important; } .lg\:-my-64 { margin-top: -16rem !important; margin-bottom: -16rem !important; } .lg\:-mx-64 { margin-left: -16rem !important; margin-right: -16rem !important; } .lg\:-my-px { margin-top: -1px !important; margin-bottom: -1px !important; } .lg\:-mx-px { margin-left: -1px !important; margin-right: -1px !important; } .lg\:-my-2px { margin-top: -2px !important; margin-bottom: -2px !important; } .lg\:-mx-2px { margin-left: -2px !important; margin-right: -2px !important; } .lg\:mt-0 { margin-top: 0 !important; } .lg\:mr-0 { margin-right: 0 !important; } .lg\:mb-0 { margin-bottom: 0 !important; } .lg\:ml-0 { margin-left: 0 !important; } .lg\:mt-1 { margin-top: 0.25rem !important; } .lg\:mr-1 { margin-right: 0.25rem !important; } .lg\:mb-1 { margin-bottom: 0.25rem !important; } .lg\:ml-1 { margin-left: 0.25rem !important; } .lg\:mt-2 { margin-top: 0.5rem !important; } .lg\:mr-2 { margin-right: 0.5rem !important; } .lg\:mb-2 { margin-bottom: 0.5rem !important; } .lg\:ml-2 { margin-left: 0.5rem !important; } .lg\:mt-3 { margin-top: 0.75rem !important; } .lg\:mr-3 { margin-right: 0.75rem !important; } .lg\:mb-3 { margin-bottom: 0.75rem !important; } .lg\:ml-3 { margin-left: 0.75rem !important; } .lg\:mt-4 { margin-top: 1rem !important; } .lg\:mr-4 { margin-right: 1rem !important; } .lg\:mb-4 { margin-bottom: 1rem !important; } .lg\:ml-4 { margin-left: 1rem !important; } .lg\:mt-5 { margin-top: 1.25rem !important; } .lg\:mr-5 { margin-right: 1.25rem !important; } .lg\:mb-5 { margin-bottom: 1.25rem !important; } .lg\:ml-5 { margin-left: 1.25rem !important; } .lg\:mt-6 { margin-top: 1.5rem !important; } .lg\:mr-6 { margin-right: 1.5rem !important; } .lg\:mb-6 { margin-bottom: 1.5rem !important; } .lg\:ml-6 { margin-left: 1.5rem !important; } .lg\:mt-8 { margin-top: 2rem !important; } .lg\:mr-8 { margin-right: 2rem !important; } .lg\:mb-8 { margin-bottom: 2rem !important; } .lg\:ml-8 { margin-left: 2rem !important; } .lg\:mt-10 { margin-top: 2.5rem !important; } .lg\:mr-10 { margin-right: 2.5rem !important; } .lg\:mb-10 { margin-bottom: 2.5rem !important; } .lg\:ml-10 { margin-left: 2.5rem !important; } .lg\:mt-12 { margin-top: 3rem !important; } .lg\:mr-12 { margin-right: 3rem !important; } .lg\:mb-12 { margin-bottom: 3rem !important; } .lg\:ml-12 { margin-left: 3rem !important; } .lg\:mt-14 { margin-top: 3.5rem !important; } .lg\:mr-14 { margin-right: 3.5rem !important; } .lg\:mb-14 { margin-bottom: 3.5rem !important; } .lg\:ml-14 { margin-left: 3.5rem !important; } .lg\:mt-16 { margin-top: 4rem !important; } .lg\:mr-16 { margin-right: 4rem !important; } .lg\:mb-16 { margin-bottom: 4rem !important; } .lg\:ml-16 { margin-left: 4rem !important; } .lg\:mt-18 { margin-top: 4.5rem !important; } .lg\:mr-18 { margin-right: 4.5rem !important; } .lg\:mb-18 { margin-bottom: 4.5rem !important; } .lg\:ml-18 { margin-left: 4.5rem !important; } .lg\:mt-20 { margin-top: 5rem !important; } .lg\:mr-20 { margin-right: 5rem !important; } .lg\:mb-20 { margin-bottom: 5rem !important; } .lg\:ml-20 { margin-left: 5rem !important; } .lg\:mt-22 { margin-top: 5.5rem !important; } .lg\:mr-22 { margin-right: 5.5rem !important; } .lg\:mb-22 { margin-bottom: 5.5rem !important; } .lg\:ml-22 { margin-left: 5.5rem !important; } .lg\:mt-24 { margin-top: 6rem !important; } .lg\:mr-24 { margin-right: 6rem !important; } .lg\:mb-24 { margin-bottom: 6rem !important; } .lg\:ml-24 { margin-left: 6rem !important; } .lg\:mt-26 { margin-top: 6.5rem !important; } .lg\:mr-26 { margin-right: 6.5rem !important; } .lg\:mb-26 { margin-bottom: 6.5rem !important; } .lg\:ml-26 { margin-left: 6.5rem !important; } .lg\:mt-28 { margin-top: 7rem !important; } .lg\:mr-28 { margin-right: 7rem !important; } .lg\:mb-28 { margin-bottom: 7rem !important; } .lg\:ml-28 { margin-left: 7rem !important; } .lg\:mt-30 { margin-top: 7.5rem !important; } .lg\:mr-30 { margin-right: 7.5rem !important; } .lg\:mb-30 { margin-bottom: 7.5rem !important; } .lg\:ml-30 { margin-left: 7.5rem !important; } .lg\:mt-32 { margin-top: 8rem !important; } .lg\:mr-32 { margin-right: 8rem !important; } .lg\:mb-32 { margin-bottom: 8rem !important; } .lg\:ml-32 { margin-left: 8rem !important; } .lg\:mt-36 { margin-top: 9rem !important; } .lg\:mr-36 { margin-right: 9rem !important; } .lg\:mb-36 { margin-bottom: 9rem !important; } .lg\:ml-36 { margin-left: 9rem !important; } .lg\:mt-40 { margin-top: 10rem !important; } .lg\:mr-40 { margin-right: 10rem !important; } .lg\:mb-40 { margin-bottom: 10rem !important; } .lg\:ml-40 { margin-left: 10rem !important; } .lg\:mt-48 { margin-top: 12rem !important; } .lg\:mr-48 { margin-right: 12rem !important; } .lg\:mb-48 { margin-bottom: 12rem !important; } .lg\:ml-48 { margin-left: 12rem !important; } .lg\:mt-56 { margin-top: 14rem !important; } .lg\:mr-56 { margin-right: 14rem !important; } .lg\:mb-56 { margin-bottom: 14rem !important; } .lg\:ml-56 { margin-left: 14rem !important; } .lg\:mt-64 { margin-top: 16rem !important; } .lg\:mr-64 { margin-right: 16rem !important; } .lg\:mb-64 { margin-bottom: 16rem !important; } .lg\:ml-64 { margin-left: 16rem !important; } .lg\:mt-auto { margin-top: auto !important; } .lg\:mr-auto { margin-right: auto !important; } .lg\:mb-auto { margin-bottom: auto !important; } .lg\:ml-auto { margin-left: auto !important; } .lg\:mt-px { margin-top: 1px !important; } .lg\:mr-px { margin-right: 1px !important; } .lg\:mb-px { margin-bottom: 1px !important; } .lg\:ml-px { margin-left: 1px !important; } .lg\:mt-2px { margin-top: 2px !important; } .lg\:mr-2px { margin-right: 2px !important; } .lg\:mb-2px { margin-bottom: 2px !important; } .lg\:ml-2px { margin-left: 2px !important; } .lg\:-mt-1 { margin-top: -0.25rem !important; } .lg\:-mr-1 { margin-right: -0.25rem !important; } .lg\:-mb-1 { margin-bottom: -0.25rem !important; } .lg\:-ml-1 { margin-left: -0.25rem !important; } .lg\:-mt-2 { margin-top: -0.5rem !important; } .lg\:-mr-2 { margin-right: -0.5rem !important; } .lg\:-mb-2 { margin-bottom: -0.5rem !important; } .lg\:-ml-2 { margin-left: -0.5rem !important; } .lg\:-mt-3 { margin-top: -0.75rem !important; } .lg\:-mr-3 { margin-right: -0.75rem !important; } .lg\:-mb-3 { margin-bottom: -0.75rem !important; } .lg\:-ml-3 { margin-left: -0.75rem !important; } .lg\:-mt-4 { margin-top: -1rem !important; } .lg\:-mr-4 { margin-right: -1rem !important; } .lg\:-mb-4 { margin-bottom: -1rem !important; } .lg\:-ml-4 { margin-left: -1rem !important; } .lg\:-mt-5 { margin-top: -1.25rem !important; } .lg\:-mr-5 { margin-right: -1.25rem !important; } .lg\:-mb-5 { margin-bottom: -1.25rem !important; } .lg\:-ml-5 { margin-left: -1.25rem !important; } .lg\:-mt-6 { margin-top: -1.5rem !important; } .lg\:-mr-6 { margin-right: -1.5rem !important; } .lg\:-mb-6 { margin-bottom: -1.5rem !important; } .lg\:-ml-6 { margin-left: -1.5rem !important; } .lg\:-mt-8 { margin-top: -2rem !important; } .lg\:-mr-8 { margin-right: -2rem !important; } .lg\:-mb-8 { margin-bottom: -2rem !important; } .lg\:-ml-8 { margin-left: -2rem !important; } .lg\:-mt-10 { margin-top: -2.5rem !important; } .lg\:-mr-10 { margin-right: -2.5rem !important; } .lg\:-mb-10 { margin-bottom: -2.5rem !important; } .lg\:-ml-10 { margin-left: -2.5rem !important; } .lg\:-mt-12 { margin-top: -3rem !important; } .lg\:-mr-12 { margin-right: -3rem !important; } .lg\:-mb-12 { margin-bottom: -3rem !important; } .lg\:-ml-12 { margin-left: -3rem !important; } .lg\:-mt-14 { margin-top: -3.5rem !important; } .lg\:-mr-14 { margin-right: -3.5rem !important; } .lg\:-mb-14 { margin-bottom: -3.5rem !important; } .lg\:-ml-14 { margin-left: -3.5rem !important; } .lg\:-mt-16 { margin-top: -4rem !important; } .lg\:-mr-16 { margin-right: -4rem !important; } .lg\:-mb-16 { margin-bottom: -4rem !important; } .lg\:-ml-16 { margin-left: -4rem !important; } .lg\:-mt-18 { margin-top: -4.5rem !important; } .lg\:-mr-18 { margin-right: -4.5rem !important; } .lg\:-mb-18 { margin-bottom: -4.5rem !important; } .lg\:-ml-18 { margin-left: -4.5rem !important; } .lg\:-mt-20 { margin-top: -5rem !important; } .lg\:-mr-20 { margin-right: -5rem !important; } .lg\:-mb-20 { margin-bottom: -5rem !important; } .lg\:-ml-20 { margin-left: -5rem !important; } .lg\:-mt-22 { margin-top: -5.5rem !important; } .lg\:-mr-22 { margin-right: -5.5rem !important; } .lg\:-mb-22 { margin-bottom: -5.5rem !important; } .lg\:-ml-22 { margin-left: -5.5rem !important; } .lg\:-mt-24 { margin-top: -6rem !important; } .lg\:-mr-24 { margin-right: -6rem !important; } .lg\:-mb-24 { margin-bottom: -6rem !important; } .lg\:-ml-24 { margin-left: -6rem !important; } .lg\:-mt-26 { margin-top: -6.5rem !important; } .lg\:-mr-26 { margin-right: -6.5rem !important; } .lg\:-mb-26 { margin-bottom: -6.5rem !important; } .lg\:-ml-26 { margin-left: -6.5rem !important; } .lg\:-mt-28 { margin-top: -7rem !important; } .lg\:-mr-28 { margin-right: -7rem !important; } .lg\:-mb-28 { margin-bottom: -7rem !important; } .lg\:-ml-28 { margin-left: -7rem !important; } .lg\:-mt-30 { margin-top: -7.5rem !important; } .lg\:-mr-30 { margin-right: -7.5rem !important; } .lg\:-mb-30 { margin-bottom: -7.5rem !important; } .lg\:-ml-30 { margin-left: -7.5rem !important; } .lg\:-mt-32 { margin-top: -8rem !important; } .lg\:-mr-32 { margin-right: -8rem !important; } .lg\:-mb-32 { margin-bottom: -8rem !important; } .lg\:-ml-32 { margin-left: -8rem !important; } .lg\:-mt-36 { margin-top: -9rem !important; } .lg\:-mr-36 { margin-right: -9rem !important; } .lg\:-mb-36 { margin-bottom: -9rem !important; } .lg\:-ml-36 { margin-left: -9rem !important; } .lg\:-mt-40 { margin-top: -10rem !important; } .lg\:-mr-40 { margin-right: -10rem !important; } .lg\:-mb-40 { margin-bottom: -10rem !important; } .lg\:-ml-40 { margin-left: -10rem !important; } .lg\:-mt-48 { margin-top: -12rem !important; } .lg\:-mr-48 { margin-right: -12rem !important; } .lg\:-mb-48 { margin-bottom: -12rem !important; } .lg\:-ml-48 { margin-left: -12rem !important; } .lg\:-mt-56 { margin-top: -14rem !important; } .lg\:-mr-56 { margin-right: -14rem !important; } .lg\:-mb-56 { margin-bottom: -14rem !important; } .lg\:-ml-56 { margin-left: -14rem !important; } .lg\:-mt-64 { margin-top: -16rem !important; } .lg\:-mr-64 { margin-right: -16rem !important; } .lg\:-mb-64 { margin-bottom: -16rem !important; } .lg\:-ml-64 { margin-left: -16rem !important; } .lg\:-mt-px { margin-top: -1px !important; } .lg\:-mr-px { margin-right: -1px !important; } .lg\:-mb-px { margin-bottom: -1px !important; } .lg\:-ml-px { margin-left: -1px !important; } .lg\:-mt-2px { margin-top: -2px !important; } .lg\:-mr-2px { margin-right: -2px !important; } .lg\:-mb-2px { margin-bottom: -2px !important; } .lg\:-ml-2px { margin-left: -2px !important; } .lg\:max-h-0 { max-height: 0 !important; } .lg\:max-h-1 { max-height: 0.25rem !important; } .lg\:max-h-2 { max-height: 0.5rem !important; } .lg\:max-h-3 { max-height: 0.75rem !important; } .lg\:max-h-4 { max-height: 1rem !important; } .lg\:max-h-5 { max-height: 1.25rem !important; } .lg\:max-h-6 { max-height: 1.5rem !important; } .lg\:max-h-8 { max-height: 2rem !important; } .lg\:max-h-10 { max-height: 2.5rem !important; } .lg\:max-h-12 { max-height: 3rem !important; } .lg\:max-h-14 { max-height: 3.5rem !important; } .lg\:max-h-16 { max-height: 4rem !important; } .lg\:max-h-18 { max-height: 4.5rem !important; } .lg\:max-h-20 { max-height: 5rem !important; } .lg\:max-h-22 { max-height: 5.5rem !important; } .lg\:max-h-24 { max-height: 6rem !important; } .lg\:max-h-26 { max-height: 6.5rem !important; } .lg\:max-h-28 { max-height: 7rem !important; } .lg\:max-h-30 { max-height: 7.5rem !important; } .lg\:max-h-32 { max-height: 8rem !important; } .lg\:max-h-36 { max-height: 9rem !important; } .lg\:max-h-40 { max-height: 10rem !important; } .lg\:max-h-48 { max-height: 12rem !important; } .lg\:max-h-50 { max-height: 12.5rem !important; } .lg\:max-h-56 { max-height: 14rem !important; } .lg\:max-h-60 { max-height: 15rem !important; } .lg\:max-h-64 { max-height: 16rem !important; } .lg\:max-h-80 { max-height: 20rem !important; } .lg\:max-h-90 { max-height: 24rem !important; } .lg\:max-h-100 { max-height: 25rem !important; } .lg\:max-h-120 { max-height: 30rem !important; } .lg\:max-h-128 { max-height: 32rem !important; } .lg\:max-h-140 { max-height: 35rem !important; } .lg\:max-h-160 { max-height: 40rem !important; } .lg\:max-h-180 { max-height: 45rem !important; } .lg\:max-h-192 { max-height: 48rem !important; } .lg\:max-h-200 { max-height: 50rem !important; } .lg\:max-h-240 { max-height: 60rem !important; } .lg\:max-h-256 { max-height: 64rem !important; } .lg\:max-h-280 { max-height: 70rem !important; } .lg\:max-h-320 { max-height: 80rem !important; } .lg\:max-h-360 { max-height: 90rem !important; } .lg\:max-h-400 { max-height: 100rem !important; } .lg\:max-h-480 { max-height: 120rem !important; } .lg\:max-h-full { max-height: 100% !important; } .lg\:max-h-screen { max-height: 100vh !important; } .lg\:max-h-none { max-height: none !important; } .lg\:max-h-px { max-height: 1px !important; } .lg\:max-h-2px { max-height: 2px !important; } .lg\:max-h-1\/2 { max-height: 50% !important; } .lg\:max-h-1\/3 { max-height: 33.33333% !important; } .lg\:max-h-2\/3 { max-height: 66.66667% !important; } .lg\:max-h-1\/4 { max-height: 25% !important; } .lg\:max-h-2\/4 { max-height: 50% !important; } .lg\:max-h-3\/4 { max-height: 75% !important; } .lg\:max-h-1\/5 { max-height: 20% !important; } .lg\:max-h-2\/5 { max-height: 40% !important; } .lg\:max-h-3\/5 { max-height: 60% !important; } .lg\:max-h-4\/5 { max-height: 80% !important; } .lg\:max-h-1\/12 { max-height: 8.33333% !important; } .lg\:max-h-2\/12 { max-height: 16.66667% !important; } .lg\:max-h-3\/12 { max-height: 25% !important; } .lg\:max-h-4\/12 { max-height: 33.33333% !important; } .lg\:max-h-5\/12 { max-height: 41.66667% !important; } .lg\:max-h-6\/12 { max-height: 50% !important; } .lg\:max-h-7\/12 { max-height: 58.33333% !important; } .lg\:max-h-8\/12 { max-height: 66.66667% !important; } .lg\:max-h-9\/12 { max-height: 75% !important; } .lg\:max-h-10\/12 { max-height: 83.33333% !important; } .lg\:max-h-11\/12 { max-height: 91.66667% !important; } .lg\:max-w-0 { max-width: 0 !important; } .lg\:max-w-1 { max-width: 0.25rem !important; } .lg\:max-w-2 { max-width: 0.5rem !important; } .lg\:max-w-3 { max-width: 0.75rem !important; } .lg\:max-w-4 { max-width: 1rem !important; } .lg\:max-w-5 { max-width: 1.25rem !important; } .lg\:max-w-6 { max-width: 1.5rem !important; } .lg\:max-w-8 { max-width: 2rem !important; } .lg\:max-w-10 { max-width: 2.5rem !important; } .lg\:max-w-12 { max-width: 3rem !important; } .lg\:max-w-14 { max-width: 3.5rem !important; } .lg\:max-w-16 { max-width: 4rem !important; } .lg\:max-w-18 { max-width: 4.5rem !important; } .lg\:max-w-20 { max-width: 5rem !important; } .lg\:max-w-22 { max-width: 5.5rem !important; } .lg\:max-w-24 { max-width: 6rem !important; } .lg\:max-w-26 { max-width: 6.5rem !important; } .lg\:max-w-28 { max-width: 7rem !important; } .lg\:max-w-30 { max-width: 7.5rem !important; } .lg\:max-w-32 { max-width: 8rem !important; } .lg\:max-w-36 { max-width: 9rem !important; } .lg\:max-w-40 { max-width: 10rem !important; } .lg\:max-w-48 { max-width: 12rem !important; } .lg\:max-w-50 { max-width: 12.5rem !important; } .lg\:max-w-56 { max-width: 14rem !important; } .lg\:max-w-60 { max-width: 15rem !important; } .lg\:max-w-64 { max-width: 16rem !important; } .lg\:max-w-80 { max-width: 20rem !important; } .lg\:max-w-90 { max-width: 24rem !important; } .lg\:max-w-100 { max-width: 25rem !important; } .lg\:max-w-120 { max-width: 30rem !important; } .lg\:max-w-128 { max-width: 32rem !important; } .lg\:max-w-140 { max-width: 35rem !important; } .lg\:max-w-160 { max-width: 40rem !important; } .lg\:max-w-180 { max-width: 45rem !important; } .lg\:max-w-192 { max-width: 48rem !important; } .lg\:max-w-200 { max-width: 50rem !important; } .lg\:max-w-240 { max-width: 60rem !important; } .lg\:max-w-256 { max-width: 64rem !important; } .lg\:max-w-280 { max-width: 70rem !important; } .lg\:max-w-320 { max-width: 80rem !important; } .lg\:max-w-360 { max-width: 90rem !important; } .lg\:max-w-400 { max-width: 100rem !important; } .lg\:max-w-480 { max-width: 120rem !important; } .lg\:max-w-none { max-width: none !important; } .lg\:max-w-xs { max-width: 20rem !important; } .lg\:max-w-sm { max-width: 24rem !important; } .lg\:max-w-md { max-width: 28rem !important; } .lg\:max-w-lg { max-width: 32rem !important; } .lg\:max-w-xl { max-width: 36rem !important; } .lg\:max-w-2xl { max-width: 42rem !important; } .lg\:max-w-3xl { max-width: 48rem !important; } .lg\:max-w-4xl { max-width: 56rem !important; } .lg\:max-w-5xl { max-width: 64rem !important; } .lg\:max-w-6xl { max-width: 72rem !important; } .lg\:max-w-full { max-width: 100% !important; } .lg\:max-w-screen { max-width: 100vw !important; } .lg\:max-w-px { max-width: 1px !important; } .lg\:max-w-2px { max-width: 2px !important; } .lg\:max-w-1\/2 { max-width: 50% !important; } .lg\:max-w-1\/3 { max-width: 33.33333% !important; } .lg\:max-w-2\/3 { max-width: 66.66667% !important; } .lg\:max-w-1\/4 { max-width: 25% !important; } .lg\:max-w-2\/4 { max-width: 50% !important; } .lg\:max-w-3\/4 { max-width: 75% !important; } .lg\:max-w-1\/5 { max-width: 20% !important; } .lg\:max-w-2\/5 { max-width: 40% !important; } .lg\:max-w-3\/5 { max-width: 60% !important; } .lg\:max-w-4\/5 { max-width: 80% !important; } .lg\:max-w-1\/12 { max-width: 8.33333% !important; } .lg\:max-w-2\/12 { max-width: 16.66667% !important; } .lg\:max-w-3\/12 { max-width: 25% !important; } .lg\:max-w-4\/12 { max-width: 33.33333% !important; } .lg\:max-w-5\/12 { max-width: 41.66667% !important; } .lg\:max-w-6\/12 { max-width: 50% !important; } .lg\:max-w-7\/12 { max-width: 58.33333% !important; } .lg\:max-w-8\/12 { max-width: 66.66667% !important; } .lg\:max-w-9\/12 { max-width: 75% !important; } .lg\:max-w-10\/12 { max-width: 83.33333% !important; } .lg\:max-w-11\/12 { max-width: 91.66667% !important; } .lg\:min-h-0 { min-height: 0 !important; } .lg\:min-h-1 { min-height: 0.25rem !important; } .lg\:min-h-2 { min-height: 0.5rem !important; } .lg\:min-h-3 { min-height: 0.75rem !important; } .lg\:min-h-4 { min-height: 1rem !important; } .lg\:min-h-5 { min-height: 1.25rem !important; } .lg\:min-h-6 { min-height: 1.5rem !important; } .lg\:min-h-8 { min-height: 2rem !important; } .lg\:min-h-10 { min-height: 2.5rem !important; } .lg\:min-h-12 { min-height: 3rem !important; } .lg\:min-h-14 { min-height: 3.5rem !important; } .lg\:min-h-16 { min-height: 4rem !important; } .lg\:min-h-18 { min-height: 4.5rem !important; } .lg\:min-h-20 { min-height: 5rem !important; } .lg\:min-h-22 { min-height: 5.5rem !important; } .lg\:min-h-24 { min-height: 6rem !important; } .lg\:min-h-26 { min-height: 6.5rem !important; } .lg\:min-h-28 { min-height: 7rem !important; } .lg\:min-h-30 { min-height: 7.5rem !important; } .lg\:min-h-32 { min-height: 8rem !important; } .lg\:min-h-36 { min-height: 9rem !important; } .lg\:min-h-40 { min-height: 10rem !important; } .lg\:min-h-48 { min-height: 12rem !important; } .lg\:min-h-50 { min-height: 12.5rem !important; } .lg\:min-h-56 { min-height: 14rem !important; } .lg\:min-h-60 { min-height: 15rem !important; } .lg\:min-h-64 { min-height: 16rem !important; } .lg\:min-h-80 { min-height: 20rem !important; } .lg\:min-h-90 { min-height: 24rem !important; } .lg\:min-h-100 { min-height: 25rem !important; } .lg\:min-h-120 { min-height: 30rem !important; } .lg\:min-h-128 { min-height: 32rem !important; } .lg\:min-h-140 { min-height: 35rem !important; } .lg\:min-h-160 { min-height: 40rem !important; } .lg\:min-h-180 { min-height: 45rem !important; } .lg\:min-h-192 { min-height: 48rem !important; } .lg\:min-h-200 { min-height: 50rem !important; } .lg\:min-h-240 { min-height: 60rem !important; } .lg\:min-h-256 { min-height: 64rem !important; } .lg\:min-h-280 { min-height: 70rem !important; } .lg\:min-h-320 { min-height: 80rem !important; } .lg\:min-h-360 { min-height: 90rem !important; } .lg\:min-h-400 { min-height: 100rem !important; } .lg\:min-h-480 { min-height: 120rem !important; } .lg\:min-h-full { min-height: 100% !important; } .lg\:min-h-screen { min-height: 100vh !important; } .lg\:min-h-px { min-height: 1px !important; } .lg\:min-h-2px { min-height: 2px !important; } .lg\:min-h-1\/2 { min-height: 50% !important; } .lg\:min-h-1\/3 { min-height: 33.33333% !important; } .lg\:min-h-2\/3 { min-height: 66.66667% !important; } .lg\:min-h-1\/4 { min-height: 25% !important; } .lg\:min-h-2\/4 { min-height: 50% !important; } .lg\:min-h-3\/4 { min-height: 75% !important; } .lg\:min-h-1\/5 { min-height: 20% !important; } .lg\:min-h-2\/5 { min-height: 40% !important; } .lg\:min-h-3\/5 { min-height: 60% !important; } .lg\:min-h-4\/5 { min-height: 80% !important; } .lg\:min-h-1\/12 { min-height: 8.33333% !important; } .lg\:min-h-2\/12 { min-height: 16.66667% !important; } .lg\:min-h-3\/12 { min-height: 25% !important; } .lg\:min-h-4\/12 { min-height: 33.33333% !important; } .lg\:min-h-5\/12 { min-height: 41.66667% !important; } .lg\:min-h-6\/12 { min-height: 50% !important; } .lg\:min-h-7\/12 { min-height: 58.33333% !important; } .lg\:min-h-8\/12 { min-height: 66.66667% !important; } .lg\:min-h-9\/12 { min-height: 75% !important; } .lg\:min-h-10\/12 { min-height: 83.33333% !important; } .lg\:min-h-11\/12 { min-height: 91.66667% !important; } .lg\:min-w-0 { min-width: 0 !important; } .lg\:min-w-1 { min-width: 0.25rem !important; } .lg\:min-w-2 { min-width: 0.5rem !important; } .lg\:min-w-3 { min-width: 0.75rem !important; } .lg\:min-w-4 { min-width: 1rem !important; } .lg\:min-w-5 { min-width: 1.25rem !important; } .lg\:min-w-6 { min-width: 1.5rem !important; } .lg\:min-w-8 { min-width: 2rem !important; } .lg\:min-w-10 { min-width: 2.5rem !important; } .lg\:min-w-12 { min-width: 3rem !important; } .lg\:min-w-14 { min-width: 3.5rem !important; } .lg\:min-w-16 { min-width: 4rem !important; } .lg\:min-w-18 { min-width: 4.5rem !important; } .lg\:min-w-20 { min-width: 5rem !important; } .lg\:min-w-22 { min-width: 5.5rem !important; } .lg\:min-w-24 { min-width: 6rem !important; } .lg\:min-w-26 { min-width: 6.5rem !important; } .lg\:min-w-28 { min-width: 7rem !important; } .lg\:min-w-30 { min-width: 7.5rem !important; } .lg\:min-w-32 { min-width: 8rem !important; } .lg\:min-w-36 { min-width: 9rem !important; } .lg\:min-w-40 { min-width: 10rem !important; } .lg\:min-w-48 { min-width: 12rem !important; } .lg\:min-w-50 { min-width: 12.5rem !important; } .lg\:min-w-56 { min-width: 14rem !important; } .lg\:min-w-60 { min-width: 15rem !important; } .lg\:min-w-64 { min-width: 16rem !important; } .lg\:min-w-80 { min-width: 20rem !important; } .lg\:min-w-90 { min-width: 24rem !important; } .lg\:min-w-100 { min-width: 25rem !important; } .lg\:min-w-120 { min-width: 30rem !important; } .lg\:min-w-128 { min-width: 32rem !important; } .lg\:min-w-140 { min-width: 35rem !important; } .lg\:min-w-160 { min-width: 40rem !important; } .lg\:min-w-180 { min-width: 45rem !important; } .lg\:min-w-192 { min-width: 48rem !important; } .lg\:min-w-200 { min-width: 50rem !important; } .lg\:min-w-240 { min-width: 60rem !important; } .lg\:min-w-256 { min-width: 64rem !important; } .lg\:min-w-280 { min-width: 70rem !important; } .lg\:min-w-320 { min-width: 80rem !important; } .lg\:min-w-360 { min-width: 90rem !important; } .lg\:min-w-400 { min-width: 100rem !important; } .lg\:min-w-480 { min-width: 120rem !important; } .lg\:min-w-full { min-width: 100% !important; } .lg\:min-w-screen { min-width: 100vw !important; } .lg\:min-w-px { min-width: 1px !important; } .lg\:min-w-2px { min-width: 2px !important; } .lg\:min-w-1\/2 { min-width: 50% !important; } .lg\:min-w-1\/3 { min-width: 33.33333% !important; } .lg\:min-w-2\/3 { min-width: 66.66667% !important; } .lg\:min-w-1\/4 { min-width: 25% !important; } .lg\:min-w-2\/4 { min-width: 50% !important; } .lg\:min-w-3\/4 { min-width: 75% !important; } .lg\:min-w-1\/5 { min-width: 20% !important; } .lg\:min-w-2\/5 { min-width: 40% !important; } .lg\:min-w-3\/5 { min-width: 60% !important; } .lg\:min-w-4\/5 { min-width: 80% !important; } .lg\:min-w-1\/12 { min-width: 8.33333% !important; } .lg\:min-w-2\/12 { min-width: 16.66667% !important; } .lg\:min-w-3\/12 { min-width: 25% !important; } .lg\:min-w-4\/12 { min-width: 33.33333% !important; } .lg\:min-w-5\/12 { min-width: 41.66667% !important; } .lg\:min-w-6\/12 { min-width: 50% !important; } .lg\:min-w-7\/12 { min-width: 58.33333% !important; } .lg\:min-w-8\/12 { min-width: 66.66667% !important; } .lg\:min-w-9\/12 { min-width: 75% !important; } .lg\:min-w-10\/12 { min-width: 83.33333% !important; } .lg\:min-w-11\/12 { min-width: 91.66667% !important; } .lg\:object-contain { -o-object-fit: contain !important; object-fit: contain !important; } .lg\:object-cover { -o-object-fit: cover !important; object-fit: cover !important; } .lg\:object-fill { -o-object-fit: fill !important; object-fit: fill !important; } .lg\:object-none { -o-object-fit: none !important; object-fit: none !important; } .lg\:object-scale-down { -o-object-fit: scale-down !important; object-fit: scale-down !important; } .lg\:object-bottom { -o-object-position: bottom !important; object-position: bottom !important; } .lg\:object-center { -o-object-position: center !important; object-position: center !important; } .lg\:object-left { -o-object-position: left !important; object-position: left !important; } .lg\:object-left-bottom { -o-object-position: left bottom !important; object-position: left bottom !important; } .lg\:object-left-top { -o-object-position: left top !important; object-position: left top !important; } .lg\:object-right { -o-object-position: right !important; object-position: right !important; } .lg\:object-right-bottom { -o-object-position: right bottom !important; object-position: right bottom !important; } .lg\:object-right-top { -o-object-position: right top !important; object-position: right top !important; } .lg\:object-top { -o-object-position: top !important; object-position: top !important; } .lg\:opacity-0 { opacity: 0 !important; } .lg\:opacity-12 { opacity: 0.12 !important; } .lg\:opacity-25 { opacity: 0.25 !important; } .lg\:opacity-38 { opacity: 0.38 !important; } .lg\:opacity-50 { opacity: 0.5 !important; } .lg\:opacity-54 { opacity: 0.54 !important; } .lg\:opacity-70 { opacity: 0.70 !important; } .lg\:opacity-75 { opacity: 0.75 !important; } .lg\:opacity-84 { opacity: 0.84 !important; } .lg\:opacity-100 { opacity: 1 !important; } .lg\:hover\:opacity-0:hover { opacity: 0 !important; } .lg\:hover\:opacity-12:hover { opacity: 0.12 !important; } .lg\:hover\:opacity-25:hover { opacity: 0.25 !important; } .lg\:hover\:opacity-38:hover { opacity: 0.38 !important; } .lg\:hover\:opacity-50:hover { opacity: 0.5 !important; } .lg\:hover\:opacity-54:hover { opacity: 0.54 !important; } .lg\:hover\:opacity-70:hover { opacity: 0.70 !important; } .lg\:hover\:opacity-75:hover { opacity: 0.75 !important; } .lg\:hover\:opacity-84:hover { opacity: 0.84 !important; } .lg\:hover\:opacity-100:hover { opacity: 1 !important; } .lg\:focus\:opacity-0:focus { opacity: 0 !important; } .lg\:focus\:opacity-12:focus { opacity: 0.12 !important; } .lg\:focus\:opacity-25:focus { opacity: 0.25 !important; } .lg\:focus\:opacity-38:focus { opacity: 0.38 !important; } .lg\:focus\:opacity-50:focus { opacity: 0.5 !important; } .lg\:focus\:opacity-54:focus { opacity: 0.54 !important; } .lg\:focus\:opacity-70:focus { opacity: 0.70 !important; } .lg\:focus\:opacity-75:focus { opacity: 0.75 !important; } .lg\:focus\:opacity-84:focus { opacity: 0.84 !important; } .lg\:focus\:opacity-100:focus { opacity: 1 !important; } .lg\:outline-none { outline: 0 !important; } .lg\:focus\:outline-none:focus { outline: 0 !important; } .lg\:overflow-auto { overflow: auto !important; } .lg\:overflow-hidden { overflow: hidden !important; } .lg\:overflow-visible { overflow: visible !important; } .lg\:overflow-scroll { overflow: scroll !important; } .lg\:overflow-x-auto { overflow-x: auto !important; } .lg\:overflow-y-auto { overflow-y: auto !important; } .lg\:overflow-x-hidden { overflow-x: hidden !important; } .lg\:overflow-y-hidden { overflow-y: hidden !important; } .lg\:overflow-x-visible { overflow-x: visible !important; } .lg\:overflow-y-visible { overflow-y: visible !important; } .lg\:overflow-x-scroll { overflow-x: scroll !important; } .lg\:overflow-y-scroll { overflow-y: scroll !important; } .lg\:scrolling-touch { -webkit-overflow-scrolling: touch !important; } .lg\:scrolling-auto { -webkit-overflow-scrolling: auto !important; } .lg\:p-0 { padding: 0 !important; } .lg\:p-1 { padding: 0.25rem !important; } .lg\:p-2 { padding: 0.5rem !important; } .lg\:p-3 { padding: 0.75rem !important; } .lg\:p-4 { padding: 1rem !important; } .lg\:p-5 { padding: 1.25rem !important; } .lg\:p-6 { padding: 1.5rem !important; } .lg\:p-8 { padding: 2rem !important; } .lg\:p-10 { padding: 2.5rem !important; } .lg\:p-12 { padding: 3rem !important; } .lg\:p-14 { padding: 3.5rem !important; } .lg\:p-16 { padding: 4rem !important; } .lg\:p-18 { padding: 4.5rem !important; } .lg\:p-20 { padding: 5rem !important; } .lg\:p-22 { padding: 5.5rem !important; } .lg\:p-24 { padding: 6rem !important; } .lg\:p-26 { padding: 6.5rem !important; } .lg\:p-28 { padding: 7rem !important; } .lg\:p-30 { padding: 7.5rem !important; } .lg\:p-32 { padding: 8rem !important; } .lg\:p-36 { padding: 9rem !important; } .lg\:p-40 { padding: 10rem !important; } .lg\:p-48 { padding: 12rem !important; } .lg\:p-56 { padding: 14rem !important; } .lg\:p-64 { padding: 16rem !important; } .lg\:p-px { padding: 1px !important; } .lg\:p-2px { padding: 2px !important; } .lg\:py-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .lg\:px-0 { padding-left: 0 !important; padding-right: 0 !important; } .lg\:py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .lg\:px-1 { padding-left: 0.25rem !important; padding-right: 0.25rem !important; } .lg\:py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .lg\:px-2 { padding-left: 0.5rem !important; padding-right: 0.5rem !important; } .lg\:py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .lg\:px-3 { padding-left: 0.75rem !important; padding-right: 0.75rem !important; } .lg\:py-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .lg\:px-4 { padding-left: 1rem !important; padding-right: 1rem !important; } .lg\:py-5 { padding-top: 1.25rem !important; padding-bottom: 1.25rem !important; } .lg\:px-5 { padding-left: 1.25rem !important; padding-right: 1.25rem !important; } .lg\:py-6 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .lg\:px-6 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } .lg\:py-8 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .lg\:px-8 { padding-left: 2rem !important; padding-right: 2rem !important; } .lg\:py-10 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .lg\:px-10 { padding-left: 2.5rem !important; padding-right: 2.5rem !important; } .lg\:py-12 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .lg\:px-12 { padding-left: 3rem !important; padding-right: 3rem !important; } .lg\:py-14 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .lg\:px-14 { padding-left: 3.5rem !important; padding-right: 3.5rem !important; } .lg\:py-16 { padding-top: 4rem !important; padding-bottom: 4rem !important; } .lg\:px-16 { padding-left: 4rem !important; padding-right: 4rem !important; } .lg\:py-18 { padding-top: 4.5rem !important; padding-bottom: 4.5rem !important; } .lg\:px-18 { padding-left: 4.5rem !important; padding-right: 4.5rem !important; } .lg\:py-20 { padding-top: 5rem !important; padding-bottom: 5rem !important; } .lg\:px-20 { padding-left: 5rem !important; padding-right: 5rem !important; } .lg\:py-22 { padding-top: 5.5rem !important; padding-bottom: 5.5rem !important; } .lg\:px-22 { padding-left: 5.5rem !important; padding-right: 5.5rem !important; } .lg\:py-24 { padding-top: 6rem !important; padding-bottom: 6rem !important; } .lg\:px-24 { padding-left: 6rem !important; padding-right: 6rem !important; } .lg\:py-26 { padding-top: 6.5rem !important; padding-bottom: 6.5rem !important; } .lg\:px-26 { padding-left: 6.5rem !important; padding-right: 6.5rem !important; } .lg\:py-28 { padding-top: 7rem !important; padding-bottom: 7rem !important; } .lg\:px-28 { padding-left: 7rem !important; padding-right: 7rem !important; } .lg\:py-30 { padding-top: 7.5rem !important; padding-bottom: 7.5rem !important; } .lg\:px-30 { padding-left: 7.5rem !important; padding-right: 7.5rem !important; } .lg\:py-32 { padding-top: 8rem !important; padding-bottom: 8rem !important; } .lg\:px-32 { padding-left: 8rem !important; padding-right: 8rem !important; } .lg\:py-36 { padding-top: 9rem !important; padding-bottom: 9rem !important; } .lg\:px-36 { padding-left: 9rem !important; padding-right: 9rem !important; } .lg\:py-40 { padding-top: 10rem !important; padding-bottom: 10rem !important; } .lg\:px-40 { padding-left: 10rem !important; padding-right: 10rem !important; } .lg\:py-48 { padding-top: 12rem !important; padding-bottom: 12rem !important; } .lg\:px-48 { padding-left: 12rem !important; padding-right: 12rem !important; } .lg\:py-56 { padding-top: 14rem !important; padding-bottom: 14rem !important; } .lg\:px-56 { padding-left: 14rem !important; padding-right: 14rem !important; } .lg\:py-64 { padding-top: 16rem !important; padding-bottom: 16rem !important; } .lg\:px-64 { padding-left: 16rem !important; padding-right: 16rem !important; } .lg\:py-px { padding-top: 1px !important; padding-bottom: 1px !important; } .lg\:px-px { padding-left: 1px !important; padding-right: 1px !important; } .lg\:py-2px { padding-top: 2px !important; padding-bottom: 2px !important; } .lg\:px-2px { padding-left: 2px !important; padding-right: 2px !important; } .lg\:pt-0 { padding-top: 0 !important; } .lg\:pr-0 { padding-right: 0 !important; } .lg\:pb-0 { padding-bottom: 0 !important; } .lg\:pl-0 { padding-left: 0 !important; } .lg\:pt-1 { padding-top: 0.25rem !important; } .lg\:pr-1 { padding-right: 0.25rem !important; } .lg\:pb-1 { padding-bottom: 0.25rem !important; } .lg\:pl-1 { padding-left: 0.25rem !important; } .lg\:pt-2 { padding-top: 0.5rem !important; } .lg\:pr-2 { padding-right: 0.5rem !important; } .lg\:pb-2 { padding-bottom: 0.5rem !important; } .lg\:pl-2 { padding-left: 0.5rem !important; } .lg\:pt-3 { padding-top: 0.75rem !important; } .lg\:pr-3 { padding-right: 0.75rem !important; } .lg\:pb-3 { padding-bottom: 0.75rem !important; } .lg\:pl-3 { padding-left: 0.75rem !important; } .lg\:pt-4 { padding-top: 1rem !important; } .lg\:pr-4 { padding-right: 1rem !important; } .lg\:pb-4 { padding-bottom: 1rem !important; } .lg\:pl-4 { padding-left: 1rem !important; } .lg\:pt-5 { padding-top: 1.25rem !important; } .lg\:pr-5 { padding-right: 1.25rem !important; } .lg\:pb-5 { padding-bottom: 1.25rem !important; } .lg\:pl-5 { padding-left: 1.25rem !important; } .lg\:pt-6 { padding-top: 1.5rem !important; } .lg\:pr-6 { padding-right: 1.5rem !important; } .lg\:pb-6 { padding-bottom: 1.5rem !important; } .lg\:pl-6 { padding-left: 1.5rem !important; } .lg\:pt-8 { padding-top: 2rem !important; } .lg\:pr-8 { padding-right: 2rem !important; } .lg\:pb-8 { padding-bottom: 2rem !important; } .lg\:pl-8 { padding-left: 2rem !important; } .lg\:pt-10 { padding-top: 2.5rem !important; } .lg\:pr-10 { padding-right: 2.5rem !important; } .lg\:pb-10 { padding-bottom: 2.5rem !important; } .lg\:pl-10 { padding-left: 2.5rem !important; } .lg\:pt-12 { padding-top: 3rem !important; } .lg\:pr-12 { padding-right: 3rem !important; } .lg\:pb-12 { padding-bottom: 3rem !important; } .lg\:pl-12 { padding-left: 3rem !important; } .lg\:pt-14 { padding-top: 3.5rem !important; } .lg\:pr-14 { padding-right: 3.5rem !important; } .lg\:pb-14 { padding-bottom: 3.5rem !important; } .lg\:pl-14 { padding-left: 3.5rem !important; } .lg\:pt-16 { padding-top: 4rem !important; } .lg\:pr-16 { padding-right: 4rem !important; } .lg\:pb-16 { padding-bottom: 4rem !important; } .lg\:pl-16 { padding-left: 4rem !important; } .lg\:pt-18 { padding-top: 4.5rem !important; } .lg\:pr-18 { padding-right: 4.5rem !important; } .lg\:pb-18 { padding-bottom: 4.5rem !important; } .lg\:pl-18 { padding-left: 4.5rem !important; } .lg\:pt-20 { padding-top: 5rem !important; } .lg\:pr-20 { padding-right: 5rem !important; } .lg\:pb-20 { padding-bottom: 5rem !important; } .lg\:pl-20 { padding-left: 5rem !important; } .lg\:pt-22 { padding-top: 5.5rem !important; } .lg\:pr-22 { padding-right: 5.5rem !important; } .lg\:pb-22 { padding-bottom: 5.5rem !important; } .lg\:pl-22 { padding-left: 5.5rem !important; } .lg\:pt-24 { padding-top: 6rem !important; } .lg\:pr-24 { padding-right: 6rem !important; } .lg\:pb-24 { padding-bottom: 6rem !important; } .lg\:pl-24 { padding-left: 6rem !important; } .lg\:pt-26 { padding-top: 6.5rem !important; } .lg\:pr-26 { padding-right: 6.5rem !important; } .lg\:pb-26 { padding-bottom: 6.5rem !important; } .lg\:pl-26 { padding-left: 6.5rem !important; } .lg\:pt-28 { padding-top: 7rem !important; } .lg\:pr-28 { padding-right: 7rem !important; } .lg\:pb-28 { padding-bottom: 7rem !important; } .lg\:pl-28 { padding-left: 7rem !important; } .lg\:pt-30 { padding-top: 7.5rem !important; } .lg\:pr-30 { padding-right: 7.5rem !important; } .lg\:pb-30 { padding-bottom: 7.5rem !important; } .lg\:pl-30 { padding-left: 7.5rem !important; } .lg\:pt-32 { padding-top: 8rem !important; } .lg\:pr-32 { padding-right: 8rem !important; } .lg\:pb-32 { padding-bottom: 8rem !important; } .lg\:pl-32 { padding-left: 8rem !important; } .lg\:pt-36 { padding-top: 9rem !important; } .lg\:pr-36 { padding-right: 9rem !important; } .lg\:pb-36 { padding-bottom: 9rem !important; } .lg\:pl-36 { padding-left: 9rem !important; } .lg\:pt-40 { padding-top: 10rem !important; } .lg\:pr-40 { padding-right: 10rem !important; } .lg\:pb-40 { padding-bottom: 10rem !important; } .lg\:pl-40 { padding-left: 10rem !important; } .lg\:pt-48 { padding-top: 12rem !important; } .lg\:pr-48 { padding-right: 12rem !important; } .lg\:pb-48 { padding-bottom: 12rem !important; } .lg\:pl-48 { padding-left: 12rem !important; } .lg\:pt-56 { padding-top: 14rem !important; } .lg\:pr-56 { padding-right: 14rem !important; } .lg\:pb-56 { padding-bottom: 14rem !important; } .lg\:pl-56 { padding-left: 14rem !important; } .lg\:pt-64 { padding-top: 16rem !important; } .lg\:pr-64 { padding-right: 16rem !important; } .lg\:pb-64 { padding-bottom: 16rem !important; } .lg\:pl-64 { padding-left: 16rem !important; } .lg\:pt-px { padding-top: 1px !important; } .lg\:pr-px { padding-right: 1px !important; } .lg\:pb-px { padding-bottom: 1px !important; } .lg\:pl-px { padding-left: 1px !important; } .lg\:pt-2px { padding-top: 2px !important; } .lg\:pr-2px { padding-right: 2px !important; } .lg\:pb-2px { padding-bottom: 2px !important; } .lg\:pl-2px { padding-left: 2px !important; } .lg\:placeholder-opacity-0::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .lg\:placeholder-opacity-0::-moz-placeholder { --placeholder-opacity: 0 !important; } .lg\:placeholder-opacity-0::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .lg\:placeholder-opacity-0::placeholder { --placeholder-opacity: 0 !important; } .lg\:placeholder-opacity-12::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .lg\:placeholder-opacity-12::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .lg\:placeholder-opacity-12::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .lg\:placeholder-opacity-12::placeholder { --placeholder-opacity: 0.12 !important; } .lg\:placeholder-opacity-25::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .lg\:placeholder-opacity-25::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .lg\:placeholder-opacity-25::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .lg\:placeholder-opacity-25::placeholder { --placeholder-opacity: 0.25 !important; } .lg\:placeholder-opacity-38::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .lg\:placeholder-opacity-38::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .lg\:placeholder-opacity-38::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .lg\:placeholder-opacity-38::placeholder { --placeholder-opacity: 0.38 !important; } .lg\:placeholder-opacity-50::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .lg\:placeholder-opacity-50::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .lg\:placeholder-opacity-50::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .lg\:placeholder-opacity-50::placeholder { --placeholder-opacity: 0.5 !important; } .lg\:placeholder-opacity-54::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .lg\:placeholder-opacity-54::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .lg\:placeholder-opacity-54::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .lg\:placeholder-opacity-54::placeholder { --placeholder-opacity: 0.54 !important; } .lg\:placeholder-opacity-70::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .lg\:placeholder-opacity-70::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .lg\:placeholder-opacity-70::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .lg\:placeholder-opacity-70::placeholder { --placeholder-opacity: 0.70 !important; } .lg\:placeholder-opacity-75::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .lg\:placeholder-opacity-75::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .lg\:placeholder-opacity-75::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .lg\:placeholder-opacity-75::placeholder { --placeholder-opacity: 0.75 !important; } .lg\:placeholder-opacity-84::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .lg\:placeholder-opacity-84::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .lg\:placeholder-opacity-84::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .lg\:placeholder-opacity-84::placeholder { --placeholder-opacity: 0.84 !important; } .lg\:placeholder-opacity-100::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .lg\:placeholder-opacity-100::-moz-placeholder { --placeholder-opacity: 1 !important; } .lg\:placeholder-opacity-100::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .lg\:placeholder-opacity-100::placeholder { --placeholder-opacity: 1 !important; } .lg\:focus\:placeholder-opacity-0:focus::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .lg\:focus\:placeholder-opacity-0:focus::-moz-placeholder { --placeholder-opacity: 0 !important; } .lg\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .lg\:focus\:placeholder-opacity-0:focus::placeholder { --placeholder-opacity: 0 !important; } .lg\:focus\:placeholder-opacity-12:focus::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .lg\:focus\:placeholder-opacity-12:focus::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .lg\:focus\:placeholder-opacity-12:focus::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .lg\:focus\:placeholder-opacity-12:focus::placeholder { --placeholder-opacity: 0.12 !important; } .lg\:focus\:placeholder-opacity-25:focus::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .lg\:focus\:placeholder-opacity-25:focus::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .lg\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .lg\:focus\:placeholder-opacity-25:focus::placeholder { --placeholder-opacity: 0.25 !important; } .lg\:focus\:placeholder-opacity-38:focus::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .lg\:focus\:placeholder-opacity-38:focus::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .lg\:focus\:placeholder-opacity-38:focus::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .lg\:focus\:placeholder-opacity-38:focus::placeholder { --placeholder-opacity: 0.38 !important; } .lg\:focus\:placeholder-opacity-50:focus::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .lg\:focus\:placeholder-opacity-50:focus::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .lg\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .lg\:focus\:placeholder-opacity-50:focus::placeholder { --placeholder-opacity: 0.5 !important; } .lg\:focus\:placeholder-opacity-54:focus::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .lg\:focus\:placeholder-opacity-54:focus::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .lg\:focus\:placeholder-opacity-54:focus::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .lg\:focus\:placeholder-opacity-54:focus::placeholder { --placeholder-opacity: 0.54 !important; } .lg\:focus\:placeholder-opacity-70:focus::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .lg\:focus\:placeholder-opacity-70:focus::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .lg\:focus\:placeholder-opacity-70:focus::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .lg\:focus\:placeholder-opacity-70:focus::placeholder { --placeholder-opacity: 0.70 !important; } .lg\:focus\:placeholder-opacity-75:focus::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .lg\:focus\:placeholder-opacity-75:focus::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .lg\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .lg\:focus\:placeholder-opacity-75:focus::placeholder { --placeholder-opacity: 0.75 !important; } .lg\:focus\:placeholder-opacity-84:focus::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .lg\:focus\:placeholder-opacity-84:focus::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .lg\:focus\:placeholder-opacity-84:focus::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .lg\:focus\:placeholder-opacity-84:focus::placeholder { --placeholder-opacity: 0.84 !important; } .lg\:focus\:placeholder-opacity-100:focus::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .lg\:focus\:placeholder-opacity-100:focus::-moz-placeholder { --placeholder-opacity: 1 !important; } .lg\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .lg\:focus\:placeholder-opacity-100:focus::placeholder { --placeholder-opacity: 1 !important; } .lg\:pointer-events-none { pointer-events: none !important; } .lg\:pointer-events-auto { pointer-events: auto !important; } .lg\:static { position: static !important; } .lg\:fixed { position: fixed !important; } .lg\:absolute { position: absolute !important; } .lg\:relative { position: relative !important; } .lg\:sticky { position: -webkit-sticky !important; position: sticky !important; } .lg\:inset-0 { top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; } .lg\:inset-auto { top: auto !important; right: auto !important; bottom: auto !important; left: auto !important; } .lg\:inset-y-0 { top: 0 !important; bottom: 0 !important; } .lg\:inset-x-0 { right: 0 !important; left: 0 !important; } .lg\:inset-y-auto { top: auto !important; bottom: auto !important; } .lg\:inset-x-auto { right: auto !important; left: auto !important; } .lg\:top-0 { top: 0 !important; } .lg\:right-0 { right: 0 !important; } .lg\:bottom-0 { bottom: 0 !important; } .lg\:left-0 { left: 0 !important; } .lg\:top-auto { top: auto !important; } .lg\:right-auto { right: auto !important; } .lg\:bottom-auto { bottom: auto !important; } .lg\:left-auto { left: auto !important; } .lg\:shadow-xs { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .lg\:shadow-sm { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .lg\:shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .lg\:shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .lg\:shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .lg\:shadow-xl { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .lg\:shadow-2xl { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .lg\:shadow-inner { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .lg\:shadow-outline { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .lg\:shadow-none { box-shadow: none !important; } .lg\:shadow-solid { box-shadow: 0 0 0 2px currentColor !important; } .lg\:hover\:shadow-xs:hover { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .lg\:hover\:shadow-sm:hover { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .lg\:hover\:shadow:hover { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .lg\:hover\:shadow-md:hover { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .lg\:hover\:shadow-lg:hover { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .lg\:hover\:shadow-xl:hover { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .lg\:hover\:shadow-2xl:hover { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .lg\:hover\:shadow-inner:hover { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .lg\:hover\:shadow-outline:hover { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .lg\:hover\:shadow-none:hover { box-shadow: none !important; } .lg\:hover\:shadow-solid:hover { box-shadow: 0 0 0 2px currentColor !important; } .lg\:focus\:shadow-xs:focus { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .lg\:focus\:shadow-sm:focus { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .lg\:focus\:shadow:focus { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .lg\:focus\:shadow-md:focus { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .lg\:focus\:shadow-lg:focus { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .lg\:focus\:shadow-xl:focus { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .lg\:focus\:shadow-2xl:focus { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .lg\:focus\:shadow-inner:focus { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .lg\:focus\:shadow-outline:focus { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .lg\:focus\:shadow-none:focus { box-shadow: none !important; } .lg\:focus\:shadow-solid:focus { box-shadow: 0 0 0 2px currentColor !important; } .lg\:fill-current { fill: currentColor !important; } .lg\:stroke-current { stroke: currentColor !important; } .lg\:stroke-0 { stroke-width: 0 !important; } .lg\:stroke-1 { stroke-width: 1 !important; } .lg\:stroke-2 { stroke-width: 2 !important; } .lg\:table-auto { table-layout: auto !important; } .lg\:table-fixed { table-layout: fixed !important; } .lg\:text-left { text-align: left !important; } .lg\:text-center { text-align: center !important; } .lg\:text-right { text-align: right !important; } .lg\:text-justify { text-align: justify !important; } .lg\:text-opacity-0 { --text-opacity: 0 !important; } .lg\:text-opacity-12 { --text-opacity: 0.12 !important; } .lg\:text-opacity-25 { --text-opacity: 0.25 !important; } .lg\:text-opacity-38 { --text-opacity: 0.38 !important; } .lg\:text-opacity-50 { --text-opacity: 0.5 !important; } .lg\:text-opacity-54 { --text-opacity: 0.54 !important; } .lg\:text-opacity-70 { --text-opacity: 0.70 !important; } .lg\:text-opacity-75 { --text-opacity: 0.75 !important; } .lg\:text-opacity-84 { --text-opacity: 0.84 !important; } .lg\:text-opacity-100 { --text-opacity: 1 !important; } .lg\:hover\:text-opacity-0:hover { --text-opacity: 0 !important; } .lg\:hover\:text-opacity-12:hover { --text-opacity: 0.12 !important; } .lg\:hover\:text-opacity-25:hover { --text-opacity: 0.25 !important; } .lg\:hover\:text-opacity-38:hover { --text-opacity: 0.38 !important; } .lg\:hover\:text-opacity-50:hover { --text-opacity: 0.5 !important; } .lg\:hover\:text-opacity-54:hover { --text-opacity: 0.54 !important; } .lg\:hover\:text-opacity-70:hover { --text-opacity: 0.70 !important; } .lg\:hover\:text-opacity-75:hover { --text-opacity: 0.75 !important; } .lg\:hover\:text-opacity-84:hover { --text-opacity: 0.84 !important; } .lg\:hover\:text-opacity-100:hover { --text-opacity: 1 !important; } .lg\:focus\:text-opacity-0:focus { --text-opacity: 0 !important; } .lg\:focus\:text-opacity-12:focus { --text-opacity: 0.12 !important; } .lg\:focus\:text-opacity-25:focus { --text-opacity: 0.25 !important; } .lg\:focus\:text-opacity-38:focus { --text-opacity: 0.38 !important; } .lg\:focus\:text-opacity-50:focus { --text-opacity: 0.5 !important; } .lg\:focus\:text-opacity-54:focus { --text-opacity: 0.54 !important; } .lg\:focus\:text-opacity-70:focus { --text-opacity: 0.70 !important; } .lg\:focus\:text-opacity-75:focus { --text-opacity: 0.75 !important; } .lg\:focus\:text-opacity-84:focus { --text-opacity: 0.84 !important; } .lg\:focus\:text-opacity-100:focus { --text-opacity: 1 !important; } .lg\:italic { font-style: italic !important; } .lg\:not-italic { font-style: normal !important; } .lg\:uppercase { text-transform: uppercase !important; } .lg\:lowercase { text-transform: lowercase !important; } .lg\:capitalize { text-transform: capitalize !important; } .lg\:normal-case { text-transform: none !important; } .lg\:underline { text-decoration: underline !important; } .lg\:line-through { text-decoration: line-through !important; } .lg\:no-underline { text-decoration: none !important; } .lg\:hover\:underline:hover { text-decoration: underline !important; } .lg\:hover\:line-through:hover { text-decoration: line-through !important; } .lg\:hover\:no-underline:hover { text-decoration: none !important; } .lg\:focus\:underline:focus { text-decoration: underline !important; } .lg\:focus\:line-through:focus { text-decoration: line-through !important; } .lg\:focus\:no-underline:focus { text-decoration: none !important; } .lg\:tracking-tighter { letter-spacing: -0.05em !important; } .lg\:tracking-tight { letter-spacing: -0.025em !important; } .lg\:tracking-normal { letter-spacing: 0 !important; } .lg\:tracking-wide { letter-spacing: 0.025em !important; } .lg\:tracking-wider { letter-spacing: 0.05em !important; } .lg\:tracking-widest { letter-spacing: 0.1em !important; } .lg\:select-none { -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important; } .lg\:select-text { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } .lg\:select-all { -webkit-user-select: all !important; -moz-user-select: all !important; -ms-user-select: all !important; user-select: all !important; } .lg\:select-auto { -webkit-user-select: auto !important; -moz-user-select: auto !important; -ms-user-select: auto !important; user-select: auto !important; } .lg\:align-baseline { vertical-align: baseline !important; } .lg\:align-top { vertical-align: top !important; } .lg\:align-middle { vertical-align: middle !important; } .lg\:align-bottom { vertical-align: bottom !important; } .lg\:align-text-top { vertical-align: text-top !important; } .lg\:align-text-bottom { vertical-align: text-bottom !important; } .lg\:visible { visibility: visible !important; } .lg\:invisible { visibility: hidden !important; } .lg\:whitespace-normal { white-space: normal !important; } .lg\:whitespace-no-wrap { white-space: nowrap !important; } .lg\:whitespace-pre { white-space: pre !important; } .lg\:whitespace-pre-line { white-space: pre-line !important; } .lg\:whitespace-pre-wrap { white-space: pre-wrap !important; } .lg\:break-normal { overflow-wrap: normal !important; word-break: normal !important; } .lg\:break-words { overflow-wrap: break-word !important; } .lg\:break-all { word-break: break-all !important; } .lg\:truncate { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } .lg\:w-0 { width: 0 !important; } .lg\:w-1 { width: 0.25rem !important; } .lg\:w-2 { width: 0.5rem !important; } .lg\:w-3 { width: 0.75rem !important; } .lg\:w-4 { width: 1rem !important; } .lg\:w-5 { width: 1.25rem !important; } .lg\:w-6 { width: 1.5rem !important; } .lg\:w-8 { width: 2rem !important; } .lg\:w-10 { width: 2.5rem !important; } .lg\:w-12 { width: 3rem !important; } .lg\:w-14 { width: 3.5rem !important; } .lg\:w-16 { width: 4rem !important; } .lg\:w-18 { width: 4.5rem !important; } .lg\:w-20 { width: 5rem !important; } .lg\:w-22 { width: 5.5rem !important; } .lg\:w-24 { width: 6rem !important; } .lg\:w-26 { width: 6.5rem !important; } .lg\:w-28 { width: 7rem !important; } .lg\:w-30 { width: 7.5rem !important; } .lg\:w-32 { width: 8rem !important; } .lg\:w-36 { width: 9rem !important; } .lg\:w-40 { width: 10rem !important; } .lg\:w-48 { width: 12rem !important; } .lg\:w-50 { width: 12.5rem !important; } .lg\:w-56 { width: 14rem !important; } .lg\:w-60 { width: 15rem !important; } .lg\:w-64 { width: 16rem !important; } .lg\:w-80 { width: 20rem !important; } .lg\:w-90 { width: 24rem !important; } .lg\:w-100 { width: 25rem !important; } .lg\:w-120 { width: 30rem !important; } .lg\:w-128 { width: 32rem !important; } .lg\:w-140 { width: 35rem !important; } .lg\:w-160 { width: 40rem !important; } .lg\:w-180 { width: 45rem !important; } .lg\:w-192 { width: 48rem !important; } .lg\:w-200 { width: 50rem !important; } .lg\:w-240 { width: 60rem !important; } .lg\:w-256 { width: 64rem !important; } .lg\:w-280 { width: 70rem !important; } .lg\:w-320 { width: 80rem !important; } .lg\:w-360 { width: 90rem !important; } .lg\:w-400 { width: 100rem !important; } .lg\:w-480 { width: 120rem !important; } .lg\:w-auto { width: auto !important; } .lg\:w-px { width: 1px !important; } .lg\:w-2px { width: 2px !important; } .lg\:w-1\/2 { width: 50% !important; } .lg\:w-1\/3 { width: 33.33333% !important; } .lg\:w-2\/3 { width: 66.66667% !important; } .lg\:w-1\/4 { width: 25% !important; } .lg\:w-2\/4 { width: 50% !important; } .lg\:w-3\/4 { width: 75% !important; } .lg\:w-1\/5 { width: 20% !important; } .lg\:w-2\/5 { width: 40% !important; } .lg\:w-3\/5 { width: 60% !important; } .lg\:w-4\/5 { width: 80% !important; } .lg\:w-1\/6 { width: 16.666667% !important; } .lg\:w-2\/6 { width: 33.333333% !important; } .lg\:w-3\/6 { width: 50% !important; } .lg\:w-4\/6 { width: 66.666667% !important; } .lg\:w-5\/6 { width: 83.333333% !important; } .lg\:w-1\/12 { width: 8.33333% !important; } .lg\:w-2\/12 { width: 16.66667% !important; } .lg\:w-3\/12 { width: 25% !important; } .lg\:w-4\/12 { width: 33.33333% !important; } .lg\:w-5\/12 { width: 41.66667% !important; } .lg\:w-6\/12 { width: 50% !important; } .lg\:w-7\/12 { width: 58.33333% !important; } .lg\:w-8\/12 { width: 66.66667% !important; } .lg\:w-9\/12 { width: 75% !important; } .lg\:w-10\/12 { width: 83.33333% !important; } .lg\:w-11\/12 { width: 91.66667% !important; } .lg\:w-full { width: 100% !important; } .lg\:w-screen { width: 100vw !important; } .lg\:z-0 { z-index: 0 !important; } .lg\:z-10 { z-index: 10 !important; } .lg\:z-20 { z-index: 20 !important; } .lg\:z-30 { z-index: 30 !important; } .lg\:z-40 { z-index: 40 !important; } .lg\:z-50 { z-index: 50 !important; } .lg\:z-60 { z-index: 60 !important; } .lg\:z-70 { z-index: 70 !important; } .lg\:z-80 { z-index: 80 !important; } .lg\:z-90 { z-index: 90 !important; } .lg\:z-99 { z-index: 99 !important; } .lg\:z-999 { z-index: 999 !important; } .lg\:z-9999 { z-index: 9999 !important; } .lg\:z-99999 { z-index: 99999 !important; } .lg\:z-auto { z-index: auto !important; } .lg\:-z-1 { z-index: -1 !important; } .lg\:gap-0 { grid-gap: 0 !important; gap: 0 !important; } .lg\:gap-1 { grid-gap: 0.25rem !important; gap: 0.25rem !important; } .lg\:gap-2 { grid-gap: 0.5rem !important; gap: 0.5rem !important; } .lg\:gap-3 { grid-gap: 0.75rem !important; gap: 0.75rem !important; } .lg\:gap-4 { grid-gap: 1rem !important; gap: 1rem !important; } .lg\:gap-5 { grid-gap: 1.25rem !important; gap: 1.25rem !important; } .lg\:gap-6 { grid-gap: 1.5rem !important; gap: 1.5rem !important; } .lg\:gap-8 { grid-gap: 2rem !important; gap: 2rem !important; } .lg\:gap-10 { grid-gap: 2.5rem !important; gap: 2.5rem !important; } .lg\:gap-12 { grid-gap: 3rem !important; gap: 3rem !important; } .lg\:gap-14 { grid-gap: 3.5rem !important; gap: 3.5rem !important; } .lg\:gap-16 { grid-gap: 4rem !important; gap: 4rem !important; } .lg\:gap-18 { grid-gap: 4.5rem !important; gap: 4.5rem !important; } .lg\:gap-20 { grid-gap: 5rem !important; gap: 5rem !important; } .lg\:gap-22 { grid-gap: 5.5rem !important; gap: 5.5rem !important; } .lg\:gap-24 { grid-gap: 6rem !important; gap: 6rem !important; } .lg\:gap-26 { grid-gap: 6.5rem !important; gap: 6.5rem !important; } .lg\:gap-28 { grid-gap: 7rem !important; gap: 7rem !important; } .lg\:gap-30 { grid-gap: 7.5rem !important; gap: 7.5rem !important; } .lg\:gap-32 { grid-gap: 8rem !important; gap: 8rem !important; } .lg\:gap-36 { grid-gap: 9rem !important; gap: 9rem !important; } .lg\:gap-40 { grid-gap: 10rem !important; gap: 10rem !important; } .lg\:gap-48 { grid-gap: 12rem !important; gap: 12rem !important; } .lg\:gap-56 { grid-gap: 14rem !important; gap: 14rem !important; } .lg\:gap-64 { grid-gap: 16rem !important; gap: 16rem !important; } .lg\:gap-px { grid-gap: 1px !important; gap: 1px !important; } .lg\:gap-2px { grid-gap: 2px !important; gap: 2px !important; } .lg\:col-gap-0 { grid-column-gap: 0 !important; -moz-column-gap: 0 !important; column-gap: 0 !important; } .lg\:col-gap-1 { grid-column-gap: 0.25rem !important; -moz-column-gap: 0.25rem !important; column-gap: 0.25rem !important; } .lg\:col-gap-2 { grid-column-gap: 0.5rem !important; -moz-column-gap: 0.5rem !important; column-gap: 0.5rem !important; } .lg\:col-gap-3 { grid-column-gap: 0.75rem !important; -moz-column-gap: 0.75rem !important; column-gap: 0.75rem !important; } .lg\:col-gap-4 { grid-column-gap: 1rem !important; -moz-column-gap: 1rem !important; column-gap: 1rem !important; } .lg\:col-gap-5 { grid-column-gap: 1.25rem !important; -moz-column-gap: 1.25rem !important; column-gap: 1.25rem !important; } .lg\:col-gap-6 { grid-column-gap: 1.5rem !important; -moz-column-gap: 1.5rem !important; column-gap: 1.5rem !important; } .lg\:col-gap-8 { grid-column-gap: 2rem !important; -moz-column-gap: 2rem !important; column-gap: 2rem !important; } .lg\:col-gap-10 { grid-column-gap: 2.5rem !important; -moz-column-gap: 2.5rem !important; column-gap: 2.5rem !important; } .lg\:col-gap-12 { grid-column-gap: 3rem !important; -moz-column-gap: 3rem !important; column-gap: 3rem !important; } .lg\:col-gap-14 { grid-column-gap: 3.5rem !important; -moz-column-gap: 3.5rem !important; column-gap: 3.5rem !important; } .lg\:col-gap-16 { grid-column-gap: 4rem !important; -moz-column-gap: 4rem !important; column-gap: 4rem !important; } .lg\:col-gap-18 { grid-column-gap: 4.5rem !important; -moz-column-gap: 4.5rem !important; column-gap: 4.5rem !important; } .lg\:col-gap-20 { grid-column-gap: 5rem !important; -moz-column-gap: 5rem !important; column-gap: 5rem !important; } .lg\:col-gap-22 { grid-column-gap: 5.5rem !important; -moz-column-gap: 5.5rem !important; column-gap: 5.5rem !important; } .lg\:col-gap-24 { grid-column-gap: 6rem !important; -moz-column-gap: 6rem !important; column-gap: 6rem !important; } .lg\:col-gap-26 { grid-column-gap: 6.5rem !important; -moz-column-gap: 6.5rem !important; column-gap: 6.5rem !important; } .lg\:col-gap-28 { grid-column-gap: 7rem !important; -moz-column-gap: 7rem !important; column-gap: 7rem !important; } .lg\:col-gap-30 { grid-column-gap: 7.5rem !important; -moz-column-gap: 7.5rem !important; column-gap: 7.5rem !important; } .lg\:col-gap-32 { grid-column-gap: 8rem !important; -moz-column-gap: 8rem !important; column-gap: 8rem !important; } .lg\:col-gap-36 { grid-column-gap: 9rem !important; -moz-column-gap: 9rem !important; column-gap: 9rem !important; } .lg\:col-gap-40 { grid-column-gap: 10rem !important; -moz-column-gap: 10rem !important; column-gap: 10rem !important; } .lg\:col-gap-48 { grid-column-gap: 12rem !important; -moz-column-gap: 12rem !important; column-gap: 12rem !important; } .lg\:col-gap-56 { grid-column-gap: 14rem !important; -moz-column-gap: 14rem !important; column-gap: 14rem !important; } .lg\:col-gap-64 { grid-column-gap: 16rem !important; -moz-column-gap: 16rem !important; column-gap: 16rem !important; } .lg\:col-gap-px { grid-column-gap: 1px !important; -moz-column-gap: 1px !important; column-gap: 1px !important; } .lg\:col-gap-2px { grid-column-gap: 2px !important; -moz-column-gap: 2px !important; column-gap: 2px !important; } .lg\:row-gap-0 { grid-row-gap: 0 !important; row-gap: 0 !important; } .lg\:row-gap-1 { grid-row-gap: 0.25rem !important; row-gap: 0.25rem !important; } .lg\:row-gap-2 { grid-row-gap: 0.5rem !important; row-gap: 0.5rem !important; } .lg\:row-gap-3 { grid-row-gap: 0.75rem !important; row-gap: 0.75rem !important; } .lg\:row-gap-4 { grid-row-gap: 1rem !important; row-gap: 1rem !important; } .lg\:row-gap-5 { grid-row-gap: 1.25rem !important; row-gap: 1.25rem !important; } .lg\:row-gap-6 { grid-row-gap: 1.5rem !important; row-gap: 1.5rem !important; } .lg\:row-gap-8 { grid-row-gap: 2rem !important; row-gap: 2rem !important; } .lg\:row-gap-10 { grid-row-gap: 2.5rem !important; row-gap: 2.5rem !important; } .lg\:row-gap-12 { grid-row-gap: 3rem !important; row-gap: 3rem !important; } .lg\:row-gap-14 { grid-row-gap: 3.5rem !important; row-gap: 3.5rem !important; } .lg\:row-gap-16 { grid-row-gap: 4rem !important; row-gap: 4rem !important; } .lg\:row-gap-18 { grid-row-gap: 4.5rem !important; row-gap: 4.5rem !important; } .lg\:row-gap-20 { grid-row-gap: 5rem !important; row-gap: 5rem !important; } .lg\:row-gap-22 { grid-row-gap: 5.5rem !important; row-gap: 5.5rem !important; } .lg\:row-gap-24 { grid-row-gap: 6rem !important; row-gap: 6rem !important; } .lg\:row-gap-26 { grid-row-gap: 6.5rem !important; row-gap: 6.5rem !important; } .lg\:row-gap-28 { grid-row-gap: 7rem !important; row-gap: 7rem !important; } .lg\:row-gap-30 { grid-row-gap: 7.5rem !important; row-gap: 7.5rem !important; } .lg\:row-gap-32 { grid-row-gap: 8rem !important; row-gap: 8rem !important; } .lg\:row-gap-36 { grid-row-gap: 9rem !important; row-gap: 9rem !important; } .lg\:row-gap-40 { grid-row-gap: 10rem !important; row-gap: 10rem !important; } .lg\:row-gap-48 { grid-row-gap: 12rem !important; row-gap: 12rem !important; } .lg\:row-gap-56 { grid-row-gap: 14rem !important; row-gap: 14rem !important; } .lg\:row-gap-64 { grid-row-gap: 16rem !important; row-gap: 16rem !important; } .lg\:row-gap-px { grid-row-gap: 1px !important; row-gap: 1px !important; } .lg\:row-gap-2px { grid-row-gap: 2px !important; row-gap: 2px !important; } .lg\:grid-flow-row { grid-auto-flow: row !important; } .lg\:grid-flow-col { grid-auto-flow: column !important; } .lg\:grid-flow-row-dense { grid-auto-flow: row dense !important; } .lg\:grid-flow-col-dense { grid-auto-flow: column dense !important; } .lg\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; } .lg\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } .lg\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; } .lg\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; } .lg\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; } .lg\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; } .lg\:grid-cols-7 { grid-template-columns: repeat(7, minmax(0, 1fr)) !important; } .lg\:grid-cols-8 { grid-template-columns: repeat(8, minmax(0, 1fr)) !important; } .lg\:grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)) !important; } .lg\:grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)) !important; } .lg\:grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)) !important; } .lg\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)) !important; } .lg\:grid-cols-none { grid-template-columns: none !important; } .lg\:col-auto { grid-column: auto !important; } .lg\:col-span-1 { grid-column: span 1 / span 1 !important; } .lg\:col-span-2 { grid-column: span 2 / span 2 !important; } .lg\:col-span-3 { grid-column: span 3 / span 3 !important; } .lg\:col-span-4 { grid-column: span 4 / span 4 !important; } .lg\:col-span-5 { grid-column: span 5 / span 5 !important; } .lg\:col-span-6 { grid-column: span 6 / span 6 !important; } .lg\:col-span-7 { grid-column: span 7 / span 7 !important; } .lg\:col-span-8 { grid-column: span 8 / span 8 !important; } .lg\:col-span-9 { grid-column: span 9 / span 9 !important; } .lg\:col-span-10 { grid-column: span 10 / span 10 !important; } .lg\:col-span-11 { grid-column: span 11 / span 11 !important; } .lg\:col-span-12 { grid-column: span 12 / span 12 !important; } .lg\:col-start-1 { grid-column-start: 1 !important; } .lg\:col-start-2 { grid-column-start: 2 !important; } .lg\:col-start-3 { grid-column-start: 3 !important; } .lg\:col-start-4 { grid-column-start: 4 !important; } .lg\:col-start-5 { grid-column-start: 5 !important; } .lg\:col-start-6 { grid-column-start: 6 !important; } .lg\:col-start-7 { grid-column-start: 7 !important; } .lg\:col-start-8 { grid-column-start: 8 !important; } .lg\:col-start-9 { grid-column-start: 9 !important; } .lg\:col-start-10 { grid-column-start: 10 !important; } .lg\:col-start-11 { grid-column-start: 11 !important; } .lg\:col-start-12 { grid-column-start: 12 !important; } .lg\:col-start-13 { grid-column-start: 13 !important; } .lg\:col-start-auto { grid-column-start: auto !important; } .lg\:col-end-1 { grid-column-end: 1 !important; } .lg\:col-end-2 { grid-column-end: 2 !important; } .lg\:col-end-3 { grid-column-end: 3 !important; } .lg\:col-end-4 { grid-column-end: 4 !important; } .lg\:col-end-5 { grid-column-end: 5 !important; } .lg\:col-end-6 { grid-column-end: 6 !important; } .lg\:col-end-7 { grid-column-end: 7 !important; } .lg\:col-end-8 { grid-column-end: 8 !important; } .lg\:col-end-9 { grid-column-end: 9 !important; } .lg\:col-end-10 { grid-column-end: 10 !important; } .lg\:col-end-11 { grid-column-end: 11 !important; } .lg\:col-end-12 { grid-column-end: 12 !important; } .lg\:col-end-13 { grid-column-end: 13 !important; } .lg\:col-end-auto { grid-column-end: auto !important; } .lg\:grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)) !important; } .lg\:grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)) !important; } .lg\:grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)) !important; } .lg\:grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)) !important; } .lg\:grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)) !important; } .lg\:grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)) !important; } .lg\:grid-rows-none { grid-template-rows: none !important; } .lg\:row-auto { grid-row: auto !important; } .lg\:row-span-1 { grid-row: span 1 / span 1 !important; } .lg\:row-span-2 { grid-row: span 2 / span 2 !important; } .lg\:row-span-3 { grid-row: span 3 / span 3 !important; } .lg\:row-span-4 { grid-row: span 4 / span 4 !important; } .lg\:row-span-5 { grid-row: span 5 / span 5 !important; } .lg\:row-span-6 { grid-row: span 6 / span 6 !important; } .lg\:row-start-1 { grid-row-start: 1 !important; } .lg\:row-start-2 { grid-row-start: 2 !important; } .lg\:row-start-3 { grid-row-start: 3 !important; } .lg\:row-start-4 { grid-row-start: 4 !important; } .lg\:row-start-5 { grid-row-start: 5 !important; } .lg\:row-start-6 { grid-row-start: 6 !important; } .lg\:row-start-7 { grid-row-start: 7 !important; } .lg\:row-start-auto { grid-row-start: auto !important; } .lg\:row-end-1 { grid-row-end: 1 !important; } .lg\:row-end-2 { grid-row-end: 2 !important; } .lg\:row-end-3 { grid-row-end: 3 !important; } .lg\:row-end-4 { grid-row-end: 4 !important; } .lg\:row-end-5 { grid-row-end: 5 !important; } .lg\:row-end-6 { grid-row-end: 6 !important; } .lg\:row-end-7 { grid-row-end: 7 !important; } .lg\:row-end-auto { grid-row-end: auto !important; } .lg\:transform { --transform-translate-x: 0 !important; --transform-translate-y: 0 !important; --transform-rotate: 0 !important; --transform-skew-x: 0 !important; --transform-skew-y: 0 !important; --transform-scale-x: 1 !important; --transform-scale-y: 1 !important; transform: translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y)) !important; } .lg\:transform-none { transform: none !important; } .lg\:origin-center { transform-origin: center !important; } .lg\:origin-top { transform-origin: top !important; } .lg\:origin-top-right { transform-origin: top right !important; } .lg\:origin-right { transform-origin: right !important; } .lg\:origin-bottom-right { transform-origin: bottom right !important; } .lg\:origin-bottom { transform-origin: bottom !important; } .lg\:origin-bottom-left { transform-origin: bottom left !important; } .lg\:origin-left { transform-origin: left !important; } .lg\:origin-top-left { transform-origin: top left !important; } .lg\:icon-size-12 { width: 12px !important; height: 12px !important; min-width: 12px !important; min-height: 12px !important; font-size: 12px !important; line-height: 12px !important; } .lg\:icon-size-12 svg { width: 12px !important; height: 12px !important; } .lg\:icon-size-14 { width: 14px !important; height: 14px !important; min-width: 14px !important; min-height: 14px !important; font-size: 14px !important; line-height: 14px !important; } .lg\:icon-size-14 svg { width: 14px !important; height: 14px !important; } .lg\:icon-size-16 { width: 16px !important; height: 16px !important; min-width: 16px !important; min-height: 16px !important; font-size: 16px !important; line-height: 16px !important; } .lg\:icon-size-16 svg { width: 16px !important; height: 16px !important; } .lg\:icon-size-18 { width: 18px !important; height: 18px !important; min-width: 18px !important; min-height: 18px !important; font-size: 18px !important; line-height: 18px !important; } .lg\:icon-size-18 svg { width: 18px !important; height: 18px !important; } .lg\:icon-size-20 { width: 20px !important; height: 20px !important; min-width: 20px !important; min-height: 20px !important; font-size: 20px !important; line-height: 20px !important; } .lg\:icon-size-20 svg { width: 20px !important; height: 20px !important; } .lg\:icon-size-24 { width: 24px !important; height: 24px !important; min-width: 24px !important; min-height: 24px !important; font-size: 24px !important; line-height: 24px !important; } .lg\:icon-size-24 svg { width: 24px !important; height: 24px !important; } .lg\:icon-size-32 { width: 32px !important; height: 32px !important; min-width: 32px !important; min-height: 32px !important; font-size: 32px !important; line-height: 32px !important; } .lg\:icon-size-32 svg { width: 32px !important; height: 32px !important; } .lg\:icon-size-40 { width: 40px !important; height: 40px !important; min-width: 40px !important; min-height: 40px !important; font-size: 40px !important; line-height: 40px !important; } .lg\:icon-size-40 svg { width: 40px !important; height: 40px !important; } .lg\:icon-size-48 { width: 48px !important; height: 48px !important; min-width: 48px !important; min-height: 48px !important; font-size: 48px !important; line-height: 48px !important; } .lg\:icon-size-48 svg { width: 48px !important; height: 48px !important; } .lg\:icon-size-56 { width: 56px !important; height: 56px !important; min-width: 56px !important; min-height: 56px !important; font-size: 56px !important; line-height: 56px !important; } .lg\:icon-size-56 svg { width: 56px !important; height: 56px !important; } .lg\:icon-size-64 { width: 64px !important; height: 64px !important; min-width: 64px !important; min-height: 64px !important; font-size: 64px !important; line-height: 64px !important; } .lg\:icon-size-64 svg { width: 64px !important; height: 64px !important; } .lg\:icon-size-72 { width: 72px !important; height: 72px !important; min-width: 72px !important; min-height: 72px !important; font-size: 72px !important; line-height: 72px !important; } .lg\:icon-size-72 svg { width: 72px !important; height: 72px !important; } .lg\:icon-size-80 { width: 80px !important; height: 80px !important; min-width: 80px !important; min-height: 80px !important; font-size: 80px !important; line-height: 80px !important; } .lg\:icon-size-80 svg { width: 80px !important; height: 80px !important; } .lg\:icon-size-88 { width: 88px !important; height: 88px !important; min-width: 88px !important; min-height: 88px !important; font-size: 88px !important; line-height: 88px !important; } .lg\:icon-size-88 svg { width: 88px !important; height: 88px !important; } .lg\:icon-size-96 { width: 96px !important; height: 96px !important; min-width: 96px !important; min-height: 96px !important; font-size: 96px !important; line-height: 96px !important; } .lg\:icon-size-96 svg { width: 96px !important; height: 96px !important; } } @media (min-width: 1440px) { .xl\:space-y-0 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0px * var(--space-y-reverse)) !important; } .xl\:space-x-0 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0px * var(--space-x-reverse)) !important; margin-left: calc(0px * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.25rem * var(--space-y-reverse)) !important; } .xl\:space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.25rem * var(--space-x-reverse)) !important; margin-left: calc(0.25rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.5rem * var(--space-y-reverse)) !important; } .xl\:space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.5rem * var(--space-x-reverse)) !important; margin-left: calc(0.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.75rem * var(--space-y-reverse)) !important; } .xl\:space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.75rem * var(--space-x-reverse)) !important; margin-left: calc(0.75rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1rem * var(--space-y-reverse)) !important; } .xl\:space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1rem * var(--space-x-reverse)) !important; margin-left: calc(1rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.25rem * var(--space-y-reverse)) !important; } .xl\:space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.25rem * var(--space-x-reverse)) !important; margin-left: calc(1.25rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.5rem * var(--space-y-reverse)) !important; } .xl\:space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.5rem * var(--space-x-reverse)) !important; margin-left: calc(1.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2rem * var(--space-y-reverse)) !important; } .xl\:space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2rem * var(--space-x-reverse)) !important; margin-left: calc(2rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2.5rem * var(--space-y-reverse)) !important; } .xl\:space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2.5rem * var(--space-x-reverse)) !important; margin-left: calc(2.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3rem * var(--space-y-reverse)) !important; } .xl\:space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3rem * var(--space-x-reverse)) !important; margin-left: calc(3rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3.5rem * var(--space-y-reverse)) !important; } .xl\:space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3.5rem * var(--space-x-reverse)) !important; margin-left: calc(3.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4rem * var(--space-y-reverse)) !important; } .xl\:space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4rem * var(--space-x-reverse)) !important; margin-left: calc(4rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4.5rem * var(--space-y-reverse)) !important; } .xl\:space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4.5rem * var(--space-x-reverse)) !important; margin-left: calc(4.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5rem * var(--space-y-reverse)) !important; } .xl\:space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5rem * var(--space-x-reverse)) !important; margin-left: calc(5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5.5rem * var(--space-y-reverse)) !important; } .xl\:space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5.5rem * var(--space-x-reverse)) !important; margin-left: calc(5.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6rem * var(--space-y-reverse)) !important; } .xl\:space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6rem * var(--space-x-reverse)) !important; margin-left: calc(6rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6.5rem * var(--space-y-reverse)) !important; } .xl\:space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6.5rem * var(--space-x-reverse)) !important; margin-left: calc(6.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7rem * var(--space-y-reverse)) !important; } .xl\:space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7rem * var(--space-x-reverse)) !important; margin-left: calc(7rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7.5rem * var(--space-y-reverse)) !important; } .xl\:space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7.5rem * var(--space-x-reverse)) !important; margin-left: calc(7.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(8rem * var(--space-y-reverse)) !important; } .xl\:space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(8rem * var(--space-x-reverse)) !important; margin-left: calc(8rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(9rem * var(--space-y-reverse)) !important; } .xl\:space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(9rem * var(--space-x-reverse)) !important; margin-left: calc(9rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(10rem * var(--space-y-reverse)) !important; } .xl\:space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(10rem * var(--space-x-reverse)) !important; margin-left: calc(10rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(12rem * var(--space-y-reverse)) !important; } .xl\:space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(12rem * var(--space-x-reverse)) !important; margin-left: calc(12rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(14rem * var(--space-y-reverse)) !important; } .xl\:space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(14rem * var(--space-x-reverse)) !important; margin-left: calc(14rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(16rem * var(--space-y-reverse)) !important; } .xl\:space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(16rem * var(--space-x-reverse)) !important; margin-left: calc(16rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1px * var(--space-y-reverse)) !important; } .xl\:space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1px * var(--space-x-reverse)) !important; margin-left: calc(1px * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2px * var(--space-y-reverse)) !important; } .xl\:space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2px * var(--space-x-reverse)) !important; margin-left: calc(2px * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.25rem * var(--space-y-reverse)) !important; } .xl\:-space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.25rem * var(--space-x-reverse)) !important; margin-left: calc(-0.25rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.5rem * var(--space-y-reverse)) !important; } .xl\:-space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.5rem * var(--space-x-reverse)) !important; margin-left: calc(-0.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.75rem * var(--space-y-reverse)) !important; } .xl\:-space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.75rem * var(--space-x-reverse)) !important; margin-left: calc(-0.75rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1rem * var(--space-y-reverse)) !important; } .xl\:-space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1rem * var(--space-x-reverse)) !important; margin-left: calc(-1rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.25rem * var(--space-y-reverse)) !important; } .xl\:-space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.25rem * var(--space-x-reverse)) !important; margin-left: calc(-1.25rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.5rem * var(--space-y-reverse)) !important; } .xl\:-space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.5rem * var(--space-x-reverse)) !important; margin-left: calc(-1.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2rem * var(--space-y-reverse)) !important; } .xl\:-space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2rem * var(--space-x-reverse)) !important; margin-left: calc(-2rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2.5rem * var(--space-y-reverse)) !important; } .xl\:-space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2.5rem * var(--space-x-reverse)) !important; margin-left: calc(-2.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3rem * var(--space-y-reverse)) !important; } .xl\:-space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3rem * var(--space-x-reverse)) !important; margin-left: calc(-3rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3.5rem * var(--space-y-reverse)) !important; } .xl\:-space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3.5rem * var(--space-x-reverse)) !important; margin-left: calc(-3.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4rem * var(--space-y-reverse)) !important; } .xl\:-space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4rem * var(--space-x-reverse)) !important; margin-left: calc(-4rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4.5rem * var(--space-y-reverse)) !important; } .xl\:-space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4.5rem * var(--space-x-reverse)) !important; margin-left: calc(-4.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5rem * var(--space-y-reverse)) !important; } .xl\:-space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5rem * var(--space-x-reverse)) !important; margin-left: calc(-5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5.5rem * var(--space-y-reverse)) !important; } .xl\:-space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5.5rem * var(--space-x-reverse)) !important; margin-left: calc(-5.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6rem * var(--space-y-reverse)) !important; } .xl\:-space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6rem * var(--space-x-reverse)) !important; margin-left: calc(-6rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6.5rem * var(--space-y-reverse)) !important; } .xl\:-space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6.5rem * var(--space-x-reverse)) !important; margin-left: calc(-6.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7rem * var(--space-y-reverse)) !important; } .xl\:-space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7rem * var(--space-x-reverse)) !important; margin-left: calc(-7rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7.5rem * var(--space-y-reverse)) !important; } .xl\:-space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7.5rem * var(--space-x-reverse)) !important; margin-left: calc(-7.5rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-8rem * var(--space-y-reverse)) !important; } .xl\:-space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-8rem * var(--space-x-reverse)) !important; margin-left: calc(-8rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-9rem * var(--space-y-reverse)) !important; } .xl\:-space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-9rem * var(--space-x-reverse)) !important; margin-left: calc(-9rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-10rem * var(--space-y-reverse)) !important; } .xl\:-space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-10rem * var(--space-x-reverse)) !important; margin-left: calc(-10rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-12rem * var(--space-y-reverse)) !important; } .xl\:-space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-12rem * var(--space-x-reverse)) !important; margin-left: calc(-12rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-14rem * var(--space-y-reverse)) !important; } .xl\:-space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-14rem * var(--space-x-reverse)) !important; margin-left: calc(-14rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-16rem * var(--space-y-reverse)) !important; } .xl\:-space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-16rem * var(--space-x-reverse)) !important; margin-left: calc(-16rem * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1px * var(--space-y-reverse)) !important; } .xl\:-space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1px * var(--space-x-reverse)) !important; margin-left: calc(-1px * calc(1 - var(--space-x-reverse))) !important; } .xl\:-space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2px * var(--space-y-reverse)) !important; } .xl\:-space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2px * var(--space-x-reverse)) !important; margin-left: calc(-2px * calc(1 - var(--space-x-reverse))) !important; } .xl\:space-y-reverse > :not(template) ~ :not(template) { --space-y-reverse: 1 !important; } .xl\:space-x-reverse > :not(template) ~ :not(template) { --space-x-reverse: 1 !important; } .xl\:divide-y-0 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(0px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(0px * var(--divide-y-reverse)) !important; } .xl\:divide-x-0 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(0px * var(--divide-x-reverse)) !important; border-left-width: calc(0px * calc(1 - var(--divide-x-reverse))) !important; } .xl\:divide-y-2 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(2px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(2px * var(--divide-y-reverse)) !important; } .xl\:divide-x-2 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(2px * var(--divide-x-reverse)) !important; border-left-width: calc(2px * calc(1 - var(--divide-x-reverse))) !important; } .xl\:divide-y-4 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(4px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(4px * var(--divide-y-reverse)) !important; } .xl\:divide-x-4 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(4px * var(--divide-x-reverse)) !important; border-left-width: calc(4px * calc(1 - var(--divide-x-reverse))) !important; } .xl\:divide-y-8 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(8px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(8px * var(--divide-y-reverse)) !important; } .xl\:divide-x-8 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(8px * var(--divide-x-reverse)) !important; border-left-width: calc(8px * calc(1 - var(--divide-x-reverse))) !important; } .xl\:divide-y > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(1px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(1px * var(--divide-y-reverse)) !important; } .xl\:divide-x > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(1px * var(--divide-x-reverse)) !important; border-left-width: calc(1px * calc(1 - var(--divide-x-reverse))) !important; } .xl\:divide-y-reverse > :not(template) ~ :not(template) { --divide-y-reverse: 1 !important; } .xl\:divide-x-reverse > :not(template) ~ :not(template) { --divide-x-reverse: 1 !important; } .xl\:divide-current > :not(template) ~ :not(template) { border-color: currentColor !important; } .xl\:divide-transparent > :not(template) ~ :not(template) { border-color: transparent !important; } .xl\:divide-white > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFFFFF !important; border-color: rgba(255, 255, 255, var(--divide-opacity)) !important; } .xl\:divide-black > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #000000 !important; border-color: rgba(0, 0, 0, var(--divide-opacity)) !important; } .xl\:divide-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F9FAFB !important; border-color: rgba(249, 250, 251, var(--divide-opacity)) !important; } .xl\:divide-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F4F5F7 !important; border-color: rgba(244, 245, 247, var(--divide-opacity)) !important; } .xl\:divide-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5E7EB !important; border-color: rgba(229, 231, 235, var(--divide-opacity)) !important; } .xl\:divide-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D2D6DC !important; border-color: rgba(210, 214, 220, var(--divide-opacity)) !important; } .xl\:divide-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9FA6B2 !important; border-color: rgba(159, 166, 178, var(--divide-opacity)) !important; } .xl\:divide-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .xl\:divide-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4B5563 !important; border-color: rgba(75, 85, 99, var(--divide-opacity)) !important; } .xl\:divide-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #374151 !important; border-color: rgba(55, 65, 81, var(--divide-opacity)) !important; } .xl\:divide-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #252F3F !important; border-color: rgba(37, 47, 63, var(--divide-opacity)) !important; } .xl\:divide-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #161E2E !important; border-color: rgba(22, 30, 46, var(--divide-opacity)) !important; } .xl\:divide-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .xl\:divide-cool-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBFDFE !important; border-color: rgba(251, 253, 254, var(--divide-opacity)) !important; } .xl\:divide-cool-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F1F5F9 !important; border-color: rgba(241, 245, 249, var(--divide-opacity)) !important; } .xl\:divide-cool-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E2E8F0 !important; border-color: rgba(226, 232, 240, var(--divide-opacity)) !important; } .xl\:divide-cool-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CFD8E3 !important; border-color: rgba(207, 216, 227, var(--divide-opacity)) !important; } .xl\:divide-cool-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #97A6BA !important; border-color: rgba(151, 166, 186, var(--divide-opacity)) !important; } .xl\:divide-cool-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .xl\:divide-cool-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #475569 !important; border-color: rgba(71, 85, 105, var(--divide-opacity)) !important; } .xl\:divide-cool-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #364152 !important; border-color: rgba(54, 65, 82, var(--divide-opacity)) !important; } .xl\:divide-cool-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #27303F !important; border-color: rgba(39, 48, 63, var(--divide-opacity)) !important; } .xl\:divide-cool-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A202E !important; border-color: rgba(26, 32, 46, var(--divide-opacity)) !important; } .xl\:divide-cool-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .xl\:divide-red-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F2 !important; border-color: rgba(253, 242, 242, var(--divide-opacity)) !important; } .xl\:divide-red-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDE8E8 !important; border-color: rgba(253, 232, 232, var(--divide-opacity)) !important; } .xl\:divide-red-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBD5D5 !important; border-color: rgba(251, 213, 213, var(--divide-opacity)) !important; } .xl\:divide-red-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4B4 !important; border-color: rgba(248, 180, 180, var(--divide-opacity)) !important; } .xl\:divide-red-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F98080 !important; border-color: rgba(249, 128, 128, var(--divide-opacity)) !important; } .xl\:divide-red-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .xl\:divide-red-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E02424 !important; border-color: rgba(224, 36, 36, var(--divide-opacity)) !important; } .xl\:divide-red-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C81E1E !important; border-color: rgba(200, 30, 30, var(--divide-opacity)) !important; } .xl\:divide-red-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9B1C1C !important; border-color: rgba(155, 28, 28, var(--divide-opacity)) !important; } .xl\:divide-red-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .xl\:divide-red > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .xl\:divide-orange-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFF8F1 !important; border-color: rgba(255, 248, 241, var(--divide-opacity)) !important; } .xl\:divide-orange-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FEECDC !important; border-color: rgba(254, 236, 220, var(--divide-opacity)) !important; } .xl\:divide-orange-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCD9BD !important; border-color: rgba(252, 217, 189, var(--divide-opacity)) !important; } .xl\:divide-orange-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDBA8C !important; border-color: rgba(253, 186, 140, var(--divide-opacity)) !important; } .xl\:divide-orange-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF8A4C !important; border-color: rgba(255, 138, 76, var(--divide-opacity)) !important; } .xl\:divide-orange-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .xl\:divide-orange-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D03801 !important; border-color: rgba(208, 56, 1, var(--divide-opacity)) !important; } .xl\:divide-orange-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B43403 !important; border-color: rgba(180, 52, 3, var(--divide-opacity)) !important; } .xl\:divide-orange-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8A2C0D !important; border-color: rgba(138, 44, 13, var(--divide-opacity)) !important; } .xl\:divide-orange-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .xl\:divide-orange > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .xl\:divide-yellow-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDFDEA !important; border-color: rgba(253, 253, 234, var(--divide-opacity)) !important; } .xl\:divide-yellow-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF6B2 !important; border-color: rgba(253, 246, 178, var(--divide-opacity)) !important; } .xl\:divide-yellow-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE96A !important; border-color: rgba(252, 233, 106, var(--divide-opacity)) !important; } .xl\:divide-yellow-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FACA15 !important; border-color: rgba(250, 202, 21, var(--divide-opacity)) !important; } .xl\:divide-yellow-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E3A008 !important; border-color: rgba(227, 160, 8, var(--divide-opacity)) !important; } .xl\:divide-yellow-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .xl\:divide-yellow-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9F580A !important; border-color: rgba(159, 88, 10, var(--divide-opacity)) !important; } .xl\:divide-yellow-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8E4B10 !important; border-color: rgba(142, 75, 16, var(--divide-opacity)) !important; } .xl\:divide-yellow-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #723B13 !important; border-color: rgba(114, 59, 19, var(--divide-opacity)) !important; } .xl\:divide-yellow-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #633112 !important; border-color: rgba(99, 49, 18, var(--divide-opacity)) !important; } .xl\:divide-yellow > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .xl\:divide-green-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F3FAF7 !important; border-color: rgba(243, 250, 247, var(--divide-opacity)) !important; } .xl\:divide-green-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DEF7EC !important; border-color: rgba(222, 247, 236, var(--divide-opacity)) !important; } .xl\:divide-green-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BCF0DA !important; border-color: rgba(188, 240, 218, var(--divide-opacity)) !important; } .xl\:divide-green-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #84E1BC !important; border-color: rgba(132, 225, 188, var(--divide-opacity)) !important; } .xl\:divide-green-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #31C48D !important; border-color: rgba(49, 196, 141, var(--divide-opacity)) !important; } .xl\:divide-green-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .xl\:divide-green-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #057A55 !important; border-color: rgba(5, 122, 85, var(--divide-opacity)) !important; } .xl\:divide-green-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #046C4E !important; border-color: rgba(4, 108, 78, var(--divide-opacity)) !important; } .xl\:divide-green-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #03543F !important; border-color: rgba(3, 84, 63, var(--divide-opacity)) !important; } .xl\:divide-green-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014737 !important; border-color: rgba(1, 71, 55, var(--divide-opacity)) !important; } .xl\:divide-green > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .xl\:divide-teal-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDFAFA !important; border-color: rgba(237, 250, 250, var(--divide-opacity)) !important; } .xl\:divide-teal-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D5F5F6 !important; border-color: rgba(213, 245, 246, var(--divide-opacity)) !important; } .xl\:divide-teal-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AFECEF !important; border-color: rgba(175, 236, 239, var(--divide-opacity)) !important; } .xl\:divide-teal-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7EDCE2 !important; border-color: rgba(126, 220, 226, var(--divide-opacity)) !important; } .xl\:divide-teal-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #16BDCA !important; border-color: rgba(22, 189, 202, var(--divide-opacity)) !important; } .xl\:divide-teal-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .xl\:divide-teal-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #047481 !important; border-color: rgba(4, 116, 129, var(--divide-opacity)) !important; } .xl\:divide-teal-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #036672 !important; border-color: rgba(3, 102, 114, var(--divide-opacity)) !important; } .xl\:divide-teal-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #05505C !important; border-color: rgba(5, 80, 92, var(--divide-opacity)) !important; } .xl\:divide-teal-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014451 !important; border-color: rgba(1, 68, 81, var(--divide-opacity)) !important; } .xl\:divide-teal > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .xl\:divide-blue-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EBF5FF !important; border-color: rgba(235, 245, 255, var(--divide-opacity)) !important; } .xl\:divide-blue-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E1EFFE !important; border-color: rgba(225, 239, 254, var(--divide-opacity)) !important; } .xl\:divide-blue-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C3DDFD !important; border-color: rgba(195, 221, 253, var(--divide-opacity)) !important; } .xl\:divide-blue-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #A4CAFE !important; border-color: rgba(164, 202, 254, var(--divide-opacity)) !important; } .xl\:divide-blue-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #76A9FA !important; border-color: rgba(118, 169, 250, var(--divide-opacity)) !important; } .xl\:divide-blue-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .xl\:divide-blue-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1C64F2 !important; border-color: rgba(28, 100, 242, var(--divide-opacity)) !important; } .xl\:divide-blue-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A56DB !important; border-color: rgba(26, 86, 219, var(--divide-opacity)) !important; } .xl\:divide-blue-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1E429F !important; border-color: rgba(30, 66, 159, var(--divide-opacity)) !important; } .xl\:divide-blue-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #233876 !important; border-color: rgba(35, 56, 118, var(--divide-opacity)) !important; } .xl\:divide-blue > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .xl\:divide-indigo-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F0F5FF !important; border-color: rgba(240, 245, 255, var(--divide-opacity)) !important; } .xl\:divide-indigo-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5EDFF !important; border-color: rgba(229, 237, 255, var(--divide-opacity)) !important; } .xl\:divide-indigo-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CDDBFE !important; border-color: rgba(205, 219, 254, var(--divide-opacity)) !important; } .xl\:divide-indigo-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B4C6FC !important; border-color: rgba(180, 198, 252, var(--divide-opacity)) !important; } .xl\:divide-indigo-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8DA2FB !important; border-color: rgba(141, 162, 251, var(--divide-opacity)) !important; } .xl\:divide-indigo-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .xl\:divide-indigo-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5850EC !important; border-color: rgba(88, 80, 236, var(--divide-opacity)) !important; } .xl\:divide-indigo-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5145CD !important; border-color: rgba(81, 69, 205, var(--divide-opacity)) !important; } .xl\:divide-indigo-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #42389D !important; border-color: rgba(66, 56, 157, var(--divide-opacity)) !important; } .xl\:divide-indigo-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #362F78 !important; border-color: rgba(54, 47, 120, var(--divide-opacity)) !important; } .xl\:divide-indigo > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .xl\:divide-purple-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F6F5FF !important; border-color: rgba(246, 245, 255, var(--divide-opacity)) !important; } .xl\:divide-purple-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDEBFE !important; border-color: rgba(237, 235, 254, var(--divide-opacity)) !important; } .xl\:divide-purple-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DCD7FE !important; border-color: rgba(220, 215, 254, var(--divide-opacity)) !important; } .xl\:divide-purple-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CABFFD !important; border-color: rgba(202, 191, 253, var(--divide-opacity)) !important; } .xl\:divide-purple-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AC94FA !important; border-color: rgba(172, 148, 250, var(--divide-opacity)) !important; } .xl\:divide-purple-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .xl\:divide-purple-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7E3AF2 !important; border-color: rgba(126, 58, 242, var(--divide-opacity)) !important; } .xl\:divide-purple-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6C2BD9 !important; border-color: rgba(108, 43, 217, var(--divide-opacity)) !important; } .xl\:divide-purple-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5521B5 !important; border-color: rgba(85, 33, 181, var(--divide-opacity)) !important; } .xl\:divide-purple-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4A1D96 !important; border-color: rgba(74, 29, 150, var(--divide-opacity)) !important; } .xl\:divide-purple > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .xl\:divide-pink-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F8 !important; border-color: rgba(253, 242, 248, var(--divide-opacity)) !important; } .xl\:divide-pink-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE8F3 !important; border-color: rgba(252, 232, 243, var(--divide-opacity)) !important; } .xl\:divide-pink-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FAD1E8 !important; border-color: rgba(250, 209, 232, var(--divide-opacity)) !important; } .xl\:divide-pink-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4D9 !important; border-color: rgba(248, 180, 217, var(--divide-opacity)) !important; } .xl\:divide-pink-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F17EB8 !important; border-color: rgba(241, 126, 184, var(--divide-opacity)) !important; } .xl\:divide-pink-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .xl\:divide-pink-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D61F69 !important; border-color: rgba(214, 31, 105, var(--divide-opacity)) !important; } .xl\:divide-pink-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BF125D !important; border-color: rgba(191, 18, 93, var(--divide-opacity)) !important; } .xl\:divide-pink-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #99154B !important; border-color: rgba(153, 21, 75, var(--divide-opacity)) !important; } .xl\:divide-pink-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #751A3D !important; border-color: rgba(117, 26, 61, var(--divide-opacity)) !important; } .xl\:divide-pink > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .xl\:divide-opacity-0 > :not(template) ~ :not(template) { --divide-opacity: 0 !important; } .xl\:divide-opacity-12 > :not(template) ~ :not(template) { --divide-opacity: 0.12 !important; } .xl\:divide-opacity-25 > :not(template) ~ :not(template) { --divide-opacity: 0.25 !important; } .xl\:divide-opacity-38 > :not(template) ~ :not(template) { --divide-opacity: 0.38 !important; } .xl\:divide-opacity-50 > :not(template) ~ :not(template) { --divide-opacity: 0.5 !important; } .xl\:divide-opacity-54 > :not(template) ~ :not(template) { --divide-opacity: 0.54 !important; } .xl\:divide-opacity-70 > :not(template) ~ :not(template) { --divide-opacity: 0.70 !important; } .xl\:divide-opacity-75 > :not(template) ~ :not(template) { --divide-opacity: 0.75 !important; } .xl\:divide-opacity-84 > :not(template) ~ :not(template) { --divide-opacity: 0.84 !important; } .xl\:divide-opacity-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; } .xl\:sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .xl\:not-sr-only { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .xl\:focus\:sr-only:focus { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .xl\:focus\:not-sr-only:focus { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .xl\:appearance-none { -webkit-appearance: none !important; -moz-appearance: none !important; appearance: none !important; } .xl\:bg-fixed { background-attachment: fixed !important; } .xl\:bg-local { background-attachment: local !important; } .xl\:bg-scroll { background-attachment: scroll !important; } .xl\:bg-opacity-0 { --bg-opacity: 0 !important; } .xl\:bg-opacity-12 { --bg-opacity: 0.12 !important; } .xl\:bg-opacity-25 { --bg-opacity: 0.25 !important; } .xl\:bg-opacity-38 { --bg-opacity: 0.38 !important; } .xl\:bg-opacity-50 { --bg-opacity: 0.5 !important; } .xl\:bg-opacity-54 { --bg-opacity: 0.54 !important; } .xl\:bg-opacity-70 { --bg-opacity: 0.70 !important; } .xl\:bg-opacity-75 { --bg-opacity: 0.75 !important; } .xl\:bg-opacity-84 { --bg-opacity: 0.84 !important; } .xl\:bg-opacity-100 { --bg-opacity: 1 !important; } .xl\:hover\:bg-opacity-0:hover { --bg-opacity: 0 !important; } .xl\:hover\:bg-opacity-12:hover { --bg-opacity: 0.12 !important; } .xl\:hover\:bg-opacity-25:hover { --bg-opacity: 0.25 !important; } .xl\:hover\:bg-opacity-38:hover { --bg-opacity: 0.38 !important; } .xl\:hover\:bg-opacity-50:hover { --bg-opacity: 0.5 !important; } .xl\:hover\:bg-opacity-54:hover { --bg-opacity: 0.54 !important; } .xl\:hover\:bg-opacity-70:hover { --bg-opacity: 0.70 !important; } .xl\:hover\:bg-opacity-75:hover { --bg-opacity: 0.75 !important; } .xl\:hover\:bg-opacity-84:hover { --bg-opacity: 0.84 !important; } .xl\:hover\:bg-opacity-100:hover { --bg-opacity: 1 !important; } .xl\:focus\:bg-opacity-0:focus { --bg-opacity: 0 !important; } .xl\:focus\:bg-opacity-12:focus { --bg-opacity: 0.12 !important; } .xl\:focus\:bg-opacity-25:focus { --bg-opacity: 0.25 !important; } .xl\:focus\:bg-opacity-38:focus { --bg-opacity: 0.38 !important; } .xl\:focus\:bg-opacity-50:focus { --bg-opacity: 0.5 !important; } .xl\:focus\:bg-opacity-54:focus { --bg-opacity: 0.54 !important; } .xl\:focus\:bg-opacity-70:focus { --bg-opacity: 0.70 !important; } .xl\:focus\:bg-opacity-75:focus { --bg-opacity: 0.75 !important; } .xl\:focus\:bg-opacity-84:focus { --bg-opacity: 0.84 !important; } .xl\:focus\:bg-opacity-100:focus { --bg-opacity: 1 !important; } .xl\:bg-bottom { background-position: bottom !important; } .xl\:bg-center { background-position: center !important; } .xl\:bg-left { background-position: left !important; } .xl\:bg-left-bottom { background-position: left bottom !important; } .xl\:bg-left-top { background-position: left top !important; } .xl\:bg-right { background-position: right !important; } .xl\:bg-right-bottom { background-position: right bottom !important; } .xl\:bg-right-top { background-position: right top !important; } .xl\:bg-top { background-position: top !important; } .xl\:bg-repeat { background-repeat: repeat !important; } .xl\:bg-no-repeat { background-repeat: no-repeat !important; } .xl\:bg-repeat-x { background-repeat: repeat-x !important; } .xl\:bg-repeat-y { background-repeat: repeat-y !important; } .xl\:bg-repeat-round { background-repeat: round !important; } .xl\:bg-repeat-space { background-repeat: space !important; } .xl\:bg-auto { background-size: auto !important; } .xl\:bg-cover { background-size: cover !important; } .xl\:bg-contain { background-size: contain !important; } .xl\:border-collapse { border-collapse: collapse !important; } .xl\:border-separate { border-collapse: separate !important; } .xl\:border-opacity-0 { --border-opacity: 0 !important; } .xl\:border-opacity-12 { --border-opacity: 0.12 !important; } .xl\:border-opacity-25 { --border-opacity: 0.25 !important; } .xl\:border-opacity-38 { --border-opacity: 0.38 !important; } .xl\:border-opacity-50 { --border-opacity: 0.5 !important; } .xl\:border-opacity-54 { --border-opacity: 0.54 !important; } .xl\:border-opacity-70 { --border-opacity: 0.70 !important; } .xl\:border-opacity-75 { --border-opacity: 0.75 !important; } .xl\:border-opacity-84 { --border-opacity: 0.84 !important; } .xl\:border-opacity-100 { --border-opacity: 1 !important; } .xl\:hover\:border-opacity-0:hover { --border-opacity: 0 !important; } .xl\:hover\:border-opacity-12:hover { --border-opacity: 0.12 !important; } .xl\:hover\:border-opacity-25:hover { --border-opacity: 0.25 !important; } .xl\:hover\:border-opacity-38:hover { --border-opacity: 0.38 !important; } .xl\:hover\:border-opacity-50:hover { --border-opacity: 0.5 !important; } .xl\:hover\:border-opacity-54:hover { --border-opacity: 0.54 !important; } .xl\:hover\:border-opacity-70:hover { --border-opacity: 0.70 !important; } .xl\:hover\:border-opacity-75:hover { --border-opacity: 0.75 !important; } .xl\:hover\:border-opacity-84:hover { --border-opacity: 0.84 !important; } .xl\:hover\:border-opacity-100:hover { --border-opacity: 1 !important; } .xl\:focus\:border-opacity-0:focus { --border-opacity: 0 !important; } .xl\:focus\:border-opacity-12:focus { --border-opacity: 0.12 !important; } .xl\:focus\:border-opacity-25:focus { --border-opacity: 0.25 !important; } .xl\:focus\:border-opacity-38:focus { --border-opacity: 0.38 !important; } .xl\:focus\:border-opacity-50:focus { --border-opacity: 0.5 !important; } .xl\:focus\:border-opacity-54:focus { --border-opacity: 0.54 !important; } .xl\:focus\:border-opacity-70:focus { --border-opacity: 0.70 !important; } .xl\:focus\:border-opacity-75:focus { --border-opacity: 0.75 !important; } .xl\:focus\:border-opacity-84:focus { --border-opacity: 0.84 !important; } .xl\:focus\:border-opacity-100:focus { --border-opacity: 1 !important; } .xl\:rounded-none { border-radius: 0 !important; } .xl\:rounded-sm { border-radius: 0.125rem !important; } .xl\:rounded { border-radius: 0.25rem !important; } .xl\:rounded-md { border-radius: 0.375rem !important; } .xl\:rounded-lg { border-radius: 0.5rem !important; } .xl\:rounded-full { border-radius: 9999px !important; } .xl\:rounded-t-none { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } .xl\:rounded-r-none { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } .xl\:rounded-b-none { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } .xl\:rounded-l-none { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; } .xl\:rounded-t-sm { border-top-left-radius: 0.125rem !important; border-top-right-radius: 0.125rem !important; } .xl\:rounded-r-sm { border-top-right-radius: 0.125rem !important; border-bottom-right-radius: 0.125rem !important; } .xl\:rounded-b-sm { border-bottom-right-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .xl\:rounded-l-sm { border-top-left-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .xl\:rounded-t { border-top-left-radius: 0.25rem !important; border-top-right-radius: 0.25rem !important; } .xl\:rounded-r { border-top-right-radius: 0.25rem !important; border-bottom-right-radius: 0.25rem !important; } .xl\:rounded-b { border-bottom-right-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .xl\:rounded-l { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .xl\:rounded-t-md { border-top-left-radius: 0.375rem !important; border-top-right-radius: 0.375rem !important; } .xl\:rounded-r-md { border-top-right-radius: 0.375rem !important; border-bottom-right-radius: 0.375rem !important; } .xl\:rounded-b-md { border-bottom-right-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .xl\:rounded-l-md { border-top-left-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .xl\:rounded-t-lg { border-top-left-radius: 0.5rem !important; border-top-right-radius: 0.5rem !important; } .xl\:rounded-r-lg { border-top-right-radius: 0.5rem !important; border-bottom-right-radius: 0.5rem !important; } .xl\:rounded-b-lg { border-bottom-right-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .xl\:rounded-l-lg { border-top-left-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .xl\:rounded-t-full { border-top-left-radius: 9999px !important; border-top-right-radius: 9999px !important; } .xl\:rounded-r-full { border-top-right-radius: 9999px !important; border-bottom-right-radius: 9999px !important; } .xl\:rounded-b-full { border-bottom-right-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .xl\:rounded-l-full { border-top-left-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .xl\:rounded-tl-none { border-top-left-radius: 0 !important; } .xl\:rounded-tr-none { border-top-right-radius: 0 !important; } .xl\:rounded-br-none { border-bottom-right-radius: 0 !important; } .xl\:rounded-bl-none { border-bottom-left-radius: 0 !important; } .xl\:rounded-tl-sm { border-top-left-radius: 0.125rem !important; } .xl\:rounded-tr-sm { border-top-right-radius: 0.125rem !important; } .xl\:rounded-br-sm { border-bottom-right-radius: 0.125rem !important; } .xl\:rounded-bl-sm { border-bottom-left-radius: 0.125rem !important; } .xl\:rounded-tl { border-top-left-radius: 0.25rem !important; } .xl\:rounded-tr { border-top-right-radius: 0.25rem !important; } .xl\:rounded-br { border-bottom-right-radius: 0.25rem !important; } .xl\:rounded-bl { border-bottom-left-radius: 0.25rem !important; } .xl\:rounded-tl-md { border-top-left-radius: 0.375rem !important; } .xl\:rounded-tr-md { border-top-right-radius: 0.375rem !important; } .xl\:rounded-br-md { border-bottom-right-radius: 0.375rem !important; } .xl\:rounded-bl-md { border-bottom-left-radius: 0.375rem !important; } .xl\:rounded-tl-lg { border-top-left-radius: 0.5rem !important; } .xl\:rounded-tr-lg { border-top-right-radius: 0.5rem !important; } .xl\:rounded-br-lg { border-bottom-right-radius: 0.5rem !important; } .xl\:rounded-bl-lg { border-bottom-left-radius: 0.5rem !important; } .xl\:rounded-tl-full { border-top-left-radius: 9999px !important; } .xl\:rounded-tr-full { border-top-right-radius: 9999px !important; } .xl\:rounded-br-full { border-bottom-right-radius: 9999px !important; } .xl\:rounded-bl-full { border-bottom-left-radius: 9999px !important; } .xl\:border-solid { border-style: solid !important; } .xl\:border-dashed { border-style: dashed !important; } .xl\:border-dotted { border-style: dotted !important; } .xl\:border-double { border-style: double !important; } .xl\:border-none { border-style: none !important; } .xl\:border-0 { border-width: 0 !important; } .xl\:border-2 { border-width: 2px !important; } .xl\:border-4 { border-width: 4px !important; } .xl\:border-8 { border-width: 8px !important; } .xl\:border { border-width: 1px !important; } .xl\:border-t-0 { border-top-width: 0 !important; } .xl\:border-r-0 { border-right-width: 0 !important; } .xl\:border-b-0 { border-bottom-width: 0 !important; } .xl\:border-l-0 { border-left-width: 0 !important; } .xl\:border-t-2 { border-top-width: 2px !important; } .xl\:border-r-2 { border-right-width: 2px !important; } .xl\:border-b-2 { border-bottom-width: 2px !important; } .xl\:border-l-2 { border-left-width: 2px !important; } .xl\:border-t-4 { border-top-width: 4px !important; } .xl\:border-r-4 { border-right-width: 4px !important; } .xl\:border-b-4 { border-bottom-width: 4px !important; } .xl\:border-l-4 { border-left-width: 4px !important; } .xl\:border-t-8 { border-top-width: 8px !important; } .xl\:border-r-8 { border-right-width: 8px !important; } .xl\:border-b-8 { border-bottom-width: 8px !important; } .xl\:border-l-8 { border-left-width: 8px !important; } .xl\:border-t { border-top-width: 1px !important; } .xl\:border-r { border-right-width: 1px !important; } .xl\:border-b { border-bottom-width: 1px !important; } .xl\:border-l { border-left-width: 1px !important; } .xl\:first\:border-0:first-child { border-width: 0 !important; } .xl\:first\:border-2:first-child { border-width: 2px !important; } .xl\:first\:border-4:first-child { border-width: 4px !important; } .xl\:first\:border-8:first-child { border-width: 8px !important; } .xl\:first\:border:first-child { border-width: 1px !important; } .xl\:first\:border-t-0:first-child { border-top-width: 0 !important; } .xl\:first\:border-r-0:first-child { border-right-width: 0 !important; } .xl\:first\:border-b-0:first-child { border-bottom-width: 0 !important; } .xl\:first\:border-l-0:first-child { border-left-width: 0 !important; } .xl\:first\:border-t-2:first-child { border-top-width: 2px !important; } .xl\:first\:border-r-2:first-child { border-right-width: 2px !important; } .xl\:first\:border-b-2:first-child { border-bottom-width: 2px !important; } .xl\:first\:border-l-2:first-child { border-left-width: 2px !important; } .xl\:first\:border-t-4:first-child { border-top-width: 4px !important; } .xl\:first\:border-r-4:first-child { border-right-width: 4px !important; } .xl\:first\:border-b-4:first-child { border-bottom-width: 4px !important; } .xl\:first\:border-l-4:first-child { border-left-width: 4px !important; } .xl\:first\:border-t-8:first-child { border-top-width: 8px !important; } .xl\:first\:border-r-8:first-child { border-right-width: 8px !important; } .xl\:first\:border-b-8:first-child { border-bottom-width: 8px !important; } .xl\:first\:border-l-8:first-child { border-left-width: 8px !important; } .xl\:first\:border-t:first-child { border-top-width: 1px !important; } .xl\:first\:border-r:first-child { border-right-width: 1px !important; } .xl\:first\:border-b:first-child { border-bottom-width: 1px !important; } .xl\:first\:border-l:first-child { border-left-width: 1px !important; } .xl\:last\:border-0:last-child { border-width: 0 !important; } .xl\:last\:border-2:last-child { border-width: 2px !important; } .xl\:last\:border-4:last-child { border-width: 4px !important; } .xl\:last\:border-8:last-child { border-width: 8px !important; } .xl\:last\:border:last-child { border-width: 1px !important; } .xl\:last\:border-t-0:last-child { border-top-width: 0 !important; } .xl\:last\:border-r-0:last-child { border-right-width: 0 !important; } .xl\:last\:border-b-0:last-child { border-bottom-width: 0 !important; } .xl\:last\:border-l-0:last-child { border-left-width: 0 !important; } .xl\:last\:border-t-2:last-child { border-top-width: 2px !important; } .xl\:last\:border-r-2:last-child { border-right-width: 2px !important; } .xl\:last\:border-b-2:last-child { border-bottom-width: 2px !important; } .xl\:last\:border-l-2:last-child { border-left-width: 2px !important; } .xl\:last\:border-t-4:last-child { border-top-width: 4px !important; } .xl\:last\:border-r-4:last-child { border-right-width: 4px !important; } .xl\:last\:border-b-4:last-child { border-bottom-width: 4px !important; } .xl\:last\:border-l-4:last-child { border-left-width: 4px !important; } .xl\:last\:border-t-8:last-child { border-top-width: 8px !important; } .xl\:last\:border-r-8:last-child { border-right-width: 8px !important; } .xl\:last\:border-b-8:last-child { border-bottom-width: 8px !important; } .xl\:last\:border-l-8:last-child { border-left-width: 8px !important; } .xl\:last\:border-t:last-child { border-top-width: 1px !important; } .xl\:last\:border-r:last-child { border-right-width: 1px !important; } .xl\:last\:border-b:last-child { border-bottom-width: 1px !important; } .xl\:last\:border-l:last-child { border-left-width: 1px !important; } .xl\:box-border { box-sizing: border-box !important; } .xl\:box-content { box-sizing: content-box !important; } .xl\:block { display: block !important; } .xl\:inline-block { display: inline-block !important; } .xl\:inline { display: inline !important; } .xl\:flex { display: flex !important; } .xl\:inline-flex { display: inline-flex !important; } .xl\:table { display: table !important; } .xl\:table-caption { display: table-caption !important; } .xl\:table-cell { display: table-cell !important; } .xl\:table-column { display: table-column !important; } .xl\:table-column-group { display: table-column-group !important; } .xl\:table-footer-group { display: table-footer-group !important; } .xl\:table-header-group { display: table-header-group !important; } .xl\:table-row-group { display: table-row-group !important; } .xl\:table-row { display: table-row !important; } .xl\:flow-root { display: flow-root !important; } .xl\:grid { display: grid !important; } .xl\:inline-grid { display: inline-grid !important; } .xl\:hidden { display: none !important; } .xl\:flex-row { flex-direction: row !important; } .xl\:flex-row-reverse { flex-direction: row-reverse !important; } .xl\:flex-col { flex-direction: column !important; } .xl\:flex-col-reverse { flex-direction: column-reverse !important; } .xl\:flex-wrap { flex-wrap: wrap !important; } .xl\:flex-wrap-reverse { flex-wrap: wrap-reverse !important; } .xl\:flex-no-wrap { flex-wrap: nowrap !important; } .xl\:items-start { align-items: flex-start !important; } .xl\:items-end { align-items: flex-end !important; } .xl\:items-center { align-items: center !important; } .xl\:items-baseline { align-items: baseline !important; } .xl\:items-stretch { align-items: stretch !important; } .xl\:self-auto { align-self: auto !important; } .xl\:self-start { align-self: flex-start !important; } .xl\:self-end { align-self: flex-end !important; } .xl\:self-center { align-self: center !important; } .xl\:self-stretch { align-self: stretch !important; } .xl\:justify-start { justify-content: flex-start !important; } .xl\:justify-end { justify-content: flex-end !important; } .xl\:justify-center { justify-content: center !important; } .xl\:justify-between { justify-content: space-between !important; } .xl\:justify-around { justify-content: space-around !important; } .xl\:justify-evenly { justify-content: space-evenly !important; } .xl\:content-center { align-content: center !important; } .xl\:content-start { align-content: flex-start !important; } .xl\:content-end { align-content: flex-end !important; } .xl\:content-between { align-content: space-between !important; } .xl\:content-around { align-content: space-around !important; } .xl\:flex-0 { flex: 0 0 auto !important; } .xl\:flex-1 { flex: 1 1 0% !important; } .xl\:flex-auto { flex: 1 1 auto !important; } .xl\:flex-initial { flex: 0 1 auto !important; } .xl\:flex-none { flex: none !important; } .xl\:flex-grow-0 { flex-grow: 0 !important; } .xl\:flex-grow { flex-grow: 1 !important; } .xl\:flex-shrink-0 { flex-shrink: 0 !important; } .xl\:flex-shrink { flex-shrink: 1 !important; } .xl\:order-1 { order: 1 !important; } .xl\:order-2 { order: 2 !important; } .xl\:order-3 { order: 3 !important; } .xl\:order-4 { order: 4 !important; } .xl\:order-5 { order: 5 !important; } .xl\:order-6 { order: 6 !important; } .xl\:order-7 { order: 7 !important; } .xl\:order-8 { order: 8 !important; } .xl\:order-9 { order: 9 !important; } .xl\:order-10 { order: 10 !important; } .xl\:order-11 { order: 11 !important; } .xl\:order-12 { order: 12 !important; } .xl\:order-first { order: -9999 !important; } .xl\:order-last { order: 9999 !important; } .xl\:order-none { order: 0 !important; } .xl\:font-hairline { font-weight: 100 !important; } .xl\:font-thin { font-weight: 200 !important; } .xl\:font-light { font-weight: 300 !important; } .xl\:font-normal { font-weight: 400 !important; } .xl\:font-medium { font-weight: 500 !important; } .xl\:font-semibold { font-weight: 600 !important; } .xl\:font-bold { font-weight: 700 !important; } .xl\:font-extrabold { font-weight: 800 !important; } .xl\:font-black { font-weight: 900 !important; } .xl\:h-0 { height: 0 !important; } .xl\:h-1 { height: 0.25rem !important; } .xl\:h-2 { height: 0.5rem !important; } .xl\:h-3 { height: 0.75rem !important; } .xl\:h-4 { height: 1rem !important; } .xl\:h-5 { height: 1.25rem !important; } .xl\:h-6 { height: 1.5rem !important; } .xl\:h-8 { height: 2rem !important; } .xl\:h-10 { height: 2.5rem !important; } .xl\:h-12 { height: 3rem !important; } .xl\:h-14 { height: 3.5rem !important; } .xl\:h-16 { height: 4rem !important; } .xl\:h-18 { height: 4.5rem !important; } .xl\:h-20 { height: 5rem !important; } .xl\:h-22 { height: 5.5rem !important; } .xl\:h-24 { height: 6rem !important; } .xl\:h-26 { height: 6.5rem !important; } .xl\:h-28 { height: 7rem !important; } .xl\:h-30 { height: 7.5rem !important; } .xl\:h-32 { height: 8rem !important; } .xl\:h-36 { height: 9rem !important; } .xl\:h-40 { height: 10rem !important; } .xl\:h-48 { height: 12rem !important; } .xl\:h-50 { height: 12.5rem !important; } .xl\:h-56 { height: 14rem !important; } .xl\:h-60 { height: 15rem !important; } .xl\:h-64 { height: 16rem !important; } .xl\:h-80 { height: 20rem !important; } .xl\:h-90 { height: 24rem !important; } .xl\:h-100 { height: 25rem !important; } .xl\:h-120 { height: 30rem !important; } .xl\:h-128 { height: 32rem !important; } .xl\:h-140 { height: 35rem !important; } .xl\:h-160 { height: 40rem !important; } .xl\:h-180 { height: 45rem !important; } .xl\:h-192 { height: 48rem !important; } .xl\:h-200 { height: 50rem !important; } .xl\:h-240 { height: 60rem !important; } .xl\:h-256 { height: 64rem !important; } .xl\:h-280 { height: 70rem !important; } .xl\:h-320 { height: 80rem !important; } .xl\:h-360 { height: 90rem !important; } .xl\:h-400 { height: 100rem !important; } .xl\:h-480 { height: 120rem !important; } .xl\:h-auto { height: auto !important; } .xl\:h-px { height: 1px !important; } .xl\:h-2px { height: 2px !important; } .xl\:h-full { height: 100% !important; } .xl\:h-screen { height: 100vh !important; } .xl\:h-1\/2 { height: 50% !important; } .xl\:h-1\/3 { height: 33.33333% !important; } .xl\:h-2\/3 { height: 66.66667% !important; } .xl\:h-1\/4 { height: 25% !important; } .xl\:h-2\/4 { height: 50% !important; } .xl\:h-3\/4 { height: 75% !important; } .xl\:h-1\/5 { height: 20% !important; } .xl\:h-2\/5 { height: 40% !important; } .xl\:h-3\/5 { height: 60% !important; } .xl\:h-4\/5 { height: 80% !important; } .xl\:h-1\/12 { height: 8.33333% !important; } .xl\:h-2\/12 { height: 16.66667% !important; } .xl\:h-3\/12 { height: 25% !important; } .xl\:h-4\/12 { height: 33.33333% !important; } .xl\:h-5\/12 { height: 41.66667% !important; } .xl\:h-6\/12 { height: 50% !important; } .xl\:h-7\/12 { height: 58.33333% !important; } .xl\:h-8\/12 { height: 66.66667% !important; } .xl\:h-9\/12 { height: 75% !important; } .xl\:h-10\/12 { height: 83.33333% !important; } .xl\:h-11\/12 { height: 91.66667% !important; } .xl\:text-xs { font-size: 0.625rem !important; } .xl\:text-sm { font-size: 0.75rem !important; } .xl\:text-md { font-size: 0.8125rem !important; } .xl\:text-base { font-size: 0.875rem !important; } .xl\:text-lg { font-size: 1rem !important; } .xl\:text-xl { font-size: 1.125rem !important; } .xl\:text-2xl { font-size: 1.25rem !important; } .xl\:text-3xl { font-size: 1.5rem !important; } .xl\:text-4xl { font-size: 2rem !important; } .xl\:text-5xl { font-size: 2.25rem !important; } .xl\:text-6xl { font-size: 2.5rem !important; } .xl\:text-7xl { font-size: 3rem !important; } .xl\:text-8xl { font-size: 4rem !important; } .xl\:text-9xl { font-size: 6rem !important; } .xl\:text-10xl { font-size: 8rem !important; } .xl\:leading-3 { line-height: .75rem !important; } .xl\:leading-4 { line-height: 1rem !important; } .xl\:leading-5 { line-height: 1.25rem !important; } .xl\:leading-6 { line-height: 1.5rem !important; } .xl\:leading-7 { line-height: 1.75rem !important; } .xl\:leading-8 { line-height: 2rem !important; } .xl\:leading-9 { line-height: 2.25rem !important; } .xl\:leading-10 { line-height: 2.5rem !important; } .xl\:leading-none { line-height: 1 !important; } .xl\:leading-tight { line-height: 1.25 !important; } .xl\:leading-snug { line-height: 1.375 !important; } .xl\:leading-normal { line-height: 1.5 !important; } .xl\:leading-relaxed { line-height: 1.625 !important; } .xl\:leading-loose { line-height: 2 !important; } .xl\:list-inside { list-style-position: inside !important; } .xl\:list-outside { list-style-position: outside !important; } .xl\:list-none { list-style-type: none !important; } .xl\:list-disc { list-style-type: disc !important; } .xl\:list-decimal { list-style-type: decimal !important; } .xl\:m-0 { margin: 0 !important; } .xl\:m-1 { margin: 0.25rem !important; } .xl\:m-2 { margin: 0.5rem !important; } .xl\:m-3 { margin: 0.75rem !important; } .xl\:m-4 { margin: 1rem !important; } .xl\:m-5 { margin: 1.25rem !important; } .xl\:m-6 { margin: 1.5rem !important; } .xl\:m-8 { margin: 2rem !important; } .xl\:m-10 { margin: 2.5rem !important; } .xl\:m-12 { margin: 3rem !important; } .xl\:m-14 { margin: 3.5rem !important; } .xl\:m-16 { margin: 4rem !important; } .xl\:m-18 { margin: 4.5rem !important; } .xl\:m-20 { margin: 5rem !important; } .xl\:m-22 { margin: 5.5rem !important; } .xl\:m-24 { margin: 6rem !important; } .xl\:m-26 { margin: 6.5rem !important; } .xl\:m-28 { margin: 7rem !important; } .xl\:m-30 { margin: 7.5rem !important; } .xl\:m-32 { margin: 8rem !important; } .xl\:m-36 { margin: 9rem !important; } .xl\:m-40 { margin: 10rem !important; } .xl\:m-48 { margin: 12rem !important; } .xl\:m-56 { margin: 14rem !important; } .xl\:m-64 { margin: 16rem !important; } .xl\:m-auto { margin: auto !important; } .xl\:m-px { margin: 1px !important; } .xl\:m-2px { margin: 2px !important; } .xl\:-m-1 { margin: -0.25rem !important; } .xl\:-m-2 { margin: -0.5rem !important; } .xl\:-m-3 { margin: -0.75rem !important; } .xl\:-m-4 { margin: -1rem !important; } .xl\:-m-5 { margin: -1.25rem !important; } .xl\:-m-6 { margin: -1.5rem !important; } .xl\:-m-8 { margin: -2rem !important; } .xl\:-m-10 { margin: -2.5rem !important; } .xl\:-m-12 { margin: -3rem !important; } .xl\:-m-14 { margin: -3.5rem !important; } .xl\:-m-16 { margin: -4rem !important; } .xl\:-m-18 { margin: -4.5rem !important; } .xl\:-m-20 { margin: -5rem !important; } .xl\:-m-22 { margin: -5.5rem !important; } .xl\:-m-24 { margin: -6rem !important; } .xl\:-m-26 { margin: -6.5rem !important; } .xl\:-m-28 { margin: -7rem !important; } .xl\:-m-30 { margin: -7.5rem !important; } .xl\:-m-32 { margin: -8rem !important; } .xl\:-m-36 { margin: -9rem !important; } .xl\:-m-40 { margin: -10rem !important; } .xl\:-m-48 { margin: -12rem !important; } .xl\:-m-56 { margin: -14rem !important; } .xl\:-m-64 { margin: -16rem !important; } .xl\:-m-px { margin: -1px !important; } .xl\:-m-2px { margin: -2px !important; } .xl\:my-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .xl\:mx-0 { margin-left: 0 !important; margin-right: 0 !important; } .xl\:my-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .xl\:mx-1 { margin-left: 0.25rem !important; margin-right: 0.25rem !important; } .xl\:my-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .xl\:mx-2 { margin-left: 0.5rem !important; margin-right: 0.5rem !important; } .xl\:my-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .xl\:mx-3 { margin-left: 0.75rem !important; margin-right: 0.75rem !important; } .xl\:my-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .xl\:mx-4 { margin-left: 1rem !important; margin-right: 1rem !important; } .xl\:my-5 { margin-top: 1.25rem !important; margin-bottom: 1.25rem !important; } .xl\:mx-5 { margin-left: 1.25rem !important; margin-right: 1.25rem !important; } .xl\:my-6 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .xl\:mx-6 { margin-left: 1.5rem !important; margin-right: 1.5rem !important; } .xl\:my-8 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .xl\:mx-8 { margin-left: 2rem !important; margin-right: 2rem !important; } .xl\:my-10 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .xl\:mx-10 { margin-left: 2.5rem !important; margin-right: 2.5rem !important; } .xl\:my-12 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .xl\:mx-12 { margin-left: 3rem !important; margin-right: 3rem !important; } .xl\:my-14 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .xl\:mx-14 { margin-left: 3.5rem !important; margin-right: 3.5rem !important; } .xl\:my-16 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .xl\:mx-16 { margin-left: 4rem !important; margin-right: 4rem !important; } .xl\:my-18 { margin-top: 4.5rem !important; margin-bottom: 4.5rem !important; } .xl\:mx-18 { margin-left: 4.5rem !important; margin-right: 4.5rem !important; } .xl\:my-20 { margin-top: 5rem !important; margin-bottom: 5rem !important; } .xl\:mx-20 { margin-left: 5rem !important; margin-right: 5rem !important; } .xl\:my-22 { margin-top: 5.5rem !important; margin-bottom: 5.5rem !important; } .xl\:mx-22 { margin-left: 5.5rem !important; margin-right: 5.5rem !important; } .xl\:my-24 { margin-top: 6rem !important; margin-bottom: 6rem !important; } .xl\:mx-24 { margin-left: 6rem !important; margin-right: 6rem !important; } .xl\:my-26 { margin-top: 6.5rem !important; margin-bottom: 6.5rem !important; } .xl\:mx-26 { margin-left: 6.5rem !important; margin-right: 6.5rem !important; } .xl\:my-28 { margin-top: 7rem !important; margin-bottom: 7rem !important; } .xl\:mx-28 { margin-left: 7rem !important; margin-right: 7rem !important; } .xl\:my-30 { margin-top: 7.5rem !important; margin-bottom: 7.5rem !important; } .xl\:mx-30 { margin-left: 7.5rem !important; margin-right: 7.5rem !important; } .xl\:my-32 { margin-top: 8rem !important; margin-bottom: 8rem !important; } .xl\:mx-32 { margin-left: 8rem !important; margin-right: 8rem !important; } .xl\:my-36 { margin-top: 9rem !important; margin-bottom: 9rem !important; } .xl\:mx-36 { margin-left: 9rem !important; margin-right: 9rem !important; } .xl\:my-40 { margin-top: 10rem !important; margin-bottom: 10rem !important; } .xl\:mx-40 { margin-left: 10rem !important; margin-right: 10rem !important; } .xl\:my-48 { margin-top: 12rem !important; margin-bottom: 12rem !important; } .xl\:mx-48 { margin-left: 12rem !important; margin-right: 12rem !important; } .xl\:my-56 { margin-top: 14rem !important; margin-bottom: 14rem !important; } .xl\:mx-56 { margin-left: 14rem !important; margin-right: 14rem !important; } .xl\:my-64 { margin-top: 16rem !important; margin-bottom: 16rem !important; } .xl\:mx-64 { margin-left: 16rem !important; margin-right: 16rem !important; } .xl\:my-auto { margin-top: auto !important; margin-bottom: auto !important; } .xl\:mx-auto { margin-left: auto !important; margin-right: auto !important; } .xl\:my-px { margin-top: 1px !important; margin-bottom: 1px !important; } .xl\:mx-px { margin-left: 1px !important; margin-right: 1px !important; } .xl\:my-2px { margin-top: 2px !important; margin-bottom: 2px !important; } .xl\:mx-2px { margin-left: 2px !important; margin-right: 2px !important; } .xl\:-my-1 { margin-top: -0.25rem !important; margin-bottom: -0.25rem !important; } .xl\:-mx-1 { margin-left: -0.25rem !important; margin-right: -0.25rem !important; } .xl\:-my-2 { margin-top: -0.5rem !important; margin-bottom: -0.5rem !important; } .xl\:-mx-2 { margin-left: -0.5rem !important; margin-right: -0.5rem !important; } .xl\:-my-3 { margin-top: -0.75rem !important; margin-bottom: -0.75rem !important; } .xl\:-mx-3 { margin-left: -0.75rem !important; margin-right: -0.75rem !important; } .xl\:-my-4 { margin-top: -1rem !important; margin-bottom: -1rem !important; } .xl\:-mx-4 { margin-left: -1rem !important; margin-right: -1rem !important; } .xl\:-my-5 { margin-top: -1.25rem !important; margin-bottom: -1.25rem !important; } .xl\:-mx-5 { margin-left: -1.25rem !important; margin-right: -1.25rem !important; } .xl\:-my-6 { margin-top: -1.5rem !important; margin-bottom: -1.5rem !important; } .xl\:-mx-6 { margin-left: -1.5rem !important; margin-right: -1.5rem !important; } .xl\:-my-8 { margin-top: -2rem !important; margin-bottom: -2rem !important; } .xl\:-mx-8 { margin-left: -2rem !important; margin-right: -2rem !important; } .xl\:-my-10 { margin-top: -2.5rem !important; margin-bottom: -2.5rem !important; } .xl\:-mx-10 { margin-left: -2.5rem !important; margin-right: -2.5rem !important; } .xl\:-my-12 { margin-top: -3rem !important; margin-bottom: -3rem !important; } .xl\:-mx-12 { margin-left: -3rem !important; margin-right: -3rem !important; } .xl\:-my-14 { margin-top: -3.5rem !important; margin-bottom: -3.5rem !important; } .xl\:-mx-14 { margin-left: -3.5rem !important; margin-right: -3.5rem !important; } .xl\:-my-16 { margin-top: -4rem !important; margin-bottom: -4rem !important; } .xl\:-mx-16 { margin-left: -4rem !important; margin-right: -4rem !important; } .xl\:-my-18 { margin-top: -4.5rem !important; margin-bottom: -4.5rem !important; } .xl\:-mx-18 { margin-left: -4.5rem !important; margin-right: -4.5rem !important; } .xl\:-my-20 { margin-top: -5rem !important; margin-bottom: -5rem !important; } .xl\:-mx-20 { margin-left: -5rem !important; margin-right: -5rem !important; } .xl\:-my-22 { margin-top: -5.5rem !important; margin-bottom: -5.5rem !important; } .xl\:-mx-22 { margin-left: -5.5rem !important; margin-right: -5.5rem !important; } .xl\:-my-24 { margin-top: -6rem !important; margin-bottom: -6rem !important; } .xl\:-mx-24 { margin-left: -6rem !important; margin-right: -6rem !important; } .xl\:-my-26 { margin-top: -6.5rem !important; margin-bottom: -6.5rem !important; } .xl\:-mx-26 { margin-left: -6.5rem !important; margin-right: -6.5rem !important; } .xl\:-my-28 { margin-top: -7rem !important; margin-bottom: -7rem !important; } .xl\:-mx-28 { margin-left: -7rem !important; margin-right: -7rem !important; } .xl\:-my-30 { margin-top: -7.5rem !important; margin-bottom: -7.5rem !important; } .xl\:-mx-30 { margin-left: -7.5rem !important; margin-right: -7.5rem !important; } .xl\:-my-32 { margin-top: -8rem !important; margin-bottom: -8rem !important; } .xl\:-mx-32 { margin-left: -8rem !important; margin-right: -8rem !important; } .xl\:-my-36 { margin-top: -9rem !important; margin-bottom: -9rem !important; } .xl\:-mx-36 { margin-left: -9rem !important; margin-right: -9rem !important; } .xl\:-my-40 { margin-top: -10rem !important; margin-bottom: -10rem !important; } .xl\:-mx-40 { margin-left: -10rem !important; margin-right: -10rem !important; } .xl\:-my-48 { margin-top: -12rem !important; margin-bottom: -12rem !important; } .xl\:-mx-48 { margin-left: -12rem !important; margin-right: -12rem !important; } .xl\:-my-56 { margin-top: -14rem !important; margin-bottom: -14rem !important; } .xl\:-mx-56 { margin-left: -14rem !important; margin-right: -14rem !important; } .xl\:-my-64 { margin-top: -16rem !important; margin-bottom: -16rem !important; } .xl\:-mx-64 { margin-left: -16rem !important; margin-right: -16rem !important; } .xl\:-my-px { margin-top: -1px !important; margin-bottom: -1px !important; } .xl\:-mx-px { margin-left: -1px !important; margin-right: -1px !important; } .xl\:-my-2px { margin-top: -2px !important; margin-bottom: -2px !important; } .xl\:-mx-2px { margin-left: -2px !important; margin-right: -2px !important; } .xl\:mt-0 { margin-top: 0 !important; } .xl\:mr-0 { margin-right: 0 !important; } .xl\:mb-0 { margin-bottom: 0 !important; } .xl\:ml-0 { margin-left: 0 !important; } .xl\:mt-1 { margin-top: 0.25rem !important; } .xl\:mr-1 { margin-right: 0.25rem !important; } .xl\:mb-1 { margin-bottom: 0.25rem !important; } .xl\:ml-1 { margin-left: 0.25rem !important; } .xl\:mt-2 { margin-top: 0.5rem !important; } .xl\:mr-2 { margin-right: 0.5rem !important; } .xl\:mb-2 { margin-bottom: 0.5rem !important; } .xl\:ml-2 { margin-left: 0.5rem !important; } .xl\:mt-3 { margin-top: 0.75rem !important; } .xl\:mr-3 { margin-right: 0.75rem !important; } .xl\:mb-3 { margin-bottom: 0.75rem !important; } .xl\:ml-3 { margin-left: 0.75rem !important; } .xl\:mt-4 { margin-top: 1rem !important; } .xl\:mr-4 { margin-right: 1rem !important; } .xl\:mb-4 { margin-bottom: 1rem !important; } .xl\:ml-4 { margin-left: 1rem !important; } .xl\:mt-5 { margin-top: 1.25rem !important; } .xl\:mr-5 { margin-right: 1.25rem !important; } .xl\:mb-5 { margin-bottom: 1.25rem !important; } .xl\:ml-5 { margin-left: 1.25rem !important; } .xl\:mt-6 { margin-top: 1.5rem !important; } .xl\:mr-6 { margin-right: 1.5rem !important; } .xl\:mb-6 { margin-bottom: 1.5rem !important; } .xl\:ml-6 { margin-left: 1.5rem !important; } .xl\:mt-8 { margin-top: 2rem !important; } .xl\:mr-8 { margin-right: 2rem !important; } .xl\:mb-8 { margin-bottom: 2rem !important; } .xl\:ml-8 { margin-left: 2rem !important; } .xl\:mt-10 { margin-top: 2.5rem !important; } .xl\:mr-10 { margin-right: 2.5rem !important; } .xl\:mb-10 { margin-bottom: 2.5rem !important; } .xl\:ml-10 { margin-left: 2.5rem !important; } .xl\:mt-12 { margin-top: 3rem !important; } .xl\:mr-12 { margin-right: 3rem !important; } .xl\:mb-12 { margin-bottom: 3rem !important; } .xl\:ml-12 { margin-left: 3rem !important; } .xl\:mt-14 { margin-top: 3.5rem !important; } .xl\:mr-14 { margin-right: 3.5rem !important; } .xl\:mb-14 { margin-bottom: 3.5rem !important; } .xl\:ml-14 { margin-left: 3.5rem !important; } .xl\:mt-16 { margin-top: 4rem !important; } .xl\:mr-16 { margin-right: 4rem !important; } .xl\:mb-16 { margin-bottom: 4rem !important; } .xl\:ml-16 { margin-left: 4rem !important; } .xl\:mt-18 { margin-top: 4.5rem !important; } .xl\:mr-18 { margin-right: 4.5rem !important; } .xl\:mb-18 { margin-bottom: 4.5rem !important; } .xl\:ml-18 { margin-left: 4.5rem !important; } .xl\:mt-20 { margin-top: 5rem !important; } .xl\:mr-20 { margin-right: 5rem !important; } .xl\:mb-20 { margin-bottom: 5rem !important; } .xl\:ml-20 { margin-left: 5rem !important; } .xl\:mt-22 { margin-top: 5.5rem !important; } .xl\:mr-22 { margin-right: 5.5rem !important; } .xl\:mb-22 { margin-bottom: 5.5rem !important; } .xl\:ml-22 { margin-left: 5.5rem !important; } .xl\:mt-24 { margin-top: 6rem !important; } .xl\:mr-24 { margin-right: 6rem !important; } .xl\:mb-24 { margin-bottom: 6rem !important; } .xl\:ml-24 { margin-left: 6rem !important; } .xl\:mt-26 { margin-top: 6.5rem !important; } .xl\:mr-26 { margin-right: 6.5rem !important; } .xl\:mb-26 { margin-bottom: 6.5rem !important; } .xl\:ml-26 { margin-left: 6.5rem !important; } .xl\:mt-28 { margin-top: 7rem !important; } .xl\:mr-28 { margin-right: 7rem !important; } .xl\:mb-28 { margin-bottom: 7rem !important; } .xl\:ml-28 { margin-left: 7rem !important; } .xl\:mt-30 { margin-top: 7.5rem !important; } .xl\:mr-30 { margin-right: 7.5rem !important; } .xl\:mb-30 { margin-bottom: 7.5rem !important; } .xl\:ml-30 { margin-left: 7.5rem !important; } .xl\:mt-32 { margin-top: 8rem !important; } .xl\:mr-32 { margin-right: 8rem !important; } .xl\:mb-32 { margin-bottom: 8rem !important; } .xl\:ml-32 { margin-left: 8rem !important; } .xl\:mt-36 { margin-top: 9rem !important; } .xl\:mr-36 { margin-right: 9rem !important; } .xl\:mb-36 { margin-bottom: 9rem !important; } .xl\:ml-36 { margin-left: 9rem !important; } .xl\:mt-40 { margin-top: 10rem !important; } .xl\:mr-40 { margin-right: 10rem !important; } .xl\:mb-40 { margin-bottom: 10rem !important; } .xl\:ml-40 { margin-left: 10rem !important; } .xl\:mt-48 { margin-top: 12rem !important; } .xl\:mr-48 { margin-right: 12rem !important; } .xl\:mb-48 { margin-bottom: 12rem !important; } .xl\:ml-48 { margin-left: 12rem !important; } .xl\:mt-56 { margin-top: 14rem !important; } .xl\:mr-56 { margin-right: 14rem !important; } .xl\:mb-56 { margin-bottom: 14rem !important; } .xl\:ml-56 { margin-left: 14rem !important; } .xl\:mt-64 { margin-top: 16rem !important; } .xl\:mr-64 { margin-right: 16rem !important; } .xl\:mb-64 { margin-bottom: 16rem !important; } .xl\:ml-64 { margin-left: 16rem !important; } .xl\:mt-auto { margin-top: auto !important; } .xl\:mr-auto { margin-right: auto !important; } .xl\:mb-auto { margin-bottom: auto !important; } .xl\:ml-auto { margin-left: auto !important; } .xl\:mt-px { margin-top: 1px !important; } .xl\:mr-px { margin-right: 1px !important; } .xl\:mb-px { margin-bottom: 1px !important; } .xl\:ml-px { margin-left: 1px !important; } .xl\:mt-2px { margin-top: 2px !important; } .xl\:mr-2px { margin-right: 2px !important; } .xl\:mb-2px { margin-bottom: 2px !important; } .xl\:ml-2px { margin-left: 2px !important; } .xl\:-mt-1 { margin-top: -0.25rem !important; } .xl\:-mr-1 { margin-right: -0.25rem !important; } .xl\:-mb-1 { margin-bottom: -0.25rem !important; } .xl\:-ml-1 { margin-left: -0.25rem !important; } .xl\:-mt-2 { margin-top: -0.5rem !important; } .xl\:-mr-2 { margin-right: -0.5rem !important; } .xl\:-mb-2 { margin-bottom: -0.5rem !important; } .xl\:-ml-2 { margin-left: -0.5rem !important; } .xl\:-mt-3 { margin-top: -0.75rem !important; } .xl\:-mr-3 { margin-right: -0.75rem !important; } .xl\:-mb-3 { margin-bottom: -0.75rem !important; } .xl\:-ml-3 { margin-left: -0.75rem !important; } .xl\:-mt-4 { margin-top: -1rem !important; } .xl\:-mr-4 { margin-right: -1rem !important; } .xl\:-mb-4 { margin-bottom: -1rem !important; } .xl\:-ml-4 { margin-left: -1rem !important; } .xl\:-mt-5 { margin-top: -1.25rem !important; } .xl\:-mr-5 { margin-right: -1.25rem !important; } .xl\:-mb-5 { margin-bottom: -1.25rem !important; } .xl\:-ml-5 { margin-left: -1.25rem !important; } .xl\:-mt-6 { margin-top: -1.5rem !important; } .xl\:-mr-6 { margin-right: -1.5rem !important; } .xl\:-mb-6 { margin-bottom: -1.5rem !important; } .xl\:-ml-6 { margin-left: -1.5rem !important; } .xl\:-mt-8 { margin-top: -2rem !important; } .xl\:-mr-8 { margin-right: -2rem !important; } .xl\:-mb-8 { margin-bottom: -2rem !important; } .xl\:-ml-8 { margin-left: -2rem !important; } .xl\:-mt-10 { margin-top: -2.5rem !important; } .xl\:-mr-10 { margin-right: -2.5rem !important; } .xl\:-mb-10 { margin-bottom: -2.5rem !important; } .xl\:-ml-10 { margin-left: -2.5rem !important; } .xl\:-mt-12 { margin-top: -3rem !important; } .xl\:-mr-12 { margin-right: -3rem !important; } .xl\:-mb-12 { margin-bottom: -3rem !important; } .xl\:-ml-12 { margin-left: -3rem !important; } .xl\:-mt-14 { margin-top: -3.5rem !important; } .xl\:-mr-14 { margin-right: -3.5rem !important; } .xl\:-mb-14 { margin-bottom: -3.5rem !important; } .xl\:-ml-14 { margin-left: -3.5rem !important; } .xl\:-mt-16 { margin-top: -4rem !important; } .xl\:-mr-16 { margin-right: -4rem !important; } .xl\:-mb-16 { margin-bottom: -4rem !important; } .xl\:-ml-16 { margin-left: -4rem !important; } .xl\:-mt-18 { margin-top: -4.5rem !important; } .xl\:-mr-18 { margin-right: -4.5rem !important; } .xl\:-mb-18 { margin-bottom: -4.5rem !important; } .xl\:-ml-18 { margin-left: -4.5rem !important; } .xl\:-mt-20 { margin-top: -5rem !important; } .xl\:-mr-20 { margin-right: -5rem !important; } .xl\:-mb-20 { margin-bottom: -5rem !important; } .xl\:-ml-20 { margin-left: -5rem !important; } .xl\:-mt-22 { margin-top: -5.5rem !important; } .xl\:-mr-22 { margin-right: -5.5rem !important; } .xl\:-mb-22 { margin-bottom: -5.5rem !important; } .xl\:-ml-22 { margin-left: -5.5rem !important; } .xl\:-mt-24 { margin-top: -6rem !important; } .xl\:-mr-24 { margin-right: -6rem !important; } .xl\:-mb-24 { margin-bottom: -6rem !important; } .xl\:-ml-24 { margin-left: -6rem !important; } .xl\:-mt-26 { margin-top: -6.5rem !important; } .xl\:-mr-26 { margin-right: -6.5rem !important; } .xl\:-mb-26 { margin-bottom: -6.5rem !important; } .xl\:-ml-26 { margin-left: -6.5rem !important; } .xl\:-mt-28 { margin-top: -7rem !important; } .xl\:-mr-28 { margin-right: -7rem !important; } .xl\:-mb-28 { margin-bottom: -7rem !important; } .xl\:-ml-28 { margin-left: -7rem !important; } .xl\:-mt-30 { margin-top: -7.5rem !important; } .xl\:-mr-30 { margin-right: -7.5rem !important; } .xl\:-mb-30 { margin-bottom: -7.5rem !important; } .xl\:-ml-30 { margin-left: -7.5rem !important; } .xl\:-mt-32 { margin-top: -8rem !important; } .xl\:-mr-32 { margin-right: -8rem !important; } .xl\:-mb-32 { margin-bottom: -8rem !important; } .xl\:-ml-32 { margin-left: -8rem !important; } .xl\:-mt-36 { margin-top: -9rem !important; } .xl\:-mr-36 { margin-right: -9rem !important; } .xl\:-mb-36 { margin-bottom: -9rem !important; } .xl\:-ml-36 { margin-left: -9rem !important; } .xl\:-mt-40 { margin-top: -10rem !important; } .xl\:-mr-40 { margin-right: -10rem !important; } .xl\:-mb-40 { margin-bottom: -10rem !important; } .xl\:-ml-40 { margin-left: -10rem !important; } .xl\:-mt-48 { margin-top: -12rem !important; } .xl\:-mr-48 { margin-right: -12rem !important; } .xl\:-mb-48 { margin-bottom: -12rem !important; } .xl\:-ml-48 { margin-left: -12rem !important; } .xl\:-mt-56 { margin-top: -14rem !important; } .xl\:-mr-56 { margin-right: -14rem !important; } .xl\:-mb-56 { margin-bottom: -14rem !important; } .xl\:-ml-56 { margin-left: -14rem !important; } .xl\:-mt-64 { margin-top: -16rem !important; } .xl\:-mr-64 { margin-right: -16rem !important; } .xl\:-mb-64 { margin-bottom: -16rem !important; } .xl\:-ml-64 { margin-left: -16rem !important; } .xl\:-mt-px { margin-top: -1px !important; } .xl\:-mr-px { margin-right: -1px !important; } .xl\:-mb-px { margin-bottom: -1px !important; } .xl\:-ml-px { margin-left: -1px !important; } .xl\:-mt-2px { margin-top: -2px !important; } .xl\:-mr-2px { margin-right: -2px !important; } .xl\:-mb-2px { margin-bottom: -2px !important; } .xl\:-ml-2px { margin-left: -2px !important; } .xl\:max-h-0 { max-height: 0 !important; } .xl\:max-h-1 { max-height: 0.25rem !important; } .xl\:max-h-2 { max-height: 0.5rem !important; } .xl\:max-h-3 { max-height: 0.75rem !important; } .xl\:max-h-4 { max-height: 1rem !important; } .xl\:max-h-5 { max-height: 1.25rem !important; } .xl\:max-h-6 { max-height: 1.5rem !important; } .xl\:max-h-8 { max-height: 2rem !important; } .xl\:max-h-10 { max-height: 2.5rem !important; } .xl\:max-h-12 { max-height: 3rem !important; } .xl\:max-h-14 { max-height: 3.5rem !important; } .xl\:max-h-16 { max-height: 4rem !important; } .xl\:max-h-18 { max-height: 4.5rem !important; } .xl\:max-h-20 { max-height: 5rem !important; } .xl\:max-h-22 { max-height: 5.5rem !important; } .xl\:max-h-24 { max-height: 6rem !important; } .xl\:max-h-26 { max-height: 6.5rem !important; } .xl\:max-h-28 { max-height: 7rem !important; } .xl\:max-h-30 { max-height: 7.5rem !important; } .xl\:max-h-32 { max-height: 8rem !important; } .xl\:max-h-36 { max-height: 9rem !important; } .xl\:max-h-40 { max-height: 10rem !important; } .xl\:max-h-48 { max-height: 12rem !important; } .xl\:max-h-50 { max-height: 12.5rem !important; } .xl\:max-h-56 { max-height: 14rem !important; } .xl\:max-h-60 { max-height: 15rem !important; } .xl\:max-h-64 { max-height: 16rem !important; } .xl\:max-h-80 { max-height: 20rem !important; } .xl\:max-h-90 { max-height: 24rem !important; } .xl\:max-h-100 { max-height: 25rem !important; } .xl\:max-h-120 { max-height: 30rem !important; } .xl\:max-h-128 { max-height: 32rem !important; } .xl\:max-h-140 { max-height: 35rem !important; } .xl\:max-h-160 { max-height: 40rem !important; } .xl\:max-h-180 { max-height: 45rem !important; } .xl\:max-h-192 { max-height: 48rem !important; } .xl\:max-h-200 { max-height: 50rem !important; } .xl\:max-h-240 { max-height: 60rem !important; } .xl\:max-h-256 { max-height: 64rem !important; } .xl\:max-h-280 { max-height: 70rem !important; } .xl\:max-h-320 { max-height: 80rem !important; } .xl\:max-h-360 { max-height: 90rem !important; } .xl\:max-h-400 { max-height: 100rem !important; } .xl\:max-h-480 { max-height: 120rem !important; } .xl\:max-h-full { max-height: 100% !important; } .xl\:max-h-screen { max-height: 100vh !important; } .xl\:max-h-none { max-height: none !important; } .xl\:max-h-px { max-height: 1px !important; } .xl\:max-h-2px { max-height: 2px !important; } .xl\:max-h-1\/2 { max-height: 50% !important; } .xl\:max-h-1\/3 { max-height: 33.33333% !important; } .xl\:max-h-2\/3 { max-height: 66.66667% !important; } .xl\:max-h-1\/4 { max-height: 25% !important; } .xl\:max-h-2\/4 { max-height: 50% !important; } .xl\:max-h-3\/4 { max-height: 75% !important; } .xl\:max-h-1\/5 { max-height: 20% !important; } .xl\:max-h-2\/5 { max-height: 40% !important; } .xl\:max-h-3\/5 { max-height: 60% !important; } .xl\:max-h-4\/5 { max-height: 80% !important; } .xl\:max-h-1\/12 { max-height: 8.33333% !important; } .xl\:max-h-2\/12 { max-height: 16.66667% !important; } .xl\:max-h-3\/12 { max-height: 25% !important; } .xl\:max-h-4\/12 { max-height: 33.33333% !important; } .xl\:max-h-5\/12 { max-height: 41.66667% !important; } .xl\:max-h-6\/12 { max-height: 50% !important; } .xl\:max-h-7\/12 { max-height: 58.33333% !important; } .xl\:max-h-8\/12 { max-height: 66.66667% !important; } .xl\:max-h-9\/12 { max-height: 75% !important; } .xl\:max-h-10\/12 { max-height: 83.33333% !important; } .xl\:max-h-11\/12 { max-height: 91.66667% !important; } .xl\:max-w-0 { max-width: 0 !important; } .xl\:max-w-1 { max-width: 0.25rem !important; } .xl\:max-w-2 { max-width: 0.5rem !important; } .xl\:max-w-3 { max-width: 0.75rem !important; } .xl\:max-w-4 { max-width: 1rem !important; } .xl\:max-w-5 { max-width: 1.25rem !important; } .xl\:max-w-6 { max-width: 1.5rem !important; } .xl\:max-w-8 { max-width: 2rem !important; } .xl\:max-w-10 { max-width: 2.5rem !important; } .xl\:max-w-12 { max-width: 3rem !important; } .xl\:max-w-14 { max-width: 3.5rem !important; } .xl\:max-w-16 { max-width: 4rem !important; } .xl\:max-w-18 { max-width: 4.5rem !important; } .xl\:max-w-20 { max-width: 5rem !important; } .xl\:max-w-22 { max-width: 5.5rem !important; } .xl\:max-w-24 { max-width: 6rem !important; } .xl\:max-w-26 { max-width: 6.5rem !important; } .xl\:max-w-28 { max-width: 7rem !important; } .xl\:max-w-30 { max-width: 7.5rem !important; } .xl\:max-w-32 { max-width: 8rem !important; } .xl\:max-w-36 { max-width: 9rem !important; } .xl\:max-w-40 { max-width: 10rem !important; } .xl\:max-w-48 { max-width: 12rem !important; } .xl\:max-w-50 { max-width: 12.5rem !important; } .xl\:max-w-56 { max-width: 14rem !important; } .xl\:max-w-60 { max-width: 15rem !important; } .xl\:max-w-64 { max-width: 16rem !important; } .xl\:max-w-80 { max-width: 20rem !important; } .xl\:max-w-90 { max-width: 24rem !important; } .xl\:max-w-100 { max-width: 25rem !important; } .xl\:max-w-120 { max-width: 30rem !important; } .xl\:max-w-128 { max-width: 32rem !important; } .xl\:max-w-140 { max-width: 35rem !important; } .xl\:max-w-160 { max-width: 40rem !important; } .xl\:max-w-180 { max-width: 45rem !important; } .xl\:max-w-192 { max-width: 48rem !important; } .xl\:max-w-200 { max-width: 50rem !important; } .xl\:max-w-240 { max-width: 60rem !important; } .xl\:max-w-256 { max-width: 64rem !important; } .xl\:max-w-280 { max-width: 70rem !important; } .xl\:max-w-320 { max-width: 80rem !important; } .xl\:max-w-360 { max-width: 90rem !important; } .xl\:max-w-400 { max-width: 100rem !important; } .xl\:max-w-480 { max-width: 120rem !important; } .xl\:max-w-none { max-width: none !important; } .xl\:max-w-xs { max-width: 20rem !important; } .xl\:max-w-sm { max-width: 24rem !important; } .xl\:max-w-md { max-width: 28rem !important; } .xl\:max-w-lg { max-width: 32rem !important; } .xl\:max-w-xl { max-width: 36rem !important; } .xl\:max-w-2xl { max-width: 42rem !important; } .xl\:max-w-3xl { max-width: 48rem !important; } .xl\:max-w-4xl { max-width: 56rem !important; } .xl\:max-w-5xl { max-width: 64rem !important; } .xl\:max-w-6xl { max-width: 72rem !important; } .xl\:max-w-full { max-width: 100% !important; } .xl\:max-w-screen { max-width: 100vw !important; } .xl\:max-w-px { max-width: 1px !important; } .xl\:max-w-2px { max-width: 2px !important; } .xl\:max-w-1\/2 { max-width: 50% !important; } .xl\:max-w-1\/3 { max-width: 33.33333% !important; } .xl\:max-w-2\/3 { max-width: 66.66667% !important; } .xl\:max-w-1\/4 { max-width: 25% !important; } .xl\:max-w-2\/4 { max-width: 50% !important; } .xl\:max-w-3\/4 { max-width: 75% !important; } .xl\:max-w-1\/5 { max-width: 20% !important; } .xl\:max-w-2\/5 { max-width: 40% !important; } .xl\:max-w-3\/5 { max-width: 60% !important; } .xl\:max-w-4\/5 { max-width: 80% !important; } .xl\:max-w-1\/12 { max-width: 8.33333% !important; } .xl\:max-w-2\/12 { max-width: 16.66667% !important; } .xl\:max-w-3\/12 { max-width: 25% !important; } .xl\:max-w-4\/12 { max-width: 33.33333% !important; } .xl\:max-w-5\/12 { max-width: 41.66667% !important; } .xl\:max-w-6\/12 { max-width: 50% !important; } .xl\:max-w-7\/12 { max-width: 58.33333% !important; } .xl\:max-w-8\/12 { max-width: 66.66667% !important; } .xl\:max-w-9\/12 { max-width: 75% !important; } .xl\:max-w-10\/12 { max-width: 83.33333% !important; } .xl\:max-w-11\/12 { max-width: 91.66667% !important; } .xl\:min-h-0 { min-height: 0 !important; } .xl\:min-h-1 { min-height: 0.25rem !important; } .xl\:min-h-2 { min-height: 0.5rem !important; } .xl\:min-h-3 { min-height: 0.75rem !important; } .xl\:min-h-4 { min-height: 1rem !important; } .xl\:min-h-5 { min-height: 1.25rem !important; } .xl\:min-h-6 { min-height: 1.5rem !important; } .xl\:min-h-8 { min-height: 2rem !important; } .xl\:min-h-10 { min-height: 2.5rem !important; } .xl\:min-h-12 { min-height: 3rem !important; } .xl\:min-h-14 { min-height: 3.5rem !important; } .xl\:min-h-16 { min-height: 4rem !important; } .xl\:min-h-18 { min-height: 4.5rem !important; } .xl\:min-h-20 { min-height: 5rem !important; } .xl\:min-h-22 { min-height: 5.5rem !important; } .xl\:min-h-24 { min-height: 6rem !important; } .xl\:min-h-26 { min-height: 6.5rem !important; } .xl\:min-h-28 { min-height: 7rem !important; } .xl\:min-h-30 { min-height: 7.5rem !important; } .xl\:min-h-32 { min-height: 8rem !important; } .xl\:min-h-36 { min-height: 9rem !important; } .xl\:min-h-40 { min-height: 10rem !important; } .xl\:min-h-48 { min-height: 12rem !important; } .xl\:min-h-50 { min-height: 12.5rem !important; } .xl\:min-h-56 { min-height: 14rem !important; } .xl\:min-h-60 { min-height: 15rem !important; } .xl\:min-h-64 { min-height: 16rem !important; } .xl\:min-h-80 { min-height: 20rem !important; } .xl\:min-h-90 { min-height: 24rem !important; } .xl\:min-h-100 { min-height: 25rem !important; } .xl\:min-h-120 { min-height: 30rem !important; } .xl\:min-h-128 { min-height: 32rem !important; } .xl\:min-h-140 { min-height: 35rem !important; } .xl\:min-h-160 { min-height: 40rem !important; } .xl\:min-h-180 { min-height: 45rem !important; } .xl\:min-h-192 { min-height: 48rem !important; } .xl\:min-h-200 { min-height: 50rem !important; } .xl\:min-h-240 { min-height: 60rem !important; } .xl\:min-h-256 { min-height: 64rem !important; } .xl\:min-h-280 { min-height: 70rem !important; } .xl\:min-h-320 { min-height: 80rem !important; } .xl\:min-h-360 { min-height: 90rem !important; } .xl\:min-h-400 { min-height: 100rem !important; } .xl\:min-h-480 { min-height: 120rem !important; } .xl\:min-h-full { min-height: 100% !important; } .xl\:min-h-screen { min-height: 100vh !important; } .xl\:min-h-px { min-height: 1px !important; } .xl\:min-h-2px { min-height: 2px !important; } .xl\:min-h-1\/2 { min-height: 50% !important; } .xl\:min-h-1\/3 { min-height: 33.33333% !important; } .xl\:min-h-2\/3 { min-height: 66.66667% !important; } .xl\:min-h-1\/4 { min-height: 25% !important; } .xl\:min-h-2\/4 { min-height: 50% !important; } .xl\:min-h-3\/4 { min-height: 75% !important; } .xl\:min-h-1\/5 { min-height: 20% !important; } .xl\:min-h-2\/5 { min-height: 40% !important; } .xl\:min-h-3\/5 { min-height: 60% !important; } .xl\:min-h-4\/5 { min-height: 80% !important; } .xl\:min-h-1\/12 { min-height: 8.33333% !important; } .xl\:min-h-2\/12 { min-height: 16.66667% !important; } .xl\:min-h-3\/12 { min-height: 25% !important; } .xl\:min-h-4\/12 { min-height: 33.33333% !important; } .xl\:min-h-5\/12 { min-height: 41.66667% !important; } .xl\:min-h-6\/12 { min-height: 50% !important; } .xl\:min-h-7\/12 { min-height: 58.33333% !important; } .xl\:min-h-8\/12 { min-height: 66.66667% !important; } .xl\:min-h-9\/12 { min-height: 75% !important; } .xl\:min-h-10\/12 { min-height: 83.33333% !important; } .xl\:min-h-11\/12 { min-height: 91.66667% !important; } .xl\:min-w-0 { min-width: 0 !important; } .xl\:min-w-1 { min-width: 0.25rem !important; } .xl\:min-w-2 { min-width: 0.5rem !important; } .xl\:min-w-3 { min-width: 0.75rem !important; } .xl\:min-w-4 { min-width: 1rem !important; } .xl\:min-w-5 { min-width: 1.25rem !important; } .xl\:min-w-6 { min-width: 1.5rem !important; } .xl\:min-w-8 { min-width: 2rem !important; } .xl\:min-w-10 { min-width: 2.5rem !important; } .xl\:min-w-12 { min-width: 3rem !important; } .xl\:min-w-14 { min-width: 3.5rem !important; } .xl\:min-w-16 { min-width: 4rem !important; } .xl\:min-w-18 { min-width: 4.5rem !important; } .xl\:min-w-20 { min-width: 5rem !important; } .xl\:min-w-22 { min-width: 5.5rem !important; } .xl\:min-w-24 { min-width: 6rem !important; } .xl\:min-w-26 { min-width: 6.5rem !important; } .xl\:min-w-28 { min-width: 7rem !important; } .xl\:min-w-30 { min-width: 7.5rem !important; } .xl\:min-w-32 { min-width: 8rem !important; } .xl\:min-w-36 { min-width: 9rem !important; } .xl\:min-w-40 { min-width: 10rem !important; } .xl\:min-w-48 { min-width: 12rem !important; } .xl\:min-w-50 { min-width: 12.5rem !important; } .xl\:min-w-56 { min-width: 14rem !important; } .xl\:min-w-60 { min-width: 15rem !important; } .xl\:min-w-64 { min-width: 16rem !important; } .xl\:min-w-80 { min-width: 20rem !important; } .xl\:min-w-90 { min-width: 24rem !important; } .xl\:min-w-100 { min-width: 25rem !important; } .xl\:min-w-120 { min-width: 30rem !important; } .xl\:min-w-128 { min-width: 32rem !important; } .xl\:min-w-140 { min-width: 35rem !important; } .xl\:min-w-160 { min-width: 40rem !important; } .xl\:min-w-180 { min-width: 45rem !important; } .xl\:min-w-192 { min-width: 48rem !important; } .xl\:min-w-200 { min-width: 50rem !important; } .xl\:min-w-240 { min-width: 60rem !important; } .xl\:min-w-256 { min-width: 64rem !important; } .xl\:min-w-280 { min-width: 70rem !important; } .xl\:min-w-320 { min-width: 80rem !important; } .xl\:min-w-360 { min-width: 90rem !important; } .xl\:min-w-400 { min-width: 100rem !important; } .xl\:min-w-480 { min-width: 120rem !important; } .xl\:min-w-full { min-width: 100% !important; } .xl\:min-w-screen { min-width: 100vw !important; } .xl\:min-w-px { min-width: 1px !important; } .xl\:min-w-2px { min-width: 2px !important; } .xl\:min-w-1\/2 { min-width: 50% !important; } .xl\:min-w-1\/3 { min-width: 33.33333% !important; } .xl\:min-w-2\/3 { min-width: 66.66667% !important; } .xl\:min-w-1\/4 { min-width: 25% !important; } .xl\:min-w-2\/4 { min-width: 50% !important; } .xl\:min-w-3\/4 { min-width: 75% !important; } .xl\:min-w-1\/5 { min-width: 20% !important; } .xl\:min-w-2\/5 { min-width: 40% !important; } .xl\:min-w-3\/5 { min-width: 60% !important; } .xl\:min-w-4\/5 { min-width: 80% !important; } .xl\:min-w-1\/12 { min-width: 8.33333% !important; } .xl\:min-w-2\/12 { min-width: 16.66667% !important; } .xl\:min-w-3\/12 { min-width: 25% !important; } .xl\:min-w-4\/12 { min-width: 33.33333% !important; } .xl\:min-w-5\/12 { min-width: 41.66667% !important; } .xl\:min-w-6\/12 { min-width: 50% !important; } .xl\:min-w-7\/12 { min-width: 58.33333% !important; } .xl\:min-w-8\/12 { min-width: 66.66667% !important; } .xl\:min-w-9\/12 { min-width: 75% !important; } .xl\:min-w-10\/12 { min-width: 83.33333% !important; } .xl\:min-w-11\/12 { min-width: 91.66667% !important; } .xl\:object-contain { -o-object-fit: contain !important; object-fit: contain !important; } .xl\:object-cover { -o-object-fit: cover !important; object-fit: cover !important; } .xl\:object-fill { -o-object-fit: fill !important; object-fit: fill !important; } .xl\:object-none { -o-object-fit: none !important; object-fit: none !important; } .xl\:object-scale-down { -o-object-fit: scale-down !important; object-fit: scale-down !important; } .xl\:object-bottom { -o-object-position: bottom !important; object-position: bottom !important; } .xl\:object-center { -o-object-position: center !important; object-position: center !important; } .xl\:object-left { -o-object-position: left !important; object-position: left !important; } .xl\:object-left-bottom { -o-object-position: left bottom !important; object-position: left bottom !important; } .xl\:object-left-top { -o-object-position: left top !important; object-position: left top !important; } .xl\:object-right { -o-object-position: right !important; object-position: right !important; } .xl\:object-right-bottom { -o-object-position: right bottom !important; object-position: right bottom !important; } .xl\:object-right-top { -o-object-position: right top !important; object-position: right top !important; } .xl\:object-top { -o-object-position: top !important; object-position: top !important; } .xl\:opacity-0 { opacity: 0 !important; } .xl\:opacity-12 { opacity: 0.12 !important; } .xl\:opacity-25 { opacity: 0.25 !important; } .xl\:opacity-38 { opacity: 0.38 !important; } .xl\:opacity-50 { opacity: 0.5 !important; } .xl\:opacity-54 { opacity: 0.54 !important; } .xl\:opacity-70 { opacity: 0.70 !important; } .xl\:opacity-75 { opacity: 0.75 !important; } .xl\:opacity-84 { opacity: 0.84 !important; } .xl\:opacity-100 { opacity: 1 !important; } .xl\:hover\:opacity-0:hover { opacity: 0 !important; } .xl\:hover\:opacity-12:hover { opacity: 0.12 !important; } .xl\:hover\:opacity-25:hover { opacity: 0.25 !important; } .xl\:hover\:opacity-38:hover { opacity: 0.38 !important; } .xl\:hover\:opacity-50:hover { opacity: 0.5 !important; } .xl\:hover\:opacity-54:hover { opacity: 0.54 !important; } .xl\:hover\:opacity-70:hover { opacity: 0.70 !important; } .xl\:hover\:opacity-75:hover { opacity: 0.75 !important; } .xl\:hover\:opacity-84:hover { opacity: 0.84 !important; } .xl\:hover\:opacity-100:hover { opacity: 1 !important; } .xl\:focus\:opacity-0:focus { opacity: 0 !important; } .xl\:focus\:opacity-12:focus { opacity: 0.12 !important; } .xl\:focus\:opacity-25:focus { opacity: 0.25 !important; } .xl\:focus\:opacity-38:focus { opacity: 0.38 !important; } .xl\:focus\:opacity-50:focus { opacity: 0.5 !important; } .xl\:focus\:opacity-54:focus { opacity: 0.54 !important; } .xl\:focus\:opacity-70:focus { opacity: 0.70 !important; } .xl\:focus\:opacity-75:focus { opacity: 0.75 !important; } .xl\:focus\:opacity-84:focus { opacity: 0.84 !important; } .xl\:focus\:opacity-100:focus { opacity: 1 !important; } .xl\:outline-none { outline: 0 !important; } .xl\:focus\:outline-none:focus { outline: 0 !important; } .xl\:overflow-auto { overflow: auto !important; } .xl\:overflow-hidden { overflow: hidden !important; } .xl\:overflow-visible { overflow: visible !important; } .xl\:overflow-scroll { overflow: scroll !important; } .xl\:overflow-x-auto { overflow-x: auto !important; } .xl\:overflow-y-auto { overflow-y: auto !important; } .xl\:overflow-x-hidden { overflow-x: hidden !important; } .xl\:overflow-y-hidden { overflow-y: hidden !important; } .xl\:overflow-x-visible { overflow-x: visible !important; } .xl\:overflow-y-visible { overflow-y: visible !important; } .xl\:overflow-x-scroll { overflow-x: scroll !important; } .xl\:overflow-y-scroll { overflow-y: scroll !important; } .xl\:scrolling-touch { -webkit-overflow-scrolling: touch !important; } .xl\:scrolling-auto { -webkit-overflow-scrolling: auto !important; } .xl\:p-0 { padding: 0 !important; } .xl\:p-1 { padding: 0.25rem !important; } .xl\:p-2 { padding: 0.5rem !important; } .xl\:p-3 { padding: 0.75rem !important; } .xl\:p-4 { padding: 1rem !important; } .xl\:p-5 { padding: 1.25rem !important; } .xl\:p-6 { padding: 1.5rem !important; } .xl\:p-8 { padding: 2rem !important; } .xl\:p-10 { padding: 2.5rem !important; } .xl\:p-12 { padding: 3rem !important; } .xl\:p-14 { padding: 3.5rem !important; } .xl\:p-16 { padding: 4rem !important; } .xl\:p-18 { padding: 4.5rem !important; } .xl\:p-20 { padding: 5rem !important; } .xl\:p-22 { padding: 5.5rem !important; } .xl\:p-24 { padding: 6rem !important; } .xl\:p-26 { padding: 6.5rem !important; } .xl\:p-28 { padding: 7rem !important; } .xl\:p-30 { padding: 7.5rem !important; } .xl\:p-32 { padding: 8rem !important; } .xl\:p-36 { padding: 9rem !important; } .xl\:p-40 { padding: 10rem !important; } .xl\:p-48 { padding: 12rem !important; } .xl\:p-56 { padding: 14rem !important; } .xl\:p-64 { padding: 16rem !important; } .xl\:p-px { padding: 1px !important; } .xl\:p-2px { padding: 2px !important; } .xl\:py-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .xl\:px-0 { padding-left: 0 !important; padding-right: 0 !important; } .xl\:py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .xl\:px-1 { padding-left: 0.25rem !important; padding-right: 0.25rem !important; } .xl\:py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .xl\:px-2 { padding-left: 0.5rem !important; padding-right: 0.5rem !important; } .xl\:py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .xl\:px-3 { padding-left: 0.75rem !important; padding-right: 0.75rem !important; } .xl\:py-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .xl\:px-4 { padding-left: 1rem !important; padding-right: 1rem !important; } .xl\:py-5 { padding-top: 1.25rem !important; padding-bottom: 1.25rem !important; } .xl\:px-5 { padding-left: 1.25rem !important; padding-right: 1.25rem !important; } .xl\:py-6 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .xl\:px-6 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } .xl\:py-8 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .xl\:px-8 { padding-left: 2rem !important; padding-right: 2rem !important; } .xl\:py-10 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .xl\:px-10 { padding-left: 2.5rem !important; padding-right: 2.5rem !important; } .xl\:py-12 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .xl\:px-12 { padding-left: 3rem !important; padding-right: 3rem !important; } .xl\:py-14 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .xl\:px-14 { padding-left: 3.5rem !important; padding-right: 3.5rem !important; } .xl\:py-16 { padding-top: 4rem !important; padding-bottom: 4rem !important; } .xl\:px-16 { padding-left: 4rem !important; padding-right: 4rem !important; } .xl\:py-18 { padding-top: 4.5rem !important; padding-bottom: 4.5rem !important; } .xl\:px-18 { padding-left: 4.5rem !important; padding-right: 4.5rem !important; } .xl\:py-20 { padding-top: 5rem !important; padding-bottom: 5rem !important; } .xl\:px-20 { padding-left: 5rem !important; padding-right: 5rem !important; } .xl\:py-22 { padding-top: 5.5rem !important; padding-bottom: 5.5rem !important; } .xl\:px-22 { padding-left: 5.5rem !important; padding-right: 5.5rem !important; } .xl\:py-24 { padding-top: 6rem !important; padding-bottom: 6rem !important; } .xl\:px-24 { padding-left: 6rem !important; padding-right: 6rem !important; } .xl\:py-26 { padding-top: 6.5rem !important; padding-bottom: 6.5rem !important; } .xl\:px-26 { padding-left: 6.5rem !important; padding-right: 6.5rem !important; } .xl\:py-28 { padding-top: 7rem !important; padding-bottom: 7rem !important; } .xl\:px-28 { padding-left: 7rem !important; padding-right: 7rem !important; } .xl\:py-30 { padding-top: 7.5rem !important; padding-bottom: 7.5rem !important; } .xl\:px-30 { padding-left: 7.5rem !important; padding-right: 7.5rem !important; } .xl\:py-32 { padding-top: 8rem !important; padding-bottom: 8rem !important; } .xl\:px-32 { padding-left: 8rem !important; padding-right: 8rem !important; } .xl\:py-36 { padding-top: 9rem !important; padding-bottom: 9rem !important; } .xl\:px-36 { padding-left: 9rem !important; padding-right: 9rem !important; } .xl\:py-40 { padding-top: 10rem !important; padding-bottom: 10rem !important; } .xl\:px-40 { padding-left: 10rem !important; padding-right: 10rem !important; } .xl\:py-48 { padding-top: 12rem !important; padding-bottom: 12rem !important; } .xl\:px-48 { padding-left: 12rem !important; padding-right: 12rem !important; } .xl\:py-56 { padding-top: 14rem !important; padding-bottom: 14rem !important; } .xl\:px-56 { padding-left: 14rem !important; padding-right: 14rem !important; } .xl\:py-64 { padding-top: 16rem !important; padding-bottom: 16rem !important; } .xl\:px-64 { padding-left: 16rem !important; padding-right: 16rem !important; } .xl\:py-px { padding-top: 1px !important; padding-bottom: 1px !important; } .xl\:px-px { padding-left: 1px !important; padding-right: 1px !important; } .xl\:py-2px { padding-top: 2px !important; padding-bottom: 2px !important; } .xl\:px-2px { padding-left: 2px !important; padding-right: 2px !important; } .xl\:pt-0 { padding-top: 0 !important; } .xl\:pr-0 { padding-right: 0 !important; } .xl\:pb-0 { padding-bottom: 0 !important; } .xl\:pl-0 { padding-left: 0 !important; } .xl\:pt-1 { padding-top: 0.25rem !important; } .xl\:pr-1 { padding-right: 0.25rem !important; } .xl\:pb-1 { padding-bottom: 0.25rem !important; } .xl\:pl-1 { padding-left: 0.25rem !important; } .xl\:pt-2 { padding-top: 0.5rem !important; } .xl\:pr-2 { padding-right: 0.5rem !important; } .xl\:pb-2 { padding-bottom: 0.5rem !important; } .xl\:pl-2 { padding-left: 0.5rem !important; } .xl\:pt-3 { padding-top: 0.75rem !important; } .xl\:pr-3 { padding-right: 0.75rem !important; } .xl\:pb-3 { padding-bottom: 0.75rem !important; } .xl\:pl-3 { padding-left: 0.75rem !important; } .xl\:pt-4 { padding-top: 1rem !important; } .xl\:pr-4 { padding-right: 1rem !important; } .xl\:pb-4 { padding-bottom: 1rem !important; } .xl\:pl-4 { padding-left: 1rem !important; } .xl\:pt-5 { padding-top: 1.25rem !important; } .xl\:pr-5 { padding-right: 1.25rem !important; } .xl\:pb-5 { padding-bottom: 1.25rem !important; } .xl\:pl-5 { padding-left: 1.25rem !important; } .xl\:pt-6 { padding-top: 1.5rem !important; } .xl\:pr-6 { padding-right: 1.5rem !important; } .xl\:pb-6 { padding-bottom: 1.5rem !important; } .xl\:pl-6 { padding-left: 1.5rem !important; } .xl\:pt-8 { padding-top: 2rem !important; } .xl\:pr-8 { padding-right: 2rem !important; } .xl\:pb-8 { padding-bottom: 2rem !important; } .xl\:pl-8 { padding-left: 2rem !important; } .xl\:pt-10 { padding-top: 2.5rem !important; } .xl\:pr-10 { padding-right: 2.5rem !important; } .xl\:pb-10 { padding-bottom: 2.5rem !important; } .xl\:pl-10 { padding-left: 2.5rem !important; } .xl\:pt-12 { padding-top: 3rem !important; } .xl\:pr-12 { padding-right: 3rem !important; } .xl\:pb-12 { padding-bottom: 3rem !important; } .xl\:pl-12 { padding-left: 3rem !important; } .xl\:pt-14 { padding-top: 3.5rem !important; } .xl\:pr-14 { padding-right: 3.5rem !important; } .xl\:pb-14 { padding-bottom: 3.5rem !important; } .xl\:pl-14 { padding-left: 3.5rem !important; } .xl\:pt-16 { padding-top: 4rem !important; } .xl\:pr-16 { padding-right: 4rem !important; } .xl\:pb-16 { padding-bottom: 4rem !important; } .xl\:pl-16 { padding-left: 4rem !important; } .xl\:pt-18 { padding-top: 4.5rem !important; } .xl\:pr-18 { padding-right: 4.5rem !important; } .xl\:pb-18 { padding-bottom: 4.5rem !important; } .xl\:pl-18 { padding-left: 4.5rem !important; } .xl\:pt-20 { padding-top: 5rem !important; } .xl\:pr-20 { padding-right: 5rem !important; } .xl\:pb-20 { padding-bottom: 5rem !important; } .xl\:pl-20 { padding-left: 5rem !important; } .xl\:pt-22 { padding-top: 5.5rem !important; } .xl\:pr-22 { padding-right: 5.5rem !important; } .xl\:pb-22 { padding-bottom: 5.5rem !important; } .xl\:pl-22 { padding-left: 5.5rem !important; } .xl\:pt-24 { padding-top: 6rem !important; } .xl\:pr-24 { padding-right: 6rem !important; } .xl\:pb-24 { padding-bottom: 6rem !important; } .xl\:pl-24 { padding-left: 6rem !important; } .xl\:pt-26 { padding-top: 6.5rem !important; } .xl\:pr-26 { padding-right: 6.5rem !important; } .xl\:pb-26 { padding-bottom: 6.5rem !important; } .xl\:pl-26 { padding-left: 6.5rem !important; } .xl\:pt-28 { padding-top: 7rem !important; } .xl\:pr-28 { padding-right: 7rem !important; } .xl\:pb-28 { padding-bottom: 7rem !important; } .xl\:pl-28 { padding-left: 7rem !important; } .xl\:pt-30 { padding-top: 7.5rem !important; } .xl\:pr-30 { padding-right: 7.5rem !important; } .xl\:pb-30 { padding-bottom: 7.5rem !important; } .xl\:pl-30 { padding-left: 7.5rem !important; } .xl\:pt-32 { padding-top: 8rem !important; } .xl\:pr-32 { padding-right: 8rem !important; } .xl\:pb-32 { padding-bottom: 8rem !important; } .xl\:pl-32 { padding-left: 8rem !important; } .xl\:pt-36 { padding-top: 9rem !important; } .xl\:pr-36 { padding-right: 9rem !important; } .xl\:pb-36 { padding-bottom: 9rem !important; } .xl\:pl-36 { padding-left: 9rem !important; } .xl\:pt-40 { padding-top: 10rem !important; } .xl\:pr-40 { padding-right: 10rem !important; } .xl\:pb-40 { padding-bottom: 10rem !important; } .xl\:pl-40 { padding-left: 10rem !important; } .xl\:pt-48 { padding-top: 12rem !important; } .xl\:pr-48 { padding-right: 12rem !important; } .xl\:pb-48 { padding-bottom: 12rem !important; } .xl\:pl-48 { padding-left: 12rem !important; } .xl\:pt-56 { padding-top: 14rem !important; } .xl\:pr-56 { padding-right: 14rem !important; } .xl\:pb-56 { padding-bottom: 14rem !important; } .xl\:pl-56 { padding-left: 14rem !important; } .xl\:pt-64 { padding-top: 16rem !important; } .xl\:pr-64 { padding-right: 16rem !important; } .xl\:pb-64 { padding-bottom: 16rem !important; } .xl\:pl-64 { padding-left: 16rem !important; } .xl\:pt-px { padding-top: 1px !important; } .xl\:pr-px { padding-right: 1px !important; } .xl\:pb-px { padding-bottom: 1px !important; } .xl\:pl-px { padding-left: 1px !important; } .xl\:pt-2px { padding-top: 2px !important; } .xl\:pr-2px { padding-right: 2px !important; } .xl\:pb-2px { padding-bottom: 2px !important; } .xl\:pl-2px { padding-left: 2px !important; } .xl\:placeholder-opacity-0::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .xl\:placeholder-opacity-0::-moz-placeholder { --placeholder-opacity: 0 !important; } .xl\:placeholder-opacity-0::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .xl\:placeholder-opacity-0::placeholder { --placeholder-opacity: 0 !important; } .xl\:placeholder-opacity-12::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .xl\:placeholder-opacity-12::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .xl\:placeholder-opacity-12::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .xl\:placeholder-opacity-12::placeholder { --placeholder-opacity: 0.12 !important; } .xl\:placeholder-opacity-25::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .xl\:placeholder-opacity-25::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .xl\:placeholder-opacity-25::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .xl\:placeholder-opacity-25::placeholder { --placeholder-opacity: 0.25 !important; } .xl\:placeholder-opacity-38::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .xl\:placeholder-opacity-38::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .xl\:placeholder-opacity-38::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .xl\:placeholder-opacity-38::placeholder { --placeholder-opacity: 0.38 !important; } .xl\:placeholder-opacity-50::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .xl\:placeholder-opacity-50::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .xl\:placeholder-opacity-50::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .xl\:placeholder-opacity-50::placeholder { --placeholder-opacity: 0.5 !important; } .xl\:placeholder-opacity-54::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .xl\:placeholder-opacity-54::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .xl\:placeholder-opacity-54::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .xl\:placeholder-opacity-54::placeholder { --placeholder-opacity: 0.54 !important; } .xl\:placeholder-opacity-70::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .xl\:placeholder-opacity-70::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .xl\:placeholder-opacity-70::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .xl\:placeholder-opacity-70::placeholder { --placeholder-opacity: 0.70 !important; } .xl\:placeholder-opacity-75::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .xl\:placeholder-opacity-75::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .xl\:placeholder-opacity-75::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .xl\:placeholder-opacity-75::placeholder { --placeholder-opacity: 0.75 !important; } .xl\:placeholder-opacity-84::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .xl\:placeholder-opacity-84::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .xl\:placeholder-opacity-84::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .xl\:placeholder-opacity-84::placeholder { --placeholder-opacity: 0.84 !important; } .xl\:placeholder-opacity-100::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .xl\:placeholder-opacity-100::-moz-placeholder { --placeholder-opacity: 1 !important; } .xl\:placeholder-opacity-100::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .xl\:placeholder-opacity-100::placeholder { --placeholder-opacity: 1 !important; } .xl\:focus\:placeholder-opacity-0:focus::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .xl\:focus\:placeholder-opacity-0:focus::-moz-placeholder { --placeholder-opacity: 0 !important; } .xl\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .xl\:focus\:placeholder-opacity-0:focus::placeholder { --placeholder-opacity: 0 !important; } .xl\:focus\:placeholder-opacity-12:focus::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .xl\:focus\:placeholder-opacity-12:focus::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .xl\:focus\:placeholder-opacity-12:focus::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .xl\:focus\:placeholder-opacity-12:focus::placeholder { --placeholder-opacity: 0.12 !important; } .xl\:focus\:placeholder-opacity-25:focus::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .xl\:focus\:placeholder-opacity-25:focus::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .xl\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .xl\:focus\:placeholder-opacity-25:focus::placeholder { --placeholder-opacity: 0.25 !important; } .xl\:focus\:placeholder-opacity-38:focus::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .xl\:focus\:placeholder-opacity-38:focus::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .xl\:focus\:placeholder-opacity-38:focus::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .xl\:focus\:placeholder-opacity-38:focus::placeholder { --placeholder-opacity: 0.38 !important; } .xl\:focus\:placeholder-opacity-50:focus::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .xl\:focus\:placeholder-opacity-50:focus::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .xl\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .xl\:focus\:placeholder-opacity-50:focus::placeholder { --placeholder-opacity: 0.5 !important; } .xl\:focus\:placeholder-opacity-54:focus::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .xl\:focus\:placeholder-opacity-54:focus::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .xl\:focus\:placeholder-opacity-54:focus::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .xl\:focus\:placeholder-opacity-54:focus::placeholder { --placeholder-opacity: 0.54 !important; } .xl\:focus\:placeholder-opacity-70:focus::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .xl\:focus\:placeholder-opacity-70:focus::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .xl\:focus\:placeholder-opacity-70:focus::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .xl\:focus\:placeholder-opacity-70:focus::placeholder { --placeholder-opacity: 0.70 !important; } .xl\:focus\:placeholder-opacity-75:focus::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .xl\:focus\:placeholder-opacity-75:focus::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .xl\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .xl\:focus\:placeholder-opacity-75:focus::placeholder { --placeholder-opacity: 0.75 !important; } .xl\:focus\:placeholder-opacity-84:focus::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .xl\:focus\:placeholder-opacity-84:focus::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .xl\:focus\:placeholder-opacity-84:focus::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .xl\:focus\:placeholder-opacity-84:focus::placeholder { --placeholder-opacity: 0.84 !important; } .xl\:focus\:placeholder-opacity-100:focus::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .xl\:focus\:placeholder-opacity-100:focus::-moz-placeholder { --placeholder-opacity: 1 !important; } .xl\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .xl\:focus\:placeholder-opacity-100:focus::placeholder { --placeholder-opacity: 1 !important; } .xl\:pointer-events-none { pointer-events: none !important; } .xl\:pointer-events-auto { pointer-events: auto !important; } .xl\:static { position: static !important; } .xl\:fixed { position: fixed !important; } .xl\:absolute { position: absolute !important; } .xl\:relative { position: relative !important; } .xl\:sticky { position: -webkit-sticky !important; position: sticky !important; } .xl\:inset-0 { top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; } .xl\:inset-auto { top: auto !important; right: auto !important; bottom: auto !important; left: auto !important; } .xl\:inset-y-0 { top: 0 !important; bottom: 0 !important; } .xl\:inset-x-0 { right: 0 !important; left: 0 !important; } .xl\:inset-y-auto { top: auto !important; bottom: auto !important; } .xl\:inset-x-auto { right: auto !important; left: auto !important; } .xl\:top-0 { top: 0 !important; } .xl\:right-0 { right: 0 !important; } .xl\:bottom-0 { bottom: 0 !important; } .xl\:left-0 { left: 0 !important; } .xl\:top-auto { top: auto !important; } .xl\:right-auto { right: auto !important; } .xl\:bottom-auto { bottom: auto !important; } .xl\:left-auto { left: auto !important; } .xl\:shadow-xs { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .xl\:shadow-sm { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .xl\:shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .xl\:shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .xl\:shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .xl\:shadow-xl { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .xl\:shadow-2xl { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .xl\:shadow-inner { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .xl\:shadow-outline { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .xl\:shadow-none { box-shadow: none !important; } .xl\:shadow-solid { box-shadow: 0 0 0 2px currentColor !important; } .xl\:hover\:shadow-xs:hover { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .xl\:hover\:shadow-sm:hover { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .xl\:hover\:shadow:hover { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .xl\:hover\:shadow-md:hover { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .xl\:hover\:shadow-lg:hover { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .xl\:hover\:shadow-xl:hover { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .xl\:hover\:shadow-2xl:hover { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .xl\:hover\:shadow-inner:hover { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .xl\:hover\:shadow-outline:hover { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .xl\:hover\:shadow-none:hover { box-shadow: none !important; } .xl\:hover\:shadow-solid:hover { box-shadow: 0 0 0 2px currentColor !important; } .xl\:focus\:shadow-xs:focus { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .xl\:focus\:shadow-sm:focus { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .xl\:focus\:shadow:focus { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .xl\:focus\:shadow-md:focus { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .xl\:focus\:shadow-lg:focus { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .xl\:focus\:shadow-xl:focus { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .xl\:focus\:shadow-2xl:focus { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .xl\:focus\:shadow-inner:focus { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .xl\:focus\:shadow-outline:focus { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .xl\:focus\:shadow-none:focus { box-shadow: none !important; } .xl\:focus\:shadow-solid:focus { box-shadow: 0 0 0 2px currentColor !important; } .xl\:fill-current { fill: currentColor !important; } .xl\:stroke-current { stroke: currentColor !important; } .xl\:stroke-0 { stroke-width: 0 !important; } .xl\:stroke-1 { stroke-width: 1 !important; } .xl\:stroke-2 { stroke-width: 2 !important; } .xl\:table-auto { table-layout: auto !important; } .xl\:table-fixed { table-layout: fixed !important; } .xl\:text-left { text-align: left !important; } .xl\:text-center { text-align: center !important; } .xl\:text-right { text-align: right !important; } .xl\:text-justify { text-align: justify !important; } .xl\:text-opacity-0 { --text-opacity: 0 !important; } .xl\:text-opacity-12 { --text-opacity: 0.12 !important; } .xl\:text-opacity-25 { --text-opacity: 0.25 !important; } .xl\:text-opacity-38 { --text-opacity: 0.38 !important; } .xl\:text-opacity-50 { --text-opacity: 0.5 !important; } .xl\:text-opacity-54 { --text-opacity: 0.54 !important; } .xl\:text-opacity-70 { --text-opacity: 0.70 !important; } .xl\:text-opacity-75 { --text-opacity: 0.75 !important; } .xl\:text-opacity-84 { --text-opacity: 0.84 !important; } .xl\:text-opacity-100 { --text-opacity: 1 !important; } .xl\:hover\:text-opacity-0:hover { --text-opacity: 0 !important; } .xl\:hover\:text-opacity-12:hover { --text-opacity: 0.12 !important; } .xl\:hover\:text-opacity-25:hover { --text-opacity: 0.25 !important; } .xl\:hover\:text-opacity-38:hover { --text-opacity: 0.38 !important; } .xl\:hover\:text-opacity-50:hover { --text-opacity: 0.5 !important; } .xl\:hover\:text-opacity-54:hover { --text-opacity: 0.54 !important; } .xl\:hover\:text-opacity-70:hover { --text-opacity: 0.70 !important; } .xl\:hover\:text-opacity-75:hover { --text-opacity: 0.75 !important; } .xl\:hover\:text-opacity-84:hover { --text-opacity: 0.84 !important; } .xl\:hover\:text-opacity-100:hover { --text-opacity: 1 !important; } .xl\:focus\:text-opacity-0:focus { --text-opacity: 0 !important; } .xl\:focus\:text-opacity-12:focus { --text-opacity: 0.12 !important; } .xl\:focus\:text-opacity-25:focus { --text-opacity: 0.25 !important; } .xl\:focus\:text-opacity-38:focus { --text-opacity: 0.38 !important; } .xl\:focus\:text-opacity-50:focus { --text-opacity: 0.5 !important; } .xl\:focus\:text-opacity-54:focus { --text-opacity: 0.54 !important; } .xl\:focus\:text-opacity-70:focus { --text-opacity: 0.70 !important; } .xl\:focus\:text-opacity-75:focus { --text-opacity: 0.75 !important; } .xl\:focus\:text-opacity-84:focus { --text-opacity: 0.84 !important; } .xl\:focus\:text-opacity-100:focus { --text-opacity: 1 !important; } .xl\:italic { font-style: italic !important; } .xl\:not-italic { font-style: normal !important; } .xl\:uppercase { text-transform: uppercase !important; } .xl\:lowercase { text-transform: lowercase !important; } .xl\:capitalize { text-transform: capitalize !important; } .xl\:normal-case { text-transform: none !important; } .xl\:underline { text-decoration: underline !important; } .xl\:line-through { text-decoration: line-through !important; } .xl\:no-underline { text-decoration: none !important; } .xl\:hover\:underline:hover { text-decoration: underline !important; } .xl\:hover\:line-through:hover { text-decoration: line-through !important; } .xl\:hover\:no-underline:hover { text-decoration: none !important; } .xl\:focus\:underline:focus { text-decoration: underline !important; } .xl\:focus\:line-through:focus { text-decoration: line-through !important; } .xl\:focus\:no-underline:focus { text-decoration: none !important; } .xl\:tracking-tighter { letter-spacing: -0.05em !important; } .xl\:tracking-tight { letter-spacing: -0.025em !important; } .xl\:tracking-normal { letter-spacing: 0 !important; } .xl\:tracking-wide { letter-spacing: 0.025em !important; } .xl\:tracking-wider { letter-spacing: 0.05em !important; } .xl\:tracking-widest { letter-spacing: 0.1em !important; } .xl\:select-none { -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important; } .xl\:select-text { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } .xl\:select-all { -webkit-user-select: all !important; -moz-user-select: all !important; -ms-user-select: all !important; user-select: all !important; } .xl\:select-auto { -webkit-user-select: auto !important; -moz-user-select: auto !important; -ms-user-select: auto !important; user-select: auto !important; } .xl\:align-baseline { vertical-align: baseline !important; } .xl\:align-top { vertical-align: top !important; } .xl\:align-middle { vertical-align: middle !important; } .xl\:align-bottom { vertical-align: bottom !important; } .xl\:align-text-top { vertical-align: text-top !important; } .xl\:align-text-bottom { vertical-align: text-bottom !important; } .xl\:visible { visibility: visible !important; } .xl\:invisible { visibility: hidden !important; } .xl\:whitespace-normal { white-space: normal !important; } .xl\:whitespace-no-wrap { white-space: nowrap !important; } .xl\:whitespace-pre { white-space: pre !important; } .xl\:whitespace-pre-line { white-space: pre-line !important; } .xl\:whitespace-pre-wrap { white-space: pre-wrap !important; } .xl\:break-normal { overflow-wrap: normal !important; word-break: normal !important; } .xl\:break-words { overflow-wrap: break-word !important; } .xl\:break-all { word-break: break-all !important; } .xl\:truncate { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } .xl\:w-0 { width: 0 !important; } .xl\:w-1 { width: 0.25rem !important; } .xl\:w-2 { width: 0.5rem !important; } .xl\:w-3 { width: 0.75rem !important; } .xl\:w-4 { width: 1rem !important; } .xl\:w-5 { width: 1.25rem !important; } .xl\:w-6 { width: 1.5rem !important; } .xl\:w-8 { width: 2rem !important; } .xl\:w-10 { width: 2.5rem !important; } .xl\:w-12 { width: 3rem !important; } .xl\:w-14 { width: 3.5rem !important; } .xl\:w-16 { width: 4rem !important; } .xl\:w-18 { width: 4.5rem !important; } .xl\:w-20 { width: 5rem !important; } .xl\:w-22 { width: 5.5rem !important; } .xl\:w-24 { width: 6rem !important; } .xl\:w-26 { width: 6.5rem !important; } .xl\:w-28 { width: 7rem !important; } .xl\:w-30 { width: 7.5rem !important; } .xl\:w-32 { width: 8rem !important; } .xl\:w-36 { width: 9rem !important; } .xl\:w-40 { width: 10rem !important; } .xl\:w-48 { width: 12rem !important; } .xl\:w-50 { width: 12.5rem !important; } .xl\:w-56 { width: 14rem !important; } .xl\:w-60 { width: 15rem !important; } .xl\:w-64 { width: 16rem !important; } .xl\:w-80 { width: 20rem !important; } .xl\:w-90 { width: 24rem !important; } .xl\:w-100 { width: 25rem !important; } .xl\:w-120 { width: 30rem !important; } .xl\:w-128 { width: 32rem !important; } .xl\:w-140 { width: 35rem !important; } .xl\:w-160 { width: 40rem !important; } .xl\:w-180 { width: 45rem !important; } .xl\:w-192 { width: 48rem !important; } .xl\:w-200 { width: 50rem !important; } .xl\:w-240 { width: 60rem !important; } .xl\:w-256 { width: 64rem !important; } .xl\:w-280 { width: 70rem !important; } .xl\:w-320 { width: 80rem !important; } .xl\:w-360 { width: 90rem !important; } .xl\:w-400 { width: 100rem !important; } .xl\:w-480 { width: 120rem !important; } .xl\:w-auto { width: auto !important; } .xl\:w-px { width: 1px !important; } .xl\:w-2px { width: 2px !important; } .xl\:w-1\/2 { width: 50% !important; } .xl\:w-1\/3 { width: 33.33333% !important; } .xl\:w-2\/3 { width: 66.66667% !important; } .xl\:w-1\/4 { width: 25% !important; } .xl\:w-2\/4 { width: 50% !important; } .xl\:w-3\/4 { width: 75% !important; } .xl\:w-1\/5 { width: 20% !important; } .xl\:w-2\/5 { width: 40% !important; } .xl\:w-3\/5 { width: 60% !important; } .xl\:w-4\/5 { width: 80% !important; } .xl\:w-1\/6 { width: 16.666667% !important; } .xl\:w-2\/6 { width: 33.333333% !important; } .xl\:w-3\/6 { width: 50% !important; } .xl\:w-4\/6 { width: 66.666667% !important; } .xl\:w-5\/6 { width: 83.333333% !important; } .xl\:w-1\/12 { width: 8.33333% !important; } .xl\:w-2\/12 { width: 16.66667% !important; } .xl\:w-3\/12 { width: 25% !important; } .xl\:w-4\/12 { width: 33.33333% !important; } .xl\:w-5\/12 { width: 41.66667% !important; } .xl\:w-6\/12 { width: 50% !important; } .xl\:w-7\/12 { width: 58.33333% !important; } .xl\:w-8\/12 { width: 66.66667% !important; } .xl\:w-9\/12 { width: 75% !important; } .xl\:w-10\/12 { width: 83.33333% !important; } .xl\:w-11\/12 { width: 91.66667% !important; } .xl\:w-full { width: 100% !important; } .xl\:w-screen { width: 100vw !important; } .xl\:z-0 { z-index: 0 !important; } .xl\:z-10 { z-index: 10 !important; } .xl\:z-20 { z-index: 20 !important; } .xl\:z-30 { z-index: 30 !important; } .xl\:z-40 { z-index: 40 !important; } .xl\:z-50 { z-index: 50 !important; } .xl\:z-60 { z-index: 60 !important; } .xl\:z-70 { z-index: 70 !important; } .xl\:z-80 { z-index: 80 !important; } .xl\:z-90 { z-index: 90 !important; } .xl\:z-99 { z-index: 99 !important; } .xl\:z-999 { z-index: 999 !important; } .xl\:z-9999 { z-index: 9999 !important; } .xl\:z-99999 { z-index: 99999 !important; } .xl\:z-auto { z-index: auto !important; } .xl\:-z-1 { z-index: -1 !important; } .xl\:gap-0 { grid-gap: 0 !important; gap: 0 !important; } .xl\:gap-1 { grid-gap: 0.25rem !important; gap: 0.25rem !important; } .xl\:gap-2 { grid-gap: 0.5rem !important; gap: 0.5rem !important; } .xl\:gap-3 { grid-gap: 0.75rem !important; gap: 0.75rem !important; } .xl\:gap-4 { grid-gap: 1rem !important; gap: 1rem !important; } .xl\:gap-5 { grid-gap: 1.25rem !important; gap: 1.25rem !important; } .xl\:gap-6 { grid-gap: 1.5rem !important; gap: 1.5rem !important; } .xl\:gap-8 { grid-gap: 2rem !important; gap: 2rem !important; } .xl\:gap-10 { grid-gap: 2.5rem !important; gap: 2.5rem !important; } .xl\:gap-12 { grid-gap: 3rem !important; gap: 3rem !important; } .xl\:gap-14 { grid-gap: 3.5rem !important; gap: 3.5rem !important; } .xl\:gap-16 { grid-gap: 4rem !important; gap: 4rem !important; } .xl\:gap-18 { grid-gap: 4.5rem !important; gap: 4.5rem !important; } .xl\:gap-20 { grid-gap: 5rem !important; gap: 5rem !important; } .xl\:gap-22 { grid-gap: 5.5rem !important; gap: 5.5rem !important; } .xl\:gap-24 { grid-gap: 6rem !important; gap: 6rem !important; } .xl\:gap-26 { grid-gap: 6.5rem !important; gap: 6.5rem !important; } .xl\:gap-28 { grid-gap: 7rem !important; gap: 7rem !important; } .xl\:gap-30 { grid-gap: 7.5rem !important; gap: 7.5rem !important; } .xl\:gap-32 { grid-gap: 8rem !important; gap: 8rem !important; } .xl\:gap-36 { grid-gap: 9rem !important; gap: 9rem !important; } .xl\:gap-40 { grid-gap: 10rem !important; gap: 10rem !important; } .xl\:gap-48 { grid-gap: 12rem !important; gap: 12rem !important; } .xl\:gap-56 { grid-gap: 14rem !important; gap: 14rem !important; } .xl\:gap-64 { grid-gap: 16rem !important; gap: 16rem !important; } .xl\:gap-px { grid-gap: 1px !important; gap: 1px !important; } .xl\:gap-2px { grid-gap: 2px !important; gap: 2px !important; } .xl\:col-gap-0 { grid-column-gap: 0 !important; -moz-column-gap: 0 !important; column-gap: 0 !important; } .xl\:col-gap-1 { grid-column-gap: 0.25rem !important; -moz-column-gap: 0.25rem !important; column-gap: 0.25rem !important; } .xl\:col-gap-2 { grid-column-gap: 0.5rem !important; -moz-column-gap: 0.5rem !important; column-gap: 0.5rem !important; } .xl\:col-gap-3 { grid-column-gap: 0.75rem !important; -moz-column-gap: 0.75rem !important; column-gap: 0.75rem !important; } .xl\:col-gap-4 { grid-column-gap: 1rem !important; -moz-column-gap: 1rem !important; column-gap: 1rem !important; } .xl\:col-gap-5 { grid-column-gap: 1.25rem !important; -moz-column-gap: 1.25rem !important; column-gap: 1.25rem !important; } .xl\:col-gap-6 { grid-column-gap: 1.5rem !important; -moz-column-gap: 1.5rem !important; column-gap: 1.5rem !important; } .xl\:col-gap-8 { grid-column-gap: 2rem !important; -moz-column-gap: 2rem !important; column-gap: 2rem !important; } .xl\:col-gap-10 { grid-column-gap: 2.5rem !important; -moz-column-gap: 2.5rem !important; column-gap: 2.5rem !important; } .xl\:col-gap-12 { grid-column-gap: 3rem !important; -moz-column-gap: 3rem !important; column-gap: 3rem !important; } .xl\:col-gap-14 { grid-column-gap: 3.5rem !important; -moz-column-gap: 3.5rem !important; column-gap: 3.5rem !important; } .xl\:col-gap-16 { grid-column-gap: 4rem !important; -moz-column-gap: 4rem !important; column-gap: 4rem !important; } .xl\:col-gap-18 { grid-column-gap: 4.5rem !important; -moz-column-gap: 4.5rem !important; column-gap: 4.5rem !important; } .xl\:col-gap-20 { grid-column-gap: 5rem !important; -moz-column-gap: 5rem !important; column-gap: 5rem !important; } .xl\:col-gap-22 { grid-column-gap: 5.5rem !important; -moz-column-gap: 5.5rem !important; column-gap: 5.5rem !important; } .xl\:col-gap-24 { grid-column-gap: 6rem !important; -moz-column-gap: 6rem !important; column-gap: 6rem !important; } .xl\:col-gap-26 { grid-column-gap: 6.5rem !important; -moz-column-gap: 6.5rem !important; column-gap: 6.5rem !important; } .xl\:col-gap-28 { grid-column-gap: 7rem !important; -moz-column-gap: 7rem !important; column-gap: 7rem !important; } .xl\:col-gap-30 { grid-column-gap: 7.5rem !important; -moz-column-gap: 7.5rem !important; column-gap: 7.5rem !important; } .xl\:col-gap-32 { grid-column-gap: 8rem !important; -moz-column-gap: 8rem !important; column-gap: 8rem !important; } .xl\:col-gap-36 { grid-column-gap: 9rem !important; -moz-column-gap: 9rem !important; column-gap: 9rem !important; } .xl\:col-gap-40 { grid-column-gap: 10rem !important; -moz-column-gap: 10rem !important; column-gap: 10rem !important; } .xl\:col-gap-48 { grid-column-gap: 12rem !important; -moz-column-gap: 12rem !important; column-gap: 12rem !important; } .xl\:col-gap-56 { grid-column-gap: 14rem !important; -moz-column-gap: 14rem !important; column-gap: 14rem !important; } .xl\:col-gap-64 { grid-column-gap: 16rem !important; -moz-column-gap: 16rem !important; column-gap: 16rem !important; } .xl\:col-gap-px { grid-column-gap: 1px !important; -moz-column-gap: 1px !important; column-gap: 1px !important; } .xl\:col-gap-2px { grid-column-gap: 2px !important; -moz-column-gap: 2px !important; column-gap: 2px !important; } .xl\:row-gap-0 { grid-row-gap: 0 !important; row-gap: 0 !important; } .xl\:row-gap-1 { grid-row-gap: 0.25rem !important; row-gap: 0.25rem !important; } .xl\:row-gap-2 { grid-row-gap: 0.5rem !important; row-gap: 0.5rem !important; } .xl\:row-gap-3 { grid-row-gap: 0.75rem !important; row-gap: 0.75rem !important; } .xl\:row-gap-4 { grid-row-gap: 1rem !important; row-gap: 1rem !important; } .xl\:row-gap-5 { grid-row-gap: 1.25rem !important; row-gap: 1.25rem !important; } .xl\:row-gap-6 { grid-row-gap: 1.5rem !important; row-gap: 1.5rem !important; } .xl\:row-gap-8 { grid-row-gap: 2rem !important; row-gap: 2rem !important; } .xl\:row-gap-10 { grid-row-gap: 2.5rem !important; row-gap: 2.5rem !important; } .xl\:row-gap-12 { grid-row-gap: 3rem !important; row-gap: 3rem !important; } .xl\:row-gap-14 { grid-row-gap: 3.5rem !important; row-gap: 3.5rem !important; } .xl\:row-gap-16 { grid-row-gap: 4rem !important; row-gap: 4rem !important; } .xl\:row-gap-18 { grid-row-gap: 4.5rem !important; row-gap: 4.5rem !important; } .xl\:row-gap-20 { grid-row-gap: 5rem !important; row-gap: 5rem !important; } .xl\:row-gap-22 { grid-row-gap: 5.5rem !important; row-gap: 5.5rem !important; } .xl\:row-gap-24 { grid-row-gap: 6rem !important; row-gap: 6rem !important; } .xl\:row-gap-26 { grid-row-gap: 6.5rem !important; row-gap: 6.5rem !important; } .xl\:row-gap-28 { grid-row-gap: 7rem !important; row-gap: 7rem !important; } .xl\:row-gap-30 { grid-row-gap: 7.5rem !important; row-gap: 7.5rem !important; } .xl\:row-gap-32 { grid-row-gap: 8rem !important; row-gap: 8rem !important; } .xl\:row-gap-36 { grid-row-gap: 9rem !important; row-gap: 9rem !important; } .xl\:row-gap-40 { grid-row-gap: 10rem !important; row-gap: 10rem !important; } .xl\:row-gap-48 { grid-row-gap: 12rem !important; row-gap: 12rem !important; } .xl\:row-gap-56 { grid-row-gap: 14rem !important; row-gap: 14rem !important; } .xl\:row-gap-64 { grid-row-gap: 16rem !important; row-gap: 16rem !important; } .xl\:row-gap-px { grid-row-gap: 1px !important; row-gap: 1px !important; } .xl\:row-gap-2px { grid-row-gap: 2px !important; row-gap: 2px !important; } .xl\:grid-flow-row { grid-auto-flow: row !important; } .xl\:grid-flow-col { grid-auto-flow: column !important; } .xl\:grid-flow-row-dense { grid-auto-flow: row dense !important; } .xl\:grid-flow-col-dense { grid-auto-flow: column dense !important; } .xl\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; } .xl\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } .xl\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; } .xl\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; } .xl\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; } .xl\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; } .xl\:grid-cols-7 { grid-template-columns: repeat(7, minmax(0, 1fr)) !important; } .xl\:grid-cols-8 { grid-template-columns: repeat(8, minmax(0, 1fr)) !important; } .xl\:grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)) !important; } .xl\:grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)) !important; } .xl\:grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)) !important; } .xl\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)) !important; } .xl\:grid-cols-none { grid-template-columns: none !important; } .xl\:col-auto { grid-column: auto !important; } .xl\:col-span-1 { grid-column: span 1 / span 1 !important; } .xl\:col-span-2 { grid-column: span 2 / span 2 !important; } .xl\:col-span-3 { grid-column: span 3 / span 3 !important; } .xl\:col-span-4 { grid-column: span 4 / span 4 !important; } .xl\:col-span-5 { grid-column: span 5 / span 5 !important; } .xl\:col-span-6 { grid-column: span 6 / span 6 !important; } .xl\:col-span-7 { grid-column: span 7 / span 7 !important; } .xl\:col-span-8 { grid-column: span 8 / span 8 !important; } .xl\:col-span-9 { grid-column: span 9 / span 9 !important; } .xl\:col-span-10 { grid-column: span 10 / span 10 !important; } .xl\:col-span-11 { grid-column: span 11 / span 11 !important; } .xl\:col-span-12 { grid-column: span 12 / span 12 !important; } .xl\:col-start-1 { grid-column-start: 1 !important; } .xl\:col-start-2 { grid-column-start: 2 !important; } .xl\:col-start-3 { grid-column-start: 3 !important; } .xl\:col-start-4 { grid-column-start: 4 !important; } .xl\:col-start-5 { grid-column-start: 5 !important; } .xl\:col-start-6 { grid-column-start: 6 !important; } .xl\:col-start-7 { grid-column-start: 7 !important; } .xl\:col-start-8 { grid-column-start: 8 !important; } .xl\:col-start-9 { grid-column-start: 9 !important; } .xl\:col-start-10 { grid-column-start: 10 !important; } .xl\:col-start-11 { grid-column-start: 11 !important; } .xl\:col-start-12 { grid-column-start: 12 !important; } .xl\:col-start-13 { grid-column-start: 13 !important; } .xl\:col-start-auto { grid-column-start: auto !important; } .xl\:col-end-1 { grid-column-end: 1 !important; } .xl\:col-end-2 { grid-column-end: 2 !important; } .xl\:col-end-3 { grid-column-end: 3 !important; } .xl\:col-end-4 { grid-column-end: 4 !important; } .xl\:col-end-5 { grid-column-end: 5 !important; } .xl\:col-end-6 { grid-column-end: 6 !important; } .xl\:col-end-7 { grid-column-end: 7 !important; } .xl\:col-end-8 { grid-column-end: 8 !important; } .xl\:col-end-9 { grid-column-end: 9 !important; } .xl\:col-end-10 { grid-column-end: 10 !important; } .xl\:col-end-11 { grid-column-end: 11 !important; } .xl\:col-end-12 { grid-column-end: 12 !important; } .xl\:col-end-13 { grid-column-end: 13 !important; } .xl\:col-end-auto { grid-column-end: auto !important; } .xl\:grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)) !important; } .xl\:grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)) !important; } .xl\:grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)) !important; } .xl\:grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)) !important; } .xl\:grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)) !important; } .xl\:grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)) !important; } .xl\:grid-rows-none { grid-template-rows: none !important; } .xl\:row-auto { grid-row: auto !important; } .xl\:row-span-1 { grid-row: span 1 / span 1 !important; } .xl\:row-span-2 { grid-row: span 2 / span 2 !important; } .xl\:row-span-3 { grid-row: span 3 / span 3 !important; } .xl\:row-span-4 { grid-row: span 4 / span 4 !important; } .xl\:row-span-5 { grid-row: span 5 / span 5 !important; } .xl\:row-span-6 { grid-row: span 6 / span 6 !important; } .xl\:row-start-1 { grid-row-start: 1 !important; } .xl\:row-start-2 { grid-row-start: 2 !important; } .xl\:row-start-3 { grid-row-start: 3 !important; } .xl\:row-start-4 { grid-row-start: 4 !important; } .xl\:row-start-5 { grid-row-start: 5 !important; } .xl\:row-start-6 { grid-row-start: 6 !important; } .xl\:row-start-7 { grid-row-start: 7 !important; } .xl\:row-start-auto { grid-row-start: auto !important; } .xl\:row-end-1 { grid-row-end: 1 !important; } .xl\:row-end-2 { grid-row-end: 2 !important; } .xl\:row-end-3 { grid-row-end: 3 !important; } .xl\:row-end-4 { grid-row-end: 4 !important; } .xl\:row-end-5 { grid-row-end: 5 !important; } .xl\:row-end-6 { grid-row-end: 6 !important; } .xl\:row-end-7 { grid-row-end: 7 !important; } .xl\:row-end-auto { grid-row-end: auto !important; } .xl\:transform { --transform-translate-x: 0 !important; --transform-translate-y: 0 !important; --transform-rotate: 0 !important; --transform-skew-x: 0 !important; --transform-skew-y: 0 !important; --transform-scale-x: 1 !important; --transform-scale-y: 1 !important; transform: translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y)) !important; } .xl\:transform-none { transform: none !important; } .xl\:origin-center { transform-origin: center !important; } .xl\:origin-top { transform-origin: top !important; } .xl\:origin-top-right { transform-origin: top right !important; } .xl\:origin-right { transform-origin: right !important; } .xl\:origin-bottom-right { transform-origin: bottom right !important; } .xl\:origin-bottom { transform-origin: bottom !important; } .xl\:origin-bottom-left { transform-origin: bottom left !important; } .xl\:origin-left { transform-origin: left !important; } .xl\:origin-top-left { transform-origin: top left !important; } .xl\:icon-size-12 { width: 12px !important; height: 12px !important; min-width: 12px !important; min-height: 12px !important; font-size: 12px !important; line-height: 12px !important; } .xl\:icon-size-12 svg { width: 12px !important; height: 12px !important; } .xl\:icon-size-14 { width: 14px !important; height: 14px !important; min-width: 14px !important; min-height: 14px !important; font-size: 14px !important; line-height: 14px !important; } .xl\:icon-size-14 svg { width: 14px !important; height: 14px !important; } .xl\:icon-size-16 { width: 16px !important; height: 16px !important; min-width: 16px !important; min-height: 16px !important; font-size: 16px !important; line-height: 16px !important; } .xl\:icon-size-16 svg { width: 16px !important; height: 16px !important; } .xl\:icon-size-18 { width: 18px !important; height: 18px !important; min-width: 18px !important; min-height: 18px !important; font-size: 18px !important; line-height: 18px !important; } .xl\:icon-size-18 svg { width: 18px !important; height: 18px !important; } .xl\:icon-size-20 { width: 20px !important; height: 20px !important; min-width: 20px !important; min-height: 20px !important; font-size: 20px !important; line-height: 20px !important; } .xl\:icon-size-20 svg { width: 20px !important; height: 20px !important; } .xl\:icon-size-24 { width: 24px !important; height: 24px !important; min-width: 24px !important; min-height: 24px !important; font-size: 24px !important; line-height: 24px !important; } .xl\:icon-size-24 svg { width: 24px !important; height: 24px !important; } .xl\:icon-size-32 { width: 32px !important; height: 32px !important; min-width: 32px !important; min-height: 32px !important; font-size: 32px !important; line-height: 32px !important; } .xl\:icon-size-32 svg { width: 32px !important; height: 32px !important; } .xl\:icon-size-40 { width: 40px !important; height: 40px !important; min-width: 40px !important; min-height: 40px !important; font-size: 40px !important; line-height: 40px !important; } .xl\:icon-size-40 svg { width: 40px !important; height: 40px !important; } .xl\:icon-size-48 { width: 48px !important; height: 48px !important; min-width: 48px !important; min-height: 48px !important; font-size: 48px !important; line-height: 48px !important; } .xl\:icon-size-48 svg { width: 48px !important; height: 48px !important; } .xl\:icon-size-56 { width: 56px !important; height: 56px !important; min-width: 56px !important; min-height: 56px !important; font-size: 56px !important; line-height: 56px !important; } .xl\:icon-size-56 svg { width: 56px !important; height: 56px !important; } .xl\:icon-size-64 { width: 64px !important; height: 64px !important; min-width: 64px !important; min-height: 64px !important; font-size: 64px !important; line-height: 64px !important; } .xl\:icon-size-64 svg { width: 64px !important; height: 64px !important; } .xl\:icon-size-72 { width: 72px !important; height: 72px !important; min-width: 72px !important; min-height: 72px !important; font-size: 72px !important; line-height: 72px !important; } .xl\:icon-size-72 svg { width: 72px !important; height: 72px !important; } .xl\:icon-size-80 { width: 80px !important; height: 80px !important; min-width: 80px !important; min-height: 80px !important; font-size: 80px !important; line-height: 80px !important; } .xl\:icon-size-80 svg { width: 80px !important; height: 80px !important; } .xl\:icon-size-88 { width: 88px !important; height: 88px !important; min-width: 88px !important; min-height: 88px !important; font-size: 88px !important; line-height: 88px !important; } .xl\:icon-size-88 svg { width: 88px !important; height: 88px !important; } .xl\:icon-size-96 { width: 96px !important; height: 96px !important; min-width: 96px !important; min-height: 96px !important; font-size: 96px !important; line-height: 96px !important; } .xl\:icon-size-96 svg { width: 96px !important; height: 96px !important; } } @media (max-width: 959px) { .lt-md\:space-y-0 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0px * var(--space-y-reverse)) !important; } .lt-md\:space-x-0 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0px * var(--space-x-reverse)) !important; margin-left: calc(0px * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.25rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.25rem * var(--space-x-reverse)) !important; margin-left: calc(0.25rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.5rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.5rem * var(--space-x-reverse)) !important; margin-left: calc(0.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.75rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.75rem * var(--space-x-reverse)) !important; margin-left: calc(0.75rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1rem * var(--space-x-reverse)) !important; margin-left: calc(1rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.25rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.25rem * var(--space-x-reverse)) !important; margin-left: calc(1.25rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.5rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.5rem * var(--space-x-reverse)) !important; margin-left: calc(1.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2rem * var(--space-x-reverse)) !important; margin-left: calc(2rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2.5rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2.5rem * var(--space-x-reverse)) !important; margin-left: calc(2.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3rem * var(--space-x-reverse)) !important; margin-left: calc(3rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3.5rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3.5rem * var(--space-x-reverse)) !important; margin-left: calc(3.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4rem * var(--space-x-reverse)) !important; margin-left: calc(4rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4.5rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4.5rem * var(--space-x-reverse)) !important; margin-left: calc(4.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5rem * var(--space-x-reverse)) !important; margin-left: calc(5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5.5rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5.5rem * var(--space-x-reverse)) !important; margin-left: calc(5.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6rem * var(--space-x-reverse)) !important; margin-left: calc(6rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6.5rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6.5rem * var(--space-x-reverse)) !important; margin-left: calc(6.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7rem * var(--space-x-reverse)) !important; margin-left: calc(7rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7.5rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7.5rem * var(--space-x-reverse)) !important; margin-left: calc(7.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(8rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(8rem * var(--space-x-reverse)) !important; margin-left: calc(8rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(9rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(9rem * var(--space-x-reverse)) !important; margin-left: calc(9rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(10rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(10rem * var(--space-x-reverse)) !important; margin-left: calc(10rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(12rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(12rem * var(--space-x-reverse)) !important; margin-left: calc(12rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(14rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(14rem * var(--space-x-reverse)) !important; margin-left: calc(14rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(16rem * var(--space-y-reverse)) !important; } .lt-md\:space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(16rem * var(--space-x-reverse)) !important; margin-left: calc(16rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1px * var(--space-y-reverse)) !important; } .lt-md\:space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1px * var(--space-x-reverse)) !important; margin-left: calc(1px * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2px * var(--space-y-reverse)) !important; } .lt-md\:space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2px * var(--space-x-reverse)) !important; margin-left: calc(2px * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.25rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.25rem * var(--space-x-reverse)) !important; margin-left: calc(-0.25rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.5rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.5rem * var(--space-x-reverse)) !important; margin-left: calc(-0.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.75rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.75rem * var(--space-x-reverse)) !important; margin-left: calc(-0.75rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1rem * var(--space-x-reverse)) !important; margin-left: calc(-1rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.25rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.25rem * var(--space-x-reverse)) !important; margin-left: calc(-1.25rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.5rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.5rem * var(--space-x-reverse)) !important; margin-left: calc(-1.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2rem * var(--space-x-reverse)) !important; margin-left: calc(-2rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2.5rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2.5rem * var(--space-x-reverse)) !important; margin-left: calc(-2.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3rem * var(--space-x-reverse)) !important; margin-left: calc(-3rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3.5rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3.5rem * var(--space-x-reverse)) !important; margin-left: calc(-3.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4rem * var(--space-x-reverse)) !important; margin-left: calc(-4rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4.5rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4.5rem * var(--space-x-reverse)) !important; margin-left: calc(-4.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5rem * var(--space-x-reverse)) !important; margin-left: calc(-5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5.5rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5.5rem * var(--space-x-reverse)) !important; margin-left: calc(-5.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6rem * var(--space-x-reverse)) !important; margin-left: calc(-6rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6.5rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6.5rem * var(--space-x-reverse)) !important; margin-left: calc(-6.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7rem * var(--space-x-reverse)) !important; margin-left: calc(-7rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7.5rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7.5rem * var(--space-x-reverse)) !important; margin-left: calc(-7.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-8rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-8rem * var(--space-x-reverse)) !important; margin-left: calc(-8rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-9rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-9rem * var(--space-x-reverse)) !important; margin-left: calc(-9rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-10rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-10rem * var(--space-x-reverse)) !important; margin-left: calc(-10rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-12rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-12rem * var(--space-x-reverse)) !important; margin-left: calc(-12rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-14rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-14rem * var(--space-x-reverse)) !important; margin-left: calc(-14rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-16rem * var(--space-y-reverse)) !important; } .lt-md\:-space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-16rem * var(--space-x-reverse)) !important; margin-left: calc(-16rem * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1px * var(--space-y-reverse)) !important; } .lt-md\:-space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1px * var(--space-x-reverse)) !important; margin-left: calc(-1px * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:-space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2px * var(--space-y-reverse)) !important; } .lt-md\:-space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2px * var(--space-x-reverse)) !important; margin-left: calc(-2px * calc(1 - var(--space-x-reverse))) !important; } .lt-md\:space-y-reverse > :not(template) ~ :not(template) { --space-y-reverse: 1 !important; } .lt-md\:space-x-reverse > :not(template) ~ :not(template) { --space-x-reverse: 1 !important; } .lt-md\:divide-y-0 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(0px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(0px * var(--divide-y-reverse)) !important; } .lt-md\:divide-x-0 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(0px * var(--divide-x-reverse)) !important; border-left-width: calc(0px * calc(1 - var(--divide-x-reverse))) !important; } .lt-md\:divide-y-2 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(2px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(2px * var(--divide-y-reverse)) !important; } .lt-md\:divide-x-2 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(2px * var(--divide-x-reverse)) !important; border-left-width: calc(2px * calc(1 - var(--divide-x-reverse))) !important; } .lt-md\:divide-y-4 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(4px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(4px * var(--divide-y-reverse)) !important; } .lt-md\:divide-x-4 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(4px * var(--divide-x-reverse)) !important; border-left-width: calc(4px * calc(1 - var(--divide-x-reverse))) !important; } .lt-md\:divide-y-8 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(8px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(8px * var(--divide-y-reverse)) !important; } .lt-md\:divide-x-8 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(8px * var(--divide-x-reverse)) !important; border-left-width: calc(8px * calc(1 - var(--divide-x-reverse))) !important; } .lt-md\:divide-y > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(1px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(1px * var(--divide-y-reverse)) !important; } .lt-md\:divide-x > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(1px * var(--divide-x-reverse)) !important; border-left-width: calc(1px * calc(1 - var(--divide-x-reverse))) !important; } .lt-md\:divide-y-reverse > :not(template) ~ :not(template) { --divide-y-reverse: 1 !important; } .lt-md\:divide-x-reverse > :not(template) ~ :not(template) { --divide-x-reverse: 1 !important; } .lt-md\:divide-current > :not(template) ~ :not(template) { border-color: currentColor !important; } .lt-md\:divide-transparent > :not(template) ~ :not(template) { border-color: transparent !important; } .lt-md\:divide-white > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFFFFF !important; border-color: rgba(255, 255, 255, var(--divide-opacity)) !important; } .lt-md\:divide-black > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #000000 !important; border-color: rgba(0, 0, 0, var(--divide-opacity)) !important; } .lt-md\:divide-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F9FAFB !important; border-color: rgba(249, 250, 251, var(--divide-opacity)) !important; } .lt-md\:divide-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F4F5F7 !important; border-color: rgba(244, 245, 247, var(--divide-opacity)) !important; } .lt-md\:divide-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5E7EB !important; border-color: rgba(229, 231, 235, var(--divide-opacity)) !important; } .lt-md\:divide-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D2D6DC !important; border-color: rgba(210, 214, 220, var(--divide-opacity)) !important; } .lt-md\:divide-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9FA6B2 !important; border-color: rgba(159, 166, 178, var(--divide-opacity)) !important; } .lt-md\:divide-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .lt-md\:divide-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4B5563 !important; border-color: rgba(75, 85, 99, var(--divide-opacity)) !important; } .lt-md\:divide-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #374151 !important; border-color: rgba(55, 65, 81, var(--divide-opacity)) !important; } .lt-md\:divide-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #252F3F !important; border-color: rgba(37, 47, 63, var(--divide-opacity)) !important; } .lt-md\:divide-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #161E2E !important; border-color: rgba(22, 30, 46, var(--divide-opacity)) !important; } .lt-md\:divide-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .lt-md\:divide-cool-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBFDFE !important; border-color: rgba(251, 253, 254, var(--divide-opacity)) !important; } .lt-md\:divide-cool-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F1F5F9 !important; border-color: rgba(241, 245, 249, var(--divide-opacity)) !important; } .lt-md\:divide-cool-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E2E8F0 !important; border-color: rgba(226, 232, 240, var(--divide-opacity)) !important; } .lt-md\:divide-cool-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CFD8E3 !important; border-color: rgba(207, 216, 227, var(--divide-opacity)) !important; } .lt-md\:divide-cool-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #97A6BA !important; border-color: rgba(151, 166, 186, var(--divide-opacity)) !important; } .lt-md\:divide-cool-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .lt-md\:divide-cool-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #475569 !important; border-color: rgba(71, 85, 105, var(--divide-opacity)) !important; } .lt-md\:divide-cool-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #364152 !important; border-color: rgba(54, 65, 82, var(--divide-opacity)) !important; } .lt-md\:divide-cool-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #27303F !important; border-color: rgba(39, 48, 63, var(--divide-opacity)) !important; } .lt-md\:divide-cool-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A202E !important; border-color: rgba(26, 32, 46, var(--divide-opacity)) !important; } .lt-md\:divide-cool-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .lt-md\:divide-red-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F2 !important; border-color: rgba(253, 242, 242, var(--divide-opacity)) !important; } .lt-md\:divide-red-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDE8E8 !important; border-color: rgba(253, 232, 232, var(--divide-opacity)) !important; } .lt-md\:divide-red-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBD5D5 !important; border-color: rgba(251, 213, 213, var(--divide-opacity)) !important; } .lt-md\:divide-red-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4B4 !important; border-color: rgba(248, 180, 180, var(--divide-opacity)) !important; } .lt-md\:divide-red-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F98080 !important; border-color: rgba(249, 128, 128, var(--divide-opacity)) !important; } .lt-md\:divide-red-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .lt-md\:divide-red-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E02424 !important; border-color: rgba(224, 36, 36, var(--divide-opacity)) !important; } .lt-md\:divide-red-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C81E1E !important; border-color: rgba(200, 30, 30, var(--divide-opacity)) !important; } .lt-md\:divide-red-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9B1C1C !important; border-color: rgba(155, 28, 28, var(--divide-opacity)) !important; } .lt-md\:divide-red-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .lt-md\:divide-red > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .lt-md\:divide-orange-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFF8F1 !important; border-color: rgba(255, 248, 241, var(--divide-opacity)) !important; } .lt-md\:divide-orange-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FEECDC !important; border-color: rgba(254, 236, 220, var(--divide-opacity)) !important; } .lt-md\:divide-orange-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCD9BD !important; border-color: rgba(252, 217, 189, var(--divide-opacity)) !important; } .lt-md\:divide-orange-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDBA8C !important; border-color: rgba(253, 186, 140, var(--divide-opacity)) !important; } .lt-md\:divide-orange-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF8A4C !important; border-color: rgba(255, 138, 76, var(--divide-opacity)) !important; } .lt-md\:divide-orange-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .lt-md\:divide-orange-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D03801 !important; border-color: rgba(208, 56, 1, var(--divide-opacity)) !important; } .lt-md\:divide-orange-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B43403 !important; border-color: rgba(180, 52, 3, var(--divide-opacity)) !important; } .lt-md\:divide-orange-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8A2C0D !important; border-color: rgba(138, 44, 13, var(--divide-opacity)) !important; } .lt-md\:divide-orange-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .lt-md\:divide-orange > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .lt-md\:divide-yellow-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDFDEA !important; border-color: rgba(253, 253, 234, var(--divide-opacity)) !important; } .lt-md\:divide-yellow-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF6B2 !important; border-color: rgba(253, 246, 178, var(--divide-opacity)) !important; } .lt-md\:divide-yellow-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE96A !important; border-color: rgba(252, 233, 106, var(--divide-opacity)) !important; } .lt-md\:divide-yellow-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FACA15 !important; border-color: rgba(250, 202, 21, var(--divide-opacity)) !important; } .lt-md\:divide-yellow-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E3A008 !important; border-color: rgba(227, 160, 8, var(--divide-opacity)) !important; } .lt-md\:divide-yellow-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .lt-md\:divide-yellow-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9F580A !important; border-color: rgba(159, 88, 10, var(--divide-opacity)) !important; } .lt-md\:divide-yellow-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8E4B10 !important; border-color: rgba(142, 75, 16, var(--divide-opacity)) !important; } .lt-md\:divide-yellow-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #723B13 !important; border-color: rgba(114, 59, 19, var(--divide-opacity)) !important; } .lt-md\:divide-yellow-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #633112 !important; border-color: rgba(99, 49, 18, var(--divide-opacity)) !important; } .lt-md\:divide-yellow > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .lt-md\:divide-green-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F3FAF7 !important; border-color: rgba(243, 250, 247, var(--divide-opacity)) !important; } .lt-md\:divide-green-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DEF7EC !important; border-color: rgba(222, 247, 236, var(--divide-opacity)) !important; } .lt-md\:divide-green-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BCF0DA !important; border-color: rgba(188, 240, 218, var(--divide-opacity)) !important; } .lt-md\:divide-green-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #84E1BC !important; border-color: rgba(132, 225, 188, var(--divide-opacity)) !important; } .lt-md\:divide-green-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #31C48D !important; border-color: rgba(49, 196, 141, var(--divide-opacity)) !important; } .lt-md\:divide-green-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .lt-md\:divide-green-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #057A55 !important; border-color: rgba(5, 122, 85, var(--divide-opacity)) !important; } .lt-md\:divide-green-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #046C4E !important; border-color: rgba(4, 108, 78, var(--divide-opacity)) !important; } .lt-md\:divide-green-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #03543F !important; border-color: rgba(3, 84, 63, var(--divide-opacity)) !important; } .lt-md\:divide-green-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014737 !important; border-color: rgba(1, 71, 55, var(--divide-opacity)) !important; } .lt-md\:divide-green > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .lt-md\:divide-teal-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDFAFA !important; border-color: rgba(237, 250, 250, var(--divide-opacity)) !important; } .lt-md\:divide-teal-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D5F5F6 !important; border-color: rgba(213, 245, 246, var(--divide-opacity)) !important; } .lt-md\:divide-teal-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AFECEF !important; border-color: rgba(175, 236, 239, var(--divide-opacity)) !important; } .lt-md\:divide-teal-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7EDCE2 !important; border-color: rgba(126, 220, 226, var(--divide-opacity)) !important; } .lt-md\:divide-teal-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #16BDCA !important; border-color: rgba(22, 189, 202, var(--divide-opacity)) !important; } .lt-md\:divide-teal-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .lt-md\:divide-teal-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #047481 !important; border-color: rgba(4, 116, 129, var(--divide-opacity)) !important; } .lt-md\:divide-teal-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #036672 !important; border-color: rgba(3, 102, 114, var(--divide-opacity)) !important; } .lt-md\:divide-teal-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #05505C !important; border-color: rgba(5, 80, 92, var(--divide-opacity)) !important; } .lt-md\:divide-teal-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014451 !important; border-color: rgba(1, 68, 81, var(--divide-opacity)) !important; } .lt-md\:divide-teal > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .lt-md\:divide-blue-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EBF5FF !important; border-color: rgba(235, 245, 255, var(--divide-opacity)) !important; } .lt-md\:divide-blue-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E1EFFE !important; border-color: rgba(225, 239, 254, var(--divide-opacity)) !important; } .lt-md\:divide-blue-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C3DDFD !important; border-color: rgba(195, 221, 253, var(--divide-opacity)) !important; } .lt-md\:divide-blue-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #A4CAFE !important; border-color: rgba(164, 202, 254, var(--divide-opacity)) !important; } .lt-md\:divide-blue-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #76A9FA !important; border-color: rgba(118, 169, 250, var(--divide-opacity)) !important; } .lt-md\:divide-blue-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .lt-md\:divide-blue-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1C64F2 !important; border-color: rgba(28, 100, 242, var(--divide-opacity)) !important; } .lt-md\:divide-blue-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A56DB !important; border-color: rgba(26, 86, 219, var(--divide-opacity)) !important; } .lt-md\:divide-blue-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1E429F !important; border-color: rgba(30, 66, 159, var(--divide-opacity)) !important; } .lt-md\:divide-blue-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #233876 !important; border-color: rgba(35, 56, 118, var(--divide-opacity)) !important; } .lt-md\:divide-blue > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .lt-md\:divide-indigo-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F0F5FF !important; border-color: rgba(240, 245, 255, var(--divide-opacity)) !important; } .lt-md\:divide-indigo-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5EDFF !important; border-color: rgba(229, 237, 255, var(--divide-opacity)) !important; } .lt-md\:divide-indigo-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CDDBFE !important; border-color: rgba(205, 219, 254, var(--divide-opacity)) !important; } .lt-md\:divide-indigo-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B4C6FC !important; border-color: rgba(180, 198, 252, var(--divide-opacity)) !important; } .lt-md\:divide-indigo-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8DA2FB !important; border-color: rgba(141, 162, 251, var(--divide-opacity)) !important; } .lt-md\:divide-indigo-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .lt-md\:divide-indigo-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5850EC !important; border-color: rgba(88, 80, 236, var(--divide-opacity)) !important; } .lt-md\:divide-indigo-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5145CD !important; border-color: rgba(81, 69, 205, var(--divide-opacity)) !important; } .lt-md\:divide-indigo-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #42389D !important; border-color: rgba(66, 56, 157, var(--divide-opacity)) !important; } .lt-md\:divide-indigo-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #362F78 !important; border-color: rgba(54, 47, 120, var(--divide-opacity)) !important; } .lt-md\:divide-indigo > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .lt-md\:divide-purple-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F6F5FF !important; border-color: rgba(246, 245, 255, var(--divide-opacity)) !important; } .lt-md\:divide-purple-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDEBFE !important; border-color: rgba(237, 235, 254, var(--divide-opacity)) !important; } .lt-md\:divide-purple-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DCD7FE !important; border-color: rgba(220, 215, 254, var(--divide-opacity)) !important; } .lt-md\:divide-purple-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CABFFD !important; border-color: rgba(202, 191, 253, var(--divide-opacity)) !important; } .lt-md\:divide-purple-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AC94FA !important; border-color: rgba(172, 148, 250, var(--divide-opacity)) !important; } .lt-md\:divide-purple-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .lt-md\:divide-purple-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7E3AF2 !important; border-color: rgba(126, 58, 242, var(--divide-opacity)) !important; } .lt-md\:divide-purple-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6C2BD9 !important; border-color: rgba(108, 43, 217, var(--divide-opacity)) !important; } .lt-md\:divide-purple-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5521B5 !important; border-color: rgba(85, 33, 181, var(--divide-opacity)) !important; } .lt-md\:divide-purple-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4A1D96 !important; border-color: rgba(74, 29, 150, var(--divide-opacity)) !important; } .lt-md\:divide-purple > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .lt-md\:divide-pink-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F8 !important; border-color: rgba(253, 242, 248, var(--divide-opacity)) !important; } .lt-md\:divide-pink-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE8F3 !important; border-color: rgba(252, 232, 243, var(--divide-opacity)) !important; } .lt-md\:divide-pink-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FAD1E8 !important; border-color: rgba(250, 209, 232, var(--divide-opacity)) !important; } .lt-md\:divide-pink-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4D9 !important; border-color: rgba(248, 180, 217, var(--divide-opacity)) !important; } .lt-md\:divide-pink-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F17EB8 !important; border-color: rgba(241, 126, 184, var(--divide-opacity)) !important; } .lt-md\:divide-pink-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .lt-md\:divide-pink-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D61F69 !important; border-color: rgba(214, 31, 105, var(--divide-opacity)) !important; } .lt-md\:divide-pink-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BF125D !important; border-color: rgba(191, 18, 93, var(--divide-opacity)) !important; } .lt-md\:divide-pink-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #99154B !important; border-color: rgba(153, 21, 75, var(--divide-opacity)) !important; } .lt-md\:divide-pink-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #751A3D !important; border-color: rgba(117, 26, 61, var(--divide-opacity)) !important; } .lt-md\:divide-pink > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .lt-md\:divide-opacity-0 > :not(template) ~ :not(template) { --divide-opacity: 0 !important; } .lt-md\:divide-opacity-12 > :not(template) ~ :not(template) { --divide-opacity: 0.12 !important; } .lt-md\:divide-opacity-25 > :not(template) ~ :not(template) { --divide-opacity: 0.25 !important; } .lt-md\:divide-opacity-38 > :not(template) ~ :not(template) { --divide-opacity: 0.38 !important; } .lt-md\:divide-opacity-50 > :not(template) ~ :not(template) { --divide-opacity: 0.5 !important; } .lt-md\:divide-opacity-54 > :not(template) ~ :not(template) { --divide-opacity: 0.54 !important; } .lt-md\:divide-opacity-70 > :not(template) ~ :not(template) { --divide-opacity: 0.70 !important; } .lt-md\:divide-opacity-75 > :not(template) ~ :not(template) { --divide-opacity: 0.75 !important; } .lt-md\:divide-opacity-84 > :not(template) ~ :not(template) { --divide-opacity: 0.84 !important; } .lt-md\:divide-opacity-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; } .lt-md\:sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .lt-md\:not-sr-only { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .lt-md\:focus\:sr-only:focus { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .lt-md\:focus\:not-sr-only:focus { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .lt-md\:appearance-none { -webkit-appearance: none !important; -moz-appearance: none !important; appearance: none !important; } .lt-md\:bg-fixed { background-attachment: fixed !important; } .lt-md\:bg-local { background-attachment: local !important; } .lt-md\:bg-scroll { background-attachment: scroll !important; } .lt-md\:bg-opacity-0 { --bg-opacity: 0 !important; } .lt-md\:bg-opacity-12 { --bg-opacity: 0.12 !important; } .lt-md\:bg-opacity-25 { --bg-opacity: 0.25 !important; } .lt-md\:bg-opacity-38 { --bg-opacity: 0.38 !important; } .lt-md\:bg-opacity-50 { --bg-opacity: 0.5 !important; } .lt-md\:bg-opacity-54 { --bg-opacity: 0.54 !important; } .lt-md\:bg-opacity-70 { --bg-opacity: 0.70 !important; } .lt-md\:bg-opacity-75 { --bg-opacity: 0.75 !important; } .lt-md\:bg-opacity-84 { --bg-opacity: 0.84 !important; } .lt-md\:bg-opacity-100 { --bg-opacity: 1 !important; } .lt-md\:hover\:bg-opacity-0:hover { --bg-opacity: 0 !important; } .lt-md\:hover\:bg-opacity-12:hover { --bg-opacity: 0.12 !important; } .lt-md\:hover\:bg-opacity-25:hover { --bg-opacity: 0.25 !important; } .lt-md\:hover\:bg-opacity-38:hover { --bg-opacity: 0.38 !important; } .lt-md\:hover\:bg-opacity-50:hover { --bg-opacity: 0.5 !important; } .lt-md\:hover\:bg-opacity-54:hover { --bg-opacity: 0.54 !important; } .lt-md\:hover\:bg-opacity-70:hover { --bg-opacity: 0.70 !important; } .lt-md\:hover\:bg-opacity-75:hover { --bg-opacity: 0.75 !important; } .lt-md\:hover\:bg-opacity-84:hover { --bg-opacity: 0.84 !important; } .lt-md\:hover\:bg-opacity-100:hover { --bg-opacity: 1 !important; } .lt-md\:focus\:bg-opacity-0:focus { --bg-opacity: 0 !important; } .lt-md\:focus\:bg-opacity-12:focus { --bg-opacity: 0.12 !important; } .lt-md\:focus\:bg-opacity-25:focus { --bg-opacity: 0.25 !important; } .lt-md\:focus\:bg-opacity-38:focus { --bg-opacity: 0.38 !important; } .lt-md\:focus\:bg-opacity-50:focus { --bg-opacity: 0.5 !important; } .lt-md\:focus\:bg-opacity-54:focus { --bg-opacity: 0.54 !important; } .lt-md\:focus\:bg-opacity-70:focus { --bg-opacity: 0.70 !important; } .lt-md\:focus\:bg-opacity-75:focus { --bg-opacity: 0.75 !important; } .lt-md\:focus\:bg-opacity-84:focus { --bg-opacity: 0.84 !important; } .lt-md\:focus\:bg-opacity-100:focus { --bg-opacity: 1 !important; } .lt-md\:bg-bottom { background-position: bottom !important; } .lt-md\:bg-center { background-position: center !important; } .lt-md\:bg-left { background-position: left !important; } .lt-md\:bg-left-bottom { background-position: left bottom !important; } .lt-md\:bg-left-top { background-position: left top !important; } .lt-md\:bg-right { background-position: right !important; } .lt-md\:bg-right-bottom { background-position: right bottom !important; } .lt-md\:bg-right-top { background-position: right top !important; } .lt-md\:bg-top { background-position: top !important; } .lt-md\:bg-repeat { background-repeat: repeat !important; } .lt-md\:bg-no-repeat { background-repeat: no-repeat !important; } .lt-md\:bg-repeat-x { background-repeat: repeat-x !important; } .lt-md\:bg-repeat-y { background-repeat: repeat-y !important; } .lt-md\:bg-repeat-round { background-repeat: round !important; } .lt-md\:bg-repeat-space { background-repeat: space !important; } .lt-md\:bg-auto { background-size: auto !important; } .lt-md\:bg-cover { background-size: cover !important; } .lt-md\:bg-contain { background-size: contain !important; } .lt-md\:border-collapse { border-collapse: collapse !important; } .lt-md\:border-separate { border-collapse: separate !important; } .lt-md\:border-opacity-0 { --border-opacity: 0 !important; } .lt-md\:border-opacity-12 { --border-opacity: 0.12 !important; } .lt-md\:border-opacity-25 { --border-opacity: 0.25 !important; } .lt-md\:border-opacity-38 { --border-opacity: 0.38 !important; } .lt-md\:border-opacity-50 { --border-opacity: 0.5 !important; } .lt-md\:border-opacity-54 { --border-opacity: 0.54 !important; } .lt-md\:border-opacity-70 { --border-opacity: 0.70 !important; } .lt-md\:border-opacity-75 { --border-opacity: 0.75 !important; } .lt-md\:border-opacity-84 { --border-opacity: 0.84 !important; } .lt-md\:border-opacity-100 { --border-opacity: 1 !important; } .lt-md\:hover\:border-opacity-0:hover { --border-opacity: 0 !important; } .lt-md\:hover\:border-opacity-12:hover { --border-opacity: 0.12 !important; } .lt-md\:hover\:border-opacity-25:hover { --border-opacity: 0.25 !important; } .lt-md\:hover\:border-opacity-38:hover { --border-opacity: 0.38 !important; } .lt-md\:hover\:border-opacity-50:hover { --border-opacity: 0.5 !important; } .lt-md\:hover\:border-opacity-54:hover { --border-opacity: 0.54 !important; } .lt-md\:hover\:border-opacity-70:hover { --border-opacity: 0.70 !important; } .lt-md\:hover\:border-opacity-75:hover { --border-opacity: 0.75 !important; } .lt-md\:hover\:border-opacity-84:hover { --border-opacity: 0.84 !important; } .lt-md\:hover\:border-opacity-100:hover { --border-opacity: 1 !important; } .lt-md\:focus\:border-opacity-0:focus { --border-opacity: 0 !important; } .lt-md\:focus\:border-opacity-12:focus { --border-opacity: 0.12 !important; } .lt-md\:focus\:border-opacity-25:focus { --border-opacity: 0.25 !important; } .lt-md\:focus\:border-opacity-38:focus { --border-opacity: 0.38 !important; } .lt-md\:focus\:border-opacity-50:focus { --border-opacity: 0.5 !important; } .lt-md\:focus\:border-opacity-54:focus { --border-opacity: 0.54 !important; } .lt-md\:focus\:border-opacity-70:focus { --border-opacity: 0.70 !important; } .lt-md\:focus\:border-opacity-75:focus { --border-opacity: 0.75 !important; } .lt-md\:focus\:border-opacity-84:focus { --border-opacity: 0.84 !important; } .lt-md\:focus\:border-opacity-100:focus { --border-opacity: 1 !important; } .lt-md\:rounded-none { border-radius: 0 !important; } .lt-md\:rounded-sm { border-radius: 0.125rem !important; } .lt-md\:rounded { border-radius: 0.25rem !important; } .lt-md\:rounded-md { border-radius: 0.375rem !important; } .lt-md\:rounded-lg { border-radius: 0.5rem !important; } .lt-md\:rounded-full { border-radius: 9999px !important; } .lt-md\:rounded-t-none { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } .lt-md\:rounded-r-none { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } .lt-md\:rounded-b-none { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } .lt-md\:rounded-l-none { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; } .lt-md\:rounded-t-sm { border-top-left-radius: 0.125rem !important; border-top-right-radius: 0.125rem !important; } .lt-md\:rounded-r-sm { border-top-right-radius: 0.125rem !important; border-bottom-right-radius: 0.125rem !important; } .lt-md\:rounded-b-sm { border-bottom-right-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .lt-md\:rounded-l-sm { border-top-left-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .lt-md\:rounded-t { border-top-left-radius: 0.25rem !important; border-top-right-radius: 0.25rem !important; } .lt-md\:rounded-r { border-top-right-radius: 0.25rem !important; border-bottom-right-radius: 0.25rem !important; } .lt-md\:rounded-b { border-bottom-right-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .lt-md\:rounded-l { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .lt-md\:rounded-t-md { border-top-left-radius: 0.375rem !important; border-top-right-radius: 0.375rem !important; } .lt-md\:rounded-r-md { border-top-right-radius: 0.375rem !important; border-bottom-right-radius: 0.375rem !important; } .lt-md\:rounded-b-md { border-bottom-right-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .lt-md\:rounded-l-md { border-top-left-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .lt-md\:rounded-t-lg { border-top-left-radius: 0.5rem !important; border-top-right-radius: 0.5rem !important; } .lt-md\:rounded-r-lg { border-top-right-radius: 0.5rem !important; border-bottom-right-radius: 0.5rem !important; } .lt-md\:rounded-b-lg { border-bottom-right-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .lt-md\:rounded-l-lg { border-top-left-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .lt-md\:rounded-t-full { border-top-left-radius: 9999px !important; border-top-right-radius: 9999px !important; } .lt-md\:rounded-r-full { border-top-right-radius: 9999px !important; border-bottom-right-radius: 9999px !important; } .lt-md\:rounded-b-full { border-bottom-right-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .lt-md\:rounded-l-full { border-top-left-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .lt-md\:rounded-tl-none { border-top-left-radius: 0 !important; } .lt-md\:rounded-tr-none { border-top-right-radius: 0 !important; } .lt-md\:rounded-br-none { border-bottom-right-radius: 0 !important; } .lt-md\:rounded-bl-none { border-bottom-left-radius: 0 !important; } .lt-md\:rounded-tl-sm { border-top-left-radius: 0.125rem !important; } .lt-md\:rounded-tr-sm { border-top-right-radius: 0.125rem !important; } .lt-md\:rounded-br-sm { border-bottom-right-radius: 0.125rem !important; } .lt-md\:rounded-bl-sm { border-bottom-left-radius: 0.125rem !important; } .lt-md\:rounded-tl { border-top-left-radius: 0.25rem !important; } .lt-md\:rounded-tr { border-top-right-radius: 0.25rem !important; } .lt-md\:rounded-br { border-bottom-right-radius: 0.25rem !important; } .lt-md\:rounded-bl { border-bottom-left-radius: 0.25rem !important; } .lt-md\:rounded-tl-md { border-top-left-radius: 0.375rem !important; } .lt-md\:rounded-tr-md { border-top-right-radius: 0.375rem !important; } .lt-md\:rounded-br-md { border-bottom-right-radius: 0.375rem !important; } .lt-md\:rounded-bl-md { border-bottom-left-radius: 0.375rem !important; } .lt-md\:rounded-tl-lg { border-top-left-radius: 0.5rem !important; } .lt-md\:rounded-tr-lg { border-top-right-radius: 0.5rem !important; } .lt-md\:rounded-br-lg { border-bottom-right-radius: 0.5rem !important; } .lt-md\:rounded-bl-lg { border-bottom-left-radius: 0.5rem !important; } .lt-md\:rounded-tl-full { border-top-left-radius: 9999px !important; } .lt-md\:rounded-tr-full { border-top-right-radius: 9999px !important; } .lt-md\:rounded-br-full { border-bottom-right-radius: 9999px !important; } .lt-md\:rounded-bl-full { border-bottom-left-radius: 9999px !important; } .lt-md\:border-solid { border-style: solid !important; } .lt-md\:border-dashed { border-style: dashed !important; } .lt-md\:border-dotted { border-style: dotted !important; } .lt-md\:border-double { border-style: double !important; } .lt-md\:border-none { border-style: none !important; } .lt-md\:border-0 { border-width: 0 !important; } .lt-md\:border-2 { border-width: 2px !important; } .lt-md\:border-4 { border-width: 4px !important; } .lt-md\:border-8 { border-width: 8px !important; } .lt-md\:border { border-width: 1px !important; } .lt-md\:border-t-0 { border-top-width: 0 !important; } .lt-md\:border-r-0 { border-right-width: 0 !important; } .lt-md\:border-b-0 { border-bottom-width: 0 !important; } .lt-md\:border-l-0 { border-left-width: 0 !important; } .lt-md\:border-t-2 { border-top-width: 2px !important; } .lt-md\:border-r-2 { border-right-width: 2px !important; } .lt-md\:border-b-2 { border-bottom-width: 2px !important; } .lt-md\:border-l-2 { border-left-width: 2px !important; } .lt-md\:border-t-4 { border-top-width: 4px !important; } .lt-md\:border-r-4 { border-right-width: 4px !important; } .lt-md\:border-b-4 { border-bottom-width: 4px !important; } .lt-md\:border-l-4 { border-left-width: 4px !important; } .lt-md\:border-t-8 { border-top-width: 8px !important; } .lt-md\:border-r-8 { border-right-width: 8px !important; } .lt-md\:border-b-8 { border-bottom-width: 8px !important; } .lt-md\:border-l-8 { border-left-width: 8px !important; } .lt-md\:border-t { border-top-width: 1px !important; } .lt-md\:border-r { border-right-width: 1px !important; } .lt-md\:border-b { border-bottom-width: 1px !important; } .lt-md\:border-l { border-left-width: 1px !important; } .lt-md\:first\:border-0:first-child { border-width: 0 !important; } .lt-md\:first\:border-2:first-child { border-width: 2px !important; } .lt-md\:first\:border-4:first-child { border-width: 4px !important; } .lt-md\:first\:border-8:first-child { border-width: 8px !important; } .lt-md\:first\:border:first-child { border-width: 1px !important; } .lt-md\:first\:border-t-0:first-child { border-top-width: 0 !important; } .lt-md\:first\:border-r-0:first-child { border-right-width: 0 !important; } .lt-md\:first\:border-b-0:first-child { border-bottom-width: 0 !important; } .lt-md\:first\:border-l-0:first-child { border-left-width: 0 !important; } .lt-md\:first\:border-t-2:first-child { border-top-width: 2px !important; } .lt-md\:first\:border-r-2:first-child { border-right-width: 2px !important; } .lt-md\:first\:border-b-2:first-child { border-bottom-width: 2px !important; } .lt-md\:first\:border-l-2:first-child { border-left-width: 2px !important; } .lt-md\:first\:border-t-4:first-child { border-top-width: 4px !important; } .lt-md\:first\:border-r-4:first-child { border-right-width: 4px !important; } .lt-md\:first\:border-b-4:first-child { border-bottom-width: 4px !important; } .lt-md\:first\:border-l-4:first-child { border-left-width: 4px !important; } .lt-md\:first\:border-t-8:first-child { border-top-width: 8px !important; } .lt-md\:first\:border-r-8:first-child { border-right-width: 8px !important; } .lt-md\:first\:border-b-8:first-child { border-bottom-width: 8px !important; } .lt-md\:first\:border-l-8:first-child { border-left-width: 8px !important; } .lt-md\:first\:border-t:first-child { border-top-width: 1px !important; } .lt-md\:first\:border-r:first-child { border-right-width: 1px !important; } .lt-md\:first\:border-b:first-child { border-bottom-width: 1px !important; } .lt-md\:first\:border-l:first-child { border-left-width: 1px !important; } .lt-md\:last\:border-0:last-child { border-width: 0 !important; } .lt-md\:last\:border-2:last-child { border-width: 2px !important; } .lt-md\:last\:border-4:last-child { border-width: 4px !important; } .lt-md\:last\:border-8:last-child { border-width: 8px !important; } .lt-md\:last\:border:last-child { border-width: 1px !important; } .lt-md\:last\:border-t-0:last-child { border-top-width: 0 !important; } .lt-md\:last\:border-r-0:last-child { border-right-width: 0 !important; } .lt-md\:last\:border-b-0:last-child { border-bottom-width: 0 !important; } .lt-md\:last\:border-l-0:last-child { border-left-width: 0 !important; } .lt-md\:last\:border-t-2:last-child { border-top-width: 2px !important; } .lt-md\:last\:border-r-2:last-child { border-right-width: 2px !important; } .lt-md\:last\:border-b-2:last-child { border-bottom-width: 2px !important; } .lt-md\:last\:border-l-2:last-child { border-left-width: 2px !important; } .lt-md\:last\:border-t-4:last-child { border-top-width: 4px !important; } .lt-md\:last\:border-r-4:last-child { border-right-width: 4px !important; } .lt-md\:last\:border-b-4:last-child { border-bottom-width: 4px !important; } .lt-md\:last\:border-l-4:last-child { border-left-width: 4px !important; } .lt-md\:last\:border-t-8:last-child { border-top-width: 8px !important; } .lt-md\:last\:border-r-8:last-child { border-right-width: 8px !important; } .lt-md\:last\:border-b-8:last-child { border-bottom-width: 8px !important; } .lt-md\:last\:border-l-8:last-child { border-left-width: 8px !important; } .lt-md\:last\:border-t:last-child { border-top-width: 1px !important; } .lt-md\:last\:border-r:last-child { border-right-width: 1px !important; } .lt-md\:last\:border-b:last-child { border-bottom-width: 1px !important; } .lt-md\:last\:border-l:last-child { border-left-width: 1px !important; } .lt-md\:box-border { box-sizing: border-box !important; } .lt-md\:box-content { box-sizing: content-box !important; } .lt-md\:block { display: block !important; } .lt-md\:inline-block { display: inline-block !important; } .lt-md\:inline { display: inline !important; } .lt-md\:flex { display: flex !important; } .lt-md\:inline-flex { display: inline-flex !important; } .lt-md\:table { display: table !important; } .lt-md\:table-caption { display: table-caption !important; } .lt-md\:table-cell { display: table-cell !important; } .lt-md\:table-column { display: table-column !important; } .lt-md\:table-column-group { display: table-column-group !important; } .lt-md\:table-footer-group { display: table-footer-group !important; } .lt-md\:table-header-group { display: table-header-group !important; } .lt-md\:table-row-group { display: table-row-group !important; } .lt-md\:table-row { display: table-row !important; } .lt-md\:flow-root { display: flow-root !important; } .lt-md\:grid { display: grid !important; } .lt-md\:inline-grid { display: inline-grid !important; } .lt-md\:hidden { display: none !important; } .lt-md\:flex-row { flex-direction: row !important; } .lt-md\:flex-row-reverse { flex-direction: row-reverse !important; } .lt-md\:flex-col { flex-direction: column !important; } .lt-md\:flex-col-reverse { flex-direction: column-reverse !important; } .lt-md\:flex-wrap { flex-wrap: wrap !important; } .lt-md\:flex-wrap-reverse { flex-wrap: wrap-reverse !important; } .lt-md\:flex-no-wrap { flex-wrap: nowrap !important; } .lt-md\:items-start { align-items: flex-start !important; } .lt-md\:items-end { align-items: flex-end !important; } .lt-md\:items-center { align-items: center !important; } .lt-md\:items-baseline { align-items: baseline !important; } .lt-md\:items-stretch { align-items: stretch !important; } .lt-md\:self-auto { align-self: auto !important; } .lt-md\:self-start { align-self: flex-start !important; } .lt-md\:self-end { align-self: flex-end !important; } .lt-md\:self-center { align-self: center !important; } .lt-md\:self-stretch { align-self: stretch !important; } .lt-md\:justify-start { justify-content: flex-start !important; } .lt-md\:justify-end { justify-content: flex-end !important; } .lt-md\:justify-center { justify-content: center !important; } .lt-md\:justify-between { justify-content: space-between !important; } .lt-md\:justify-around { justify-content: space-around !important; } .lt-md\:justify-evenly { justify-content: space-evenly !important; } .lt-md\:content-center { align-content: center !important; } .lt-md\:content-start { align-content: flex-start !important; } .lt-md\:content-end { align-content: flex-end !important; } .lt-md\:content-between { align-content: space-between !important; } .lt-md\:content-around { align-content: space-around !important; } .lt-md\:flex-0 { flex: 0 0 auto !important; } .lt-md\:flex-1 { flex: 1 1 0% !important; } .lt-md\:flex-auto { flex: 1 1 auto !important; } .lt-md\:flex-initial { flex: 0 1 auto !important; } .lt-md\:flex-none { flex: none !important; } .lt-md\:flex-grow-0 { flex-grow: 0 !important; } .lt-md\:flex-grow { flex-grow: 1 !important; } .lt-md\:flex-shrink-0 { flex-shrink: 0 !important; } .lt-md\:flex-shrink { flex-shrink: 1 !important; } .lt-md\:order-1 { order: 1 !important; } .lt-md\:order-2 { order: 2 !important; } .lt-md\:order-3 { order: 3 !important; } .lt-md\:order-4 { order: 4 !important; } .lt-md\:order-5 { order: 5 !important; } .lt-md\:order-6 { order: 6 !important; } .lt-md\:order-7 { order: 7 !important; } .lt-md\:order-8 { order: 8 !important; } .lt-md\:order-9 { order: 9 !important; } .lt-md\:order-10 { order: 10 !important; } .lt-md\:order-11 { order: 11 !important; } .lt-md\:order-12 { order: 12 !important; } .lt-md\:order-first { order: -9999 !important; } .lt-md\:order-last { order: 9999 !important; } .lt-md\:order-none { order: 0 !important; } .lt-md\:font-hairline { font-weight: 100 !important; } .lt-md\:font-thin { font-weight: 200 !important; } .lt-md\:font-light { font-weight: 300 !important; } .lt-md\:font-normal { font-weight: 400 !important; } .lt-md\:font-medium { font-weight: 500 !important; } .lt-md\:font-semibold { font-weight: 600 !important; } .lt-md\:font-bold { font-weight: 700 !important; } .lt-md\:font-extrabold { font-weight: 800 !important; } .lt-md\:font-black { font-weight: 900 !important; } .lt-md\:h-0 { height: 0 !important; } .lt-md\:h-1 { height: 0.25rem !important; } .lt-md\:h-2 { height: 0.5rem !important; } .lt-md\:h-3 { height: 0.75rem !important; } .lt-md\:h-4 { height: 1rem !important; } .lt-md\:h-5 { height: 1.25rem !important; } .lt-md\:h-6 { height: 1.5rem !important; } .lt-md\:h-8 { height: 2rem !important; } .lt-md\:h-10 { height: 2.5rem !important; } .lt-md\:h-12 { height: 3rem !important; } .lt-md\:h-14 { height: 3.5rem !important; } .lt-md\:h-16 { height: 4rem !important; } .lt-md\:h-18 { height: 4.5rem !important; } .lt-md\:h-20 { height: 5rem !important; } .lt-md\:h-22 { height: 5.5rem !important; } .lt-md\:h-24 { height: 6rem !important; } .lt-md\:h-26 { height: 6.5rem !important; } .lt-md\:h-28 { height: 7rem !important; } .lt-md\:h-30 { height: 7.5rem !important; } .lt-md\:h-32 { height: 8rem !important; } .lt-md\:h-36 { height: 9rem !important; } .lt-md\:h-40 { height: 10rem !important; } .lt-md\:h-48 { height: 12rem !important; } .lt-md\:h-50 { height: 12.5rem !important; } .lt-md\:h-56 { height: 14rem !important; } .lt-md\:h-60 { height: 15rem !important; } .lt-md\:h-64 { height: 16rem !important; } .lt-md\:h-80 { height: 20rem !important; } .lt-md\:h-90 { height: 24rem !important; } .lt-md\:h-100 { height: 25rem !important; } .lt-md\:h-120 { height: 30rem !important; } .lt-md\:h-128 { height: 32rem !important; } .lt-md\:h-140 { height: 35rem !important; } .lt-md\:h-160 { height: 40rem !important; } .lt-md\:h-180 { height: 45rem !important; } .lt-md\:h-192 { height: 48rem !important; } .lt-md\:h-200 { height: 50rem !important; } .lt-md\:h-240 { height: 60rem !important; } .lt-md\:h-256 { height: 64rem !important; } .lt-md\:h-280 { height: 70rem !important; } .lt-md\:h-320 { height: 80rem !important; } .lt-md\:h-360 { height: 90rem !important; } .lt-md\:h-400 { height: 100rem !important; } .lt-md\:h-480 { height: 120rem !important; } .lt-md\:h-auto { height: auto !important; } .lt-md\:h-px { height: 1px !important; } .lt-md\:h-2px { height: 2px !important; } .lt-md\:h-full { height: 100% !important; } .lt-md\:h-screen { height: 100vh !important; } .lt-md\:h-1\/2 { height: 50% !important; } .lt-md\:h-1\/3 { height: 33.33333% !important; } .lt-md\:h-2\/3 { height: 66.66667% !important; } .lt-md\:h-1\/4 { height: 25% !important; } .lt-md\:h-2\/4 { height: 50% !important; } .lt-md\:h-3\/4 { height: 75% !important; } .lt-md\:h-1\/5 { height: 20% !important; } .lt-md\:h-2\/5 { height: 40% !important; } .lt-md\:h-3\/5 { height: 60% !important; } .lt-md\:h-4\/5 { height: 80% !important; } .lt-md\:h-1\/12 { height: 8.33333% !important; } .lt-md\:h-2\/12 { height: 16.66667% !important; } .lt-md\:h-3\/12 { height: 25% !important; } .lt-md\:h-4\/12 { height: 33.33333% !important; } .lt-md\:h-5\/12 { height: 41.66667% !important; } .lt-md\:h-6\/12 { height: 50% !important; } .lt-md\:h-7\/12 { height: 58.33333% !important; } .lt-md\:h-8\/12 { height: 66.66667% !important; } .lt-md\:h-9\/12 { height: 75% !important; } .lt-md\:h-10\/12 { height: 83.33333% !important; } .lt-md\:h-11\/12 { height: 91.66667% !important; } .lt-md\:text-xs { font-size: 0.625rem !important; } .lt-md\:text-sm { font-size: 0.75rem !important; } .lt-md\:text-md { font-size: 0.8125rem !important; } .lt-md\:text-base { font-size: 0.875rem !important; } .lt-md\:text-lg { font-size: 1rem !important; } .lt-md\:text-xl { font-size: 1.125rem !important; } .lt-md\:text-2xl { font-size: 1.25rem !important; } .lt-md\:text-3xl { font-size: 1.5rem !important; } .lt-md\:text-4xl { font-size: 2rem !important; } .lt-md\:text-5xl { font-size: 2.25rem !important; } .lt-md\:text-6xl { font-size: 2.5rem !important; } .lt-md\:text-7xl { font-size: 3rem !important; } .lt-md\:text-8xl { font-size: 4rem !important; } .lt-md\:text-9xl { font-size: 6rem !important; } .lt-md\:text-10xl { font-size: 8rem !important; } .lt-md\:leading-3 { line-height: .75rem !important; } .lt-md\:leading-4 { line-height: 1rem !important; } .lt-md\:leading-5 { line-height: 1.25rem !important; } .lt-md\:leading-6 { line-height: 1.5rem !important; } .lt-md\:leading-7 { line-height: 1.75rem !important; } .lt-md\:leading-8 { line-height: 2rem !important; } .lt-md\:leading-9 { line-height: 2.25rem !important; } .lt-md\:leading-10 { line-height: 2.5rem !important; } .lt-md\:leading-none { line-height: 1 !important; } .lt-md\:leading-tight { line-height: 1.25 !important; } .lt-md\:leading-snug { line-height: 1.375 !important; } .lt-md\:leading-normal { line-height: 1.5 !important; } .lt-md\:leading-relaxed { line-height: 1.625 !important; } .lt-md\:leading-loose { line-height: 2 !important; } .lt-md\:list-inside { list-style-position: inside !important; } .lt-md\:list-outside { list-style-position: outside !important; } .lt-md\:list-none { list-style-type: none !important; } .lt-md\:list-disc { list-style-type: disc !important; } .lt-md\:list-decimal { list-style-type: decimal !important; } .lt-md\:m-0 { margin: 0 !important; } .lt-md\:m-1 { margin: 0.25rem !important; } .lt-md\:m-2 { margin: 0.5rem !important; } .lt-md\:m-3 { margin: 0.75rem !important; } .lt-md\:m-4 { margin: 1rem !important; } .lt-md\:m-5 { margin: 1.25rem !important; } .lt-md\:m-6 { margin: 1.5rem !important; } .lt-md\:m-8 { margin: 2rem !important; } .lt-md\:m-10 { margin: 2.5rem !important; } .lt-md\:m-12 { margin: 3rem !important; } .lt-md\:m-14 { margin: 3.5rem !important; } .lt-md\:m-16 { margin: 4rem !important; } .lt-md\:m-18 { margin: 4.5rem !important; } .lt-md\:m-20 { margin: 5rem !important; } .lt-md\:m-22 { margin: 5.5rem !important; } .lt-md\:m-24 { margin: 6rem !important; } .lt-md\:m-26 { margin: 6.5rem !important; } .lt-md\:m-28 { margin: 7rem !important; } .lt-md\:m-30 { margin: 7.5rem !important; } .lt-md\:m-32 { margin: 8rem !important; } .lt-md\:m-36 { margin: 9rem !important; } .lt-md\:m-40 { margin: 10rem !important; } .lt-md\:m-48 { margin: 12rem !important; } .lt-md\:m-56 { margin: 14rem !important; } .lt-md\:m-64 { margin: 16rem !important; } .lt-md\:m-auto { margin: auto !important; } .lt-md\:m-px { margin: 1px !important; } .lt-md\:m-2px { margin: 2px !important; } .lt-md\:-m-1 { margin: -0.25rem !important; } .lt-md\:-m-2 { margin: -0.5rem !important; } .lt-md\:-m-3 { margin: -0.75rem !important; } .lt-md\:-m-4 { margin: -1rem !important; } .lt-md\:-m-5 { margin: -1.25rem !important; } .lt-md\:-m-6 { margin: -1.5rem !important; } .lt-md\:-m-8 { margin: -2rem !important; } .lt-md\:-m-10 { margin: -2.5rem !important; } .lt-md\:-m-12 { margin: -3rem !important; } .lt-md\:-m-14 { margin: -3.5rem !important; } .lt-md\:-m-16 { margin: -4rem !important; } .lt-md\:-m-18 { margin: -4.5rem !important; } .lt-md\:-m-20 { margin: -5rem !important; } .lt-md\:-m-22 { margin: -5.5rem !important; } .lt-md\:-m-24 { margin: -6rem !important; } .lt-md\:-m-26 { margin: -6.5rem !important; } .lt-md\:-m-28 { margin: -7rem !important; } .lt-md\:-m-30 { margin: -7.5rem !important; } .lt-md\:-m-32 { margin: -8rem !important; } .lt-md\:-m-36 { margin: -9rem !important; } .lt-md\:-m-40 { margin: -10rem !important; } .lt-md\:-m-48 { margin: -12rem !important; } .lt-md\:-m-56 { margin: -14rem !important; } .lt-md\:-m-64 { margin: -16rem !important; } .lt-md\:-m-px { margin: -1px !important; } .lt-md\:-m-2px { margin: -2px !important; } .lt-md\:my-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .lt-md\:mx-0 { margin-left: 0 !important; margin-right: 0 !important; } .lt-md\:my-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .lt-md\:mx-1 { margin-left: 0.25rem !important; margin-right: 0.25rem !important; } .lt-md\:my-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .lt-md\:mx-2 { margin-left: 0.5rem !important; margin-right: 0.5rem !important; } .lt-md\:my-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .lt-md\:mx-3 { margin-left: 0.75rem !important; margin-right: 0.75rem !important; } .lt-md\:my-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .lt-md\:mx-4 { margin-left: 1rem !important; margin-right: 1rem !important; } .lt-md\:my-5 { margin-top: 1.25rem !important; margin-bottom: 1.25rem !important; } .lt-md\:mx-5 { margin-left: 1.25rem !important; margin-right: 1.25rem !important; } .lt-md\:my-6 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .lt-md\:mx-6 { margin-left: 1.5rem !important; margin-right: 1.5rem !important; } .lt-md\:my-8 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .lt-md\:mx-8 { margin-left: 2rem !important; margin-right: 2rem !important; } .lt-md\:my-10 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .lt-md\:mx-10 { margin-left: 2.5rem !important; margin-right: 2.5rem !important; } .lt-md\:my-12 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .lt-md\:mx-12 { margin-left: 3rem !important; margin-right: 3rem !important; } .lt-md\:my-14 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .lt-md\:mx-14 { margin-left: 3.5rem !important; margin-right: 3.5rem !important; } .lt-md\:my-16 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .lt-md\:mx-16 { margin-left: 4rem !important; margin-right: 4rem !important; } .lt-md\:my-18 { margin-top: 4.5rem !important; margin-bottom: 4.5rem !important; } .lt-md\:mx-18 { margin-left: 4.5rem !important; margin-right: 4.5rem !important; } .lt-md\:my-20 { margin-top: 5rem !important; margin-bottom: 5rem !important; } .lt-md\:mx-20 { margin-left: 5rem !important; margin-right: 5rem !important; } .lt-md\:my-22 { margin-top: 5.5rem !important; margin-bottom: 5.5rem !important; } .lt-md\:mx-22 { margin-left: 5.5rem !important; margin-right: 5.5rem !important; } .lt-md\:my-24 { margin-top: 6rem !important; margin-bottom: 6rem !important; } .lt-md\:mx-24 { margin-left: 6rem !important; margin-right: 6rem !important; } .lt-md\:my-26 { margin-top: 6.5rem !important; margin-bottom: 6.5rem !important; } .lt-md\:mx-26 { margin-left: 6.5rem !important; margin-right: 6.5rem !important; } .lt-md\:my-28 { margin-top: 7rem !important; margin-bottom: 7rem !important; } .lt-md\:mx-28 { margin-left: 7rem !important; margin-right: 7rem !important; } .lt-md\:my-30 { margin-top: 7.5rem !important; margin-bottom: 7.5rem !important; } .lt-md\:mx-30 { margin-left: 7.5rem !important; margin-right: 7.5rem !important; } .lt-md\:my-32 { margin-top: 8rem !important; margin-bottom: 8rem !important; } .lt-md\:mx-32 { margin-left: 8rem !important; margin-right: 8rem !important; } .lt-md\:my-36 { margin-top: 9rem !important; margin-bottom: 9rem !important; } .lt-md\:mx-36 { margin-left: 9rem !important; margin-right: 9rem !important; } .lt-md\:my-40 { margin-top: 10rem !important; margin-bottom: 10rem !important; } .lt-md\:mx-40 { margin-left: 10rem !important; margin-right: 10rem !important; } .lt-md\:my-48 { margin-top: 12rem !important; margin-bottom: 12rem !important; } .lt-md\:mx-48 { margin-left: 12rem !important; margin-right: 12rem !important; } .lt-md\:my-56 { margin-top: 14rem !important; margin-bottom: 14rem !important; } .lt-md\:mx-56 { margin-left: 14rem !important; margin-right: 14rem !important; } .lt-md\:my-64 { margin-top: 16rem !important; margin-bottom: 16rem !important; } .lt-md\:mx-64 { margin-left: 16rem !important; margin-right: 16rem !important; } .lt-md\:my-auto { margin-top: auto !important; margin-bottom: auto !important; } .lt-md\:mx-auto { margin-left: auto !important; margin-right: auto !important; } .lt-md\:my-px { margin-top: 1px !important; margin-bottom: 1px !important; } .lt-md\:mx-px { margin-left: 1px !important; margin-right: 1px !important; } .lt-md\:my-2px { margin-top: 2px !important; margin-bottom: 2px !important; } .lt-md\:mx-2px { margin-left: 2px !important; margin-right: 2px !important; } .lt-md\:-my-1 { margin-top: -0.25rem !important; margin-bottom: -0.25rem !important; } .lt-md\:-mx-1 { margin-left: -0.25rem !important; margin-right: -0.25rem !important; } .lt-md\:-my-2 { margin-top: -0.5rem !important; margin-bottom: -0.5rem !important; } .lt-md\:-mx-2 { margin-left: -0.5rem !important; margin-right: -0.5rem !important; } .lt-md\:-my-3 { margin-top: -0.75rem !important; margin-bottom: -0.75rem !important; } .lt-md\:-mx-3 { margin-left: -0.75rem !important; margin-right: -0.75rem !important; } .lt-md\:-my-4 { margin-top: -1rem !important; margin-bottom: -1rem !important; } .lt-md\:-mx-4 { margin-left: -1rem !important; margin-right: -1rem !important; } .lt-md\:-my-5 { margin-top: -1.25rem !important; margin-bottom: -1.25rem !important; } .lt-md\:-mx-5 { margin-left: -1.25rem !important; margin-right: -1.25rem !important; } .lt-md\:-my-6 { margin-top: -1.5rem !important; margin-bottom: -1.5rem !important; } .lt-md\:-mx-6 { margin-left: -1.5rem !important; margin-right: -1.5rem !important; } .lt-md\:-my-8 { margin-top: -2rem !important; margin-bottom: -2rem !important; } .lt-md\:-mx-8 { margin-left: -2rem !important; margin-right: -2rem !important; } .lt-md\:-my-10 { margin-top: -2.5rem !important; margin-bottom: -2.5rem !important; } .lt-md\:-mx-10 { margin-left: -2.5rem !important; margin-right: -2.5rem !important; } .lt-md\:-my-12 { margin-top: -3rem !important; margin-bottom: -3rem !important; } .lt-md\:-mx-12 { margin-left: -3rem !important; margin-right: -3rem !important; } .lt-md\:-my-14 { margin-top: -3.5rem !important; margin-bottom: -3.5rem !important; } .lt-md\:-mx-14 { margin-left: -3.5rem !important; margin-right: -3.5rem !important; } .lt-md\:-my-16 { margin-top: -4rem !important; margin-bottom: -4rem !important; } .lt-md\:-mx-16 { margin-left: -4rem !important; margin-right: -4rem !important; } .lt-md\:-my-18 { margin-top: -4.5rem !important; margin-bottom: -4.5rem !important; } .lt-md\:-mx-18 { margin-left: -4.5rem !important; margin-right: -4.5rem !important; } .lt-md\:-my-20 { margin-top: -5rem !important; margin-bottom: -5rem !important; } .lt-md\:-mx-20 { margin-left: -5rem !important; margin-right: -5rem !important; } .lt-md\:-my-22 { margin-top: -5.5rem !important; margin-bottom: -5.5rem !important; } .lt-md\:-mx-22 { margin-left: -5.5rem !important; margin-right: -5.5rem !important; } .lt-md\:-my-24 { margin-top: -6rem !important; margin-bottom: -6rem !important; } .lt-md\:-mx-24 { margin-left: -6rem !important; margin-right: -6rem !important; } .lt-md\:-my-26 { margin-top: -6.5rem !important; margin-bottom: -6.5rem !important; } .lt-md\:-mx-26 { margin-left: -6.5rem !important; margin-right: -6.5rem !important; } .lt-md\:-my-28 { margin-top: -7rem !important; margin-bottom: -7rem !important; } .lt-md\:-mx-28 { margin-left: -7rem !important; margin-right: -7rem !important; } .lt-md\:-my-30 { margin-top: -7.5rem !important; margin-bottom: -7.5rem !important; } .lt-md\:-mx-30 { margin-left: -7.5rem !important; margin-right: -7.5rem !important; } .lt-md\:-my-32 { margin-top: -8rem !important; margin-bottom: -8rem !important; } .lt-md\:-mx-32 { margin-left: -8rem !important; margin-right: -8rem !important; } .lt-md\:-my-36 { margin-top: -9rem !important; margin-bottom: -9rem !important; } .lt-md\:-mx-36 { margin-left: -9rem !important; margin-right: -9rem !important; } .lt-md\:-my-40 { margin-top: -10rem !important; margin-bottom: -10rem !important; } .lt-md\:-mx-40 { margin-left: -10rem !important; margin-right: -10rem !important; } .lt-md\:-my-48 { margin-top: -12rem !important; margin-bottom: -12rem !important; } .lt-md\:-mx-48 { margin-left: -12rem !important; margin-right: -12rem !important; } .lt-md\:-my-56 { margin-top: -14rem !important; margin-bottom: -14rem !important; } .lt-md\:-mx-56 { margin-left: -14rem !important; margin-right: -14rem !important; } .lt-md\:-my-64 { margin-top: -16rem !important; margin-bottom: -16rem !important; } .lt-md\:-mx-64 { margin-left: -16rem !important; margin-right: -16rem !important; } .lt-md\:-my-px { margin-top: -1px !important; margin-bottom: -1px !important; } .lt-md\:-mx-px { margin-left: -1px !important; margin-right: -1px !important; } .lt-md\:-my-2px { margin-top: -2px !important; margin-bottom: -2px !important; } .lt-md\:-mx-2px { margin-left: -2px !important; margin-right: -2px !important; } .lt-md\:mt-0 { margin-top: 0 !important; } .lt-md\:mr-0 { margin-right: 0 !important; } .lt-md\:mb-0 { margin-bottom: 0 !important; } .lt-md\:ml-0 { margin-left: 0 !important; } .lt-md\:mt-1 { margin-top: 0.25rem !important; } .lt-md\:mr-1 { margin-right: 0.25rem !important; } .lt-md\:mb-1 { margin-bottom: 0.25rem !important; } .lt-md\:ml-1 { margin-left: 0.25rem !important; } .lt-md\:mt-2 { margin-top: 0.5rem !important; } .lt-md\:mr-2 { margin-right: 0.5rem !important; } .lt-md\:mb-2 { margin-bottom: 0.5rem !important; } .lt-md\:ml-2 { margin-left: 0.5rem !important; } .lt-md\:mt-3 { margin-top: 0.75rem !important; } .lt-md\:mr-3 { margin-right: 0.75rem !important; } .lt-md\:mb-3 { margin-bottom: 0.75rem !important; } .lt-md\:ml-3 { margin-left: 0.75rem !important; } .lt-md\:mt-4 { margin-top: 1rem !important; } .lt-md\:mr-4 { margin-right: 1rem !important; } .lt-md\:mb-4 { margin-bottom: 1rem !important; } .lt-md\:ml-4 { margin-left: 1rem !important; } .lt-md\:mt-5 { margin-top: 1.25rem !important; } .lt-md\:mr-5 { margin-right: 1.25rem !important; } .lt-md\:mb-5 { margin-bottom: 1.25rem !important; } .lt-md\:ml-5 { margin-left: 1.25rem !important; } .lt-md\:mt-6 { margin-top: 1.5rem !important; } .lt-md\:mr-6 { margin-right: 1.5rem !important; } .lt-md\:mb-6 { margin-bottom: 1.5rem !important; } .lt-md\:ml-6 { margin-left: 1.5rem !important; } .lt-md\:mt-8 { margin-top: 2rem !important; } .lt-md\:mr-8 { margin-right: 2rem !important; } .lt-md\:mb-8 { margin-bottom: 2rem !important; } .lt-md\:ml-8 { margin-left: 2rem !important; } .lt-md\:mt-10 { margin-top: 2.5rem !important; } .lt-md\:mr-10 { margin-right: 2.5rem !important; } .lt-md\:mb-10 { margin-bottom: 2.5rem !important; } .lt-md\:ml-10 { margin-left: 2.5rem !important; } .lt-md\:mt-12 { margin-top: 3rem !important; } .lt-md\:mr-12 { margin-right: 3rem !important; } .lt-md\:mb-12 { margin-bottom: 3rem !important; } .lt-md\:ml-12 { margin-left: 3rem !important; } .lt-md\:mt-14 { margin-top: 3.5rem !important; } .lt-md\:mr-14 { margin-right: 3.5rem !important; } .lt-md\:mb-14 { margin-bottom: 3.5rem !important; } .lt-md\:ml-14 { margin-left: 3.5rem !important; } .lt-md\:mt-16 { margin-top: 4rem !important; } .lt-md\:mr-16 { margin-right: 4rem !important; } .lt-md\:mb-16 { margin-bottom: 4rem !important; } .lt-md\:ml-16 { margin-left: 4rem !important; } .lt-md\:mt-18 { margin-top: 4.5rem !important; } .lt-md\:mr-18 { margin-right: 4.5rem !important; } .lt-md\:mb-18 { margin-bottom: 4.5rem !important; } .lt-md\:ml-18 { margin-left: 4.5rem !important; } .lt-md\:mt-20 { margin-top: 5rem !important; } .lt-md\:mr-20 { margin-right: 5rem !important; } .lt-md\:mb-20 { margin-bottom: 5rem !important; } .lt-md\:ml-20 { margin-left: 5rem !important; } .lt-md\:mt-22 { margin-top: 5.5rem !important; } .lt-md\:mr-22 { margin-right: 5.5rem !important; } .lt-md\:mb-22 { margin-bottom: 5.5rem !important; } .lt-md\:ml-22 { margin-left: 5.5rem !important; } .lt-md\:mt-24 { margin-top: 6rem !important; } .lt-md\:mr-24 { margin-right: 6rem !important; } .lt-md\:mb-24 { margin-bottom: 6rem !important; } .lt-md\:ml-24 { margin-left: 6rem !important; } .lt-md\:mt-26 { margin-top: 6.5rem !important; } .lt-md\:mr-26 { margin-right: 6.5rem !important; } .lt-md\:mb-26 { margin-bottom: 6.5rem !important; } .lt-md\:ml-26 { margin-left: 6.5rem !important; } .lt-md\:mt-28 { margin-top: 7rem !important; } .lt-md\:mr-28 { margin-right: 7rem !important; } .lt-md\:mb-28 { margin-bottom: 7rem !important; } .lt-md\:ml-28 { margin-left: 7rem !important; } .lt-md\:mt-30 { margin-top: 7.5rem !important; } .lt-md\:mr-30 { margin-right: 7.5rem !important; } .lt-md\:mb-30 { margin-bottom: 7.5rem !important; } .lt-md\:ml-30 { margin-left: 7.5rem !important; } .lt-md\:mt-32 { margin-top: 8rem !important; } .lt-md\:mr-32 { margin-right: 8rem !important; } .lt-md\:mb-32 { margin-bottom: 8rem !important; } .lt-md\:ml-32 { margin-left: 8rem !important; } .lt-md\:mt-36 { margin-top: 9rem !important; } .lt-md\:mr-36 { margin-right: 9rem !important; } .lt-md\:mb-36 { margin-bottom: 9rem !important; } .lt-md\:ml-36 { margin-left: 9rem !important; } .lt-md\:mt-40 { margin-top: 10rem !important; } .lt-md\:mr-40 { margin-right: 10rem !important; } .lt-md\:mb-40 { margin-bottom: 10rem !important; } .lt-md\:ml-40 { margin-left: 10rem !important; } .lt-md\:mt-48 { margin-top: 12rem !important; } .lt-md\:mr-48 { margin-right: 12rem !important; } .lt-md\:mb-48 { margin-bottom: 12rem !important; } .lt-md\:ml-48 { margin-left: 12rem !important; } .lt-md\:mt-56 { margin-top: 14rem !important; } .lt-md\:mr-56 { margin-right: 14rem !important; } .lt-md\:mb-56 { margin-bottom: 14rem !important; } .lt-md\:ml-56 { margin-left: 14rem !important; } .lt-md\:mt-64 { margin-top: 16rem !important; } .lt-md\:mr-64 { margin-right: 16rem !important; } .lt-md\:mb-64 { margin-bottom: 16rem !important; } .lt-md\:ml-64 { margin-left: 16rem !important; } .lt-md\:mt-auto { margin-top: auto !important; } .lt-md\:mr-auto { margin-right: auto !important; } .lt-md\:mb-auto { margin-bottom: auto !important; } .lt-md\:ml-auto { margin-left: auto !important; } .lt-md\:mt-px { margin-top: 1px !important; } .lt-md\:mr-px { margin-right: 1px !important; } .lt-md\:mb-px { margin-bottom: 1px !important; } .lt-md\:ml-px { margin-left: 1px !important; } .lt-md\:mt-2px { margin-top: 2px !important; } .lt-md\:mr-2px { margin-right: 2px !important; } .lt-md\:mb-2px { margin-bottom: 2px !important; } .lt-md\:ml-2px { margin-left: 2px !important; } .lt-md\:-mt-1 { margin-top: -0.25rem !important; } .lt-md\:-mr-1 { margin-right: -0.25rem !important; } .lt-md\:-mb-1 { margin-bottom: -0.25rem !important; } .lt-md\:-ml-1 { margin-left: -0.25rem !important; } .lt-md\:-mt-2 { margin-top: -0.5rem !important; } .lt-md\:-mr-2 { margin-right: -0.5rem !important; } .lt-md\:-mb-2 { margin-bottom: -0.5rem !important; } .lt-md\:-ml-2 { margin-left: -0.5rem !important; } .lt-md\:-mt-3 { margin-top: -0.75rem !important; } .lt-md\:-mr-3 { margin-right: -0.75rem !important; } .lt-md\:-mb-3 { margin-bottom: -0.75rem !important; } .lt-md\:-ml-3 { margin-left: -0.75rem !important; } .lt-md\:-mt-4 { margin-top: -1rem !important; } .lt-md\:-mr-4 { margin-right: -1rem !important; } .lt-md\:-mb-4 { margin-bottom: -1rem !important; } .lt-md\:-ml-4 { margin-left: -1rem !important; } .lt-md\:-mt-5 { margin-top: -1.25rem !important; } .lt-md\:-mr-5 { margin-right: -1.25rem !important; } .lt-md\:-mb-5 { margin-bottom: -1.25rem !important; } .lt-md\:-ml-5 { margin-left: -1.25rem !important; } .lt-md\:-mt-6 { margin-top: -1.5rem !important; } .lt-md\:-mr-6 { margin-right: -1.5rem !important; } .lt-md\:-mb-6 { margin-bottom: -1.5rem !important; } .lt-md\:-ml-6 { margin-left: -1.5rem !important; } .lt-md\:-mt-8 { margin-top: -2rem !important; } .lt-md\:-mr-8 { margin-right: -2rem !important; } .lt-md\:-mb-8 { margin-bottom: -2rem !important; } .lt-md\:-ml-8 { margin-left: -2rem !important; } .lt-md\:-mt-10 { margin-top: -2.5rem !important; } .lt-md\:-mr-10 { margin-right: -2.5rem !important; } .lt-md\:-mb-10 { margin-bottom: -2.5rem !important; } .lt-md\:-ml-10 { margin-left: -2.5rem !important; } .lt-md\:-mt-12 { margin-top: -3rem !important; } .lt-md\:-mr-12 { margin-right: -3rem !important; } .lt-md\:-mb-12 { margin-bottom: -3rem !important; } .lt-md\:-ml-12 { margin-left: -3rem !important; } .lt-md\:-mt-14 { margin-top: -3.5rem !important; } .lt-md\:-mr-14 { margin-right: -3.5rem !important; } .lt-md\:-mb-14 { margin-bottom: -3.5rem !important; } .lt-md\:-ml-14 { margin-left: -3.5rem !important; } .lt-md\:-mt-16 { margin-top: -4rem !important; } .lt-md\:-mr-16 { margin-right: -4rem !important; } .lt-md\:-mb-16 { margin-bottom: -4rem !important; } .lt-md\:-ml-16 { margin-left: -4rem !important; } .lt-md\:-mt-18 { margin-top: -4.5rem !important; } .lt-md\:-mr-18 { margin-right: -4.5rem !important; } .lt-md\:-mb-18 { margin-bottom: -4.5rem !important; } .lt-md\:-ml-18 { margin-left: -4.5rem !important; } .lt-md\:-mt-20 { margin-top: -5rem !important; } .lt-md\:-mr-20 { margin-right: -5rem !important; } .lt-md\:-mb-20 { margin-bottom: -5rem !important; } .lt-md\:-ml-20 { margin-left: -5rem !important; } .lt-md\:-mt-22 { margin-top: -5.5rem !important; } .lt-md\:-mr-22 { margin-right: -5.5rem !important; } .lt-md\:-mb-22 { margin-bottom: -5.5rem !important; } .lt-md\:-ml-22 { margin-left: -5.5rem !important; } .lt-md\:-mt-24 { margin-top: -6rem !important; } .lt-md\:-mr-24 { margin-right: -6rem !important; } .lt-md\:-mb-24 { margin-bottom: -6rem !important; } .lt-md\:-ml-24 { margin-left: -6rem !important; } .lt-md\:-mt-26 { margin-top: -6.5rem !important; } .lt-md\:-mr-26 { margin-right: -6.5rem !important; } .lt-md\:-mb-26 { margin-bottom: -6.5rem !important; } .lt-md\:-ml-26 { margin-left: -6.5rem !important; } .lt-md\:-mt-28 { margin-top: -7rem !important; } .lt-md\:-mr-28 { margin-right: -7rem !important; } .lt-md\:-mb-28 { margin-bottom: -7rem !important; } .lt-md\:-ml-28 { margin-left: -7rem !important; } .lt-md\:-mt-30 { margin-top: -7.5rem !important; } .lt-md\:-mr-30 { margin-right: -7.5rem !important; } .lt-md\:-mb-30 { margin-bottom: -7.5rem !important; } .lt-md\:-ml-30 { margin-left: -7.5rem !important; } .lt-md\:-mt-32 { margin-top: -8rem !important; } .lt-md\:-mr-32 { margin-right: -8rem !important; } .lt-md\:-mb-32 { margin-bottom: -8rem !important; } .lt-md\:-ml-32 { margin-left: -8rem !important; } .lt-md\:-mt-36 { margin-top: -9rem !important; } .lt-md\:-mr-36 { margin-right: -9rem !important; } .lt-md\:-mb-36 { margin-bottom: -9rem !important; } .lt-md\:-ml-36 { margin-left: -9rem !important; } .lt-md\:-mt-40 { margin-top: -10rem !important; } .lt-md\:-mr-40 { margin-right: -10rem !important; } .lt-md\:-mb-40 { margin-bottom: -10rem !important; } .lt-md\:-ml-40 { margin-left: -10rem !important; } .lt-md\:-mt-48 { margin-top: -12rem !important; } .lt-md\:-mr-48 { margin-right: -12rem !important; } .lt-md\:-mb-48 { margin-bottom: -12rem !important; } .lt-md\:-ml-48 { margin-left: -12rem !important; } .lt-md\:-mt-56 { margin-top: -14rem !important; } .lt-md\:-mr-56 { margin-right: -14rem !important; } .lt-md\:-mb-56 { margin-bottom: -14rem !important; } .lt-md\:-ml-56 { margin-left: -14rem !important; } .lt-md\:-mt-64 { margin-top: -16rem !important; } .lt-md\:-mr-64 { margin-right: -16rem !important; } .lt-md\:-mb-64 { margin-bottom: -16rem !important; } .lt-md\:-ml-64 { margin-left: -16rem !important; } .lt-md\:-mt-px { margin-top: -1px !important; } .lt-md\:-mr-px { margin-right: -1px !important; } .lt-md\:-mb-px { margin-bottom: -1px !important; } .lt-md\:-ml-px { margin-left: -1px !important; } .lt-md\:-mt-2px { margin-top: -2px !important; } .lt-md\:-mr-2px { margin-right: -2px !important; } .lt-md\:-mb-2px { margin-bottom: -2px !important; } .lt-md\:-ml-2px { margin-left: -2px !important; } .lt-md\:max-h-0 { max-height: 0 !important; } .lt-md\:max-h-1 { max-height: 0.25rem !important; } .lt-md\:max-h-2 { max-height: 0.5rem !important; } .lt-md\:max-h-3 { max-height: 0.75rem !important; } .lt-md\:max-h-4 { max-height: 1rem !important; } .lt-md\:max-h-5 { max-height: 1.25rem !important; } .lt-md\:max-h-6 { max-height: 1.5rem !important; } .lt-md\:max-h-8 { max-height: 2rem !important; } .lt-md\:max-h-10 { max-height: 2.5rem !important; } .lt-md\:max-h-12 { max-height: 3rem !important; } .lt-md\:max-h-14 { max-height: 3.5rem !important; } .lt-md\:max-h-16 { max-height: 4rem !important; } .lt-md\:max-h-18 { max-height: 4.5rem !important; } .lt-md\:max-h-20 { max-height: 5rem !important; } .lt-md\:max-h-22 { max-height: 5.5rem !important; } .lt-md\:max-h-24 { max-height: 6rem !important; } .lt-md\:max-h-26 { max-height: 6.5rem !important; } .lt-md\:max-h-28 { max-height: 7rem !important; } .lt-md\:max-h-30 { max-height: 7.5rem !important; } .lt-md\:max-h-32 { max-height: 8rem !important; } .lt-md\:max-h-36 { max-height: 9rem !important; } .lt-md\:max-h-40 { max-height: 10rem !important; } .lt-md\:max-h-48 { max-height: 12rem !important; } .lt-md\:max-h-50 { max-height: 12.5rem !important; } .lt-md\:max-h-56 { max-height: 14rem !important; } .lt-md\:max-h-60 { max-height: 15rem !important; } .lt-md\:max-h-64 { max-height: 16rem !important; } .lt-md\:max-h-80 { max-height: 20rem !important; } .lt-md\:max-h-90 { max-height: 24rem !important; } .lt-md\:max-h-100 { max-height: 25rem !important; } .lt-md\:max-h-120 { max-height: 30rem !important; } .lt-md\:max-h-128 { max-height: 32rem !important; } .lt-md\:max-h-140 { max-height: 35rem !important; } .lt-md\:max-h-160 { max-height: 40rem !important; } .lt-md\:max-h-180 { max-height: 45rem !important; } .lt-md\:max-h-192 { max-height: 48rem !important; } .lt-md\:max-h-200 { max-height: 50rem !important; } .lt-md\:max-h-240 { max-height: 60rem !important; } .lt-md\:max-h-256 { max-height: 64rem !important; } .lt-md\:max-h-280 { max-height: 70rem !important; } .lt-md\:max-h-320 { max-height: 80rem !important; } .lt-md\:max-h-360 { max-height: 90rem !important; } .lt-md\:max-h-400 { max-height: 100rem !important; } .lt-md\:max-h-480 { max-height: 120rem !important; } .lt-md\:max-h-full { max-height: 100% !important; } .lt-md\:max-h-screen { max-height: 100vh !important; } .lt-md\:max-h-none { max-height: none !important; } .lt-md\:max-h-px { max-height: 1px !important; } .lt-md\:max-h-2px { max-height: 2px !important; } .lt-md\:max-h-1\/2 { max-height: 50% !important; } .lt-md\:max-h-1\/3 { max-height: 33.33333% !important; } .lt-md\:max-h-2\/3 { max-height: 66.66667% !important; } .lt-md\:max-h-1\/4 { max-height: 25% !important; } .lt-md\:max-h-2\/4 { max-height: 50% !important; } .lt-md\:max-h-3\/4 { max-height: 75% !important; } .lt-md\:max-h-1\/5 { max-height: 20% !important; } .lt-md\:max-h-2\/5 { max-height: 40% !important; } .lt-md\:max-h-3\/5 { max-height: 60% !important; } .lt-md\:max-h-4\/5 { max-height: 80% !important; } .lt-md\:max-h-1\/12 { max-height: 8.33333% !important; } .lt-md\:max-h-2\/12 { max-height: 16.66667% !important; } .lt-md\:max-h-3\/12 { max-height: 25% !important; } .lt-md\:max-h-4\/12 { max-height: 33.33333% !important; } .lt-md\:max-h-5\/12 { max-height: 41.66667% !important; } .lt-md\:max-h-6\/12 { max-height: 50% !important; } .lt-md\:max-h-7\/12 { max-height: 58.33333% !important; } .lt-md\:max-h-8\/12 { max-height: 66.66667% !important; } .lt-md\:max-h-9\/12 { max-height: 75% !important; } .lt-md\:max-h-10\/12 { max-height: 83.33333% !important; } .lt-md\:max-h-11\/12 { max-height: 91.66667% !important; } .lt-md\:max-w-0 { max-width: 0 !important; } .lt-md\:max-w-1 { max-width: 0.25rem !important; } .lt-md\:max-w-2 { max-width: 0.5rem !important; } .lt-md\:max-w-3 { max-width: 0.75rem !important; } .lt-md\:max-w-4 { max-width: 1rem !important; } .lt-md\:max-w-5 { max-width: 1.25rem !important; } .lt-md\:max-w-6 { max-width: 1.5rem !important; } .lt-md\:max-w-8 { max-width: 2rem !important; } .lt-md\:max-w-10 { max-width: 2.5rem !important; } .lt-md\:max-w-12 { max-width: 3rem !important; } .lt-md\:max-w-14 { max-width: 3.5rem !important; } .lt-md\:max-w-16 { max-width: 4rem !important; } .lt-md\:max-w-18 { max-width: 4.5rem !important; } .lt-md\:max-w-20 { max-width: 5rem !important; } .lt-md\:max-w-22 { max-width: 5.5rem !important; } .lt-md\:max-w-24 { max-width: 6rem !important; } .lt-md\:max-w-26 { max-width: 6.5rem !important; } .lt-md\:max-w-28 { max-width: 7rem !important; } .lt-md\:max-w-30 { max-width: 7.5rem !important; } .lt-md\:max-w-32 { max-width: 8rem !important; } .lt-md\:max-w-36 { max-width: 9rem !important; } .lt-md\:max-w-40 { max-width: 10rem !important; } .lt-md\:max-w-48 { max-width: 12rem !important; } .lt-md\:max-w-50 { max-width: 12.5rem !important; } .lt-md\:max-w-56 { max-width: 14rem !important; } .lt-md\:max-w-60 { max-width: 15rem !important; } .lt-md\:max-w-64 { max-width: 16rem !important; } .lt-md\:max-w-80 { max-width: 20rem !important; } .lt-md\:max-w-90 { max-width: 24rem !important; } .lt-md\:max-w-100 { max-width: 25rem !important; } .lt-md\:max-w-120 { max-width: 30rem !important; } .lt-md\:max-w-128 { max-width: 32rem !important; } .lt-md\:max-w-140 { max-width: 35rem !important; } .lt-md\:max-w-160 { max-width: 40rem !important; } .lt-md\:max-w-180 { max-width: 45rem !important; } .lt-md\:max-w-192 { max-width: 48rem !important; } .lt-md\:max-w-200 { max-width: 50rem !important; } .lt-md\:max-w-240 { max-width: 60rem !important; } .lt-md\:max-w-256 { max-width: 64rem !important; } .lt-md\:max-w-280 { max-width: 70rem !important; } .lt-md\:max-w-320 { max-width: 80rem !important; } .lt-md\:max-w-360 { max-width: 90rem !important; } .lt-md\:max-w-400 { max-width: 100rem !important; } .lt-md\:max-w-480 { max-width: 120rem !important; } .lt-md\:max-w-none { max-width: none !important; } .lt-md\:max-w-xs { max-width: 20rem !important; } .lt-md\:max-w-sm { max-width: 24rem !important; } .lt-md\:max-w-md { max-width: 28rem !important; } .lt-md\:max-w-lg { max-width: 32rem !important; } .lt-md\:max-w-xl { max-width: 36rem !important; } .lt-md\:max-w-2xl { max-width: 42rem !important; } .lt-md\:max-w-3xl { max-width: 48rem !important; } .lt-md\:max-w-4xl { max-width: 56rem !important; } .lt-md\:max-w-5xl { max-width: 64rem !important; } .lt-md\:max-w-6xl { max-width: 72rem !important; } .lt-md\:max-w-full { max-width: 100% !important; } .lt-md\:max-w-screen { max-width: 100vw !important; } .lt-md\:max-w-px { max-width: 1px !important; } .lt-md\:max-w-2px { max-width: 2px !important; } .lt-md\:max-w-1\/2 { max-width: 50% !important; } .lt-md\:max-w-1\/3 { max-width: 33.33333% !important; } .lt-md\:max-w-2\/3 { max-width: 66.66667% !important; } .lt-md\:max-w-1\/4 { max-width: 25% !important; } .lt-md\:max-w-2\/4 { max-width: 50% !important; } .lt-md\:max-w-3\/4 { max-width: 75% !important; } .lt-md\:max-w-1\/5 { max-width: 20% !important; } .lt-md\:max-w-2\/5 { max-width: 40% !important; } .lt-md\:max-w-3\/5 { max-width: 60% !important; } .lt-md\:max-w-4\/5 { max-width: 80% !important; } .lt-md\:max-w-1\/12 { max-width: 8.33333% !important; } .lt-md\:max-w-2\/12 { max-width: 16.66667% !important; } .lt-md\:max-w-3\/12 { max-width: 25% !important; } .lt-md\:max-w-4\/12 { max-width: 33.33333% !important; } .lt-md\:max-w-5\/12 { max-width: 41.66667% !important; } .lt-md\:max-w-6\/12 { max-width: 50% !important; } .lt-md\:max-w-7\/12 { max-width: 58.33333% !important; } .lt-md\:max-w-8\/12 { max-width: 66.66667% !important; } .lt-md\:max-w-9\/12 { max-width: 75% !important; } .lt-md\:max-w-10\/12 { max-width: 83.33333% !important; } .lt-md\:max-w-11\/12 { max-width: 91.66667% !important; } .lt-md\:min-h-0 { min-height: 0 !important; } .lt-md\:min-h-1 { min-height: 0.25rem !important; } .lt-md\:min-h-2 { min-height: 0.5rem !important; } .lt-md\:min-h-3 { min-height: 0.75rem !important; } .lt-md\:min-h-4 { min-height: 1rem !important; } .lt-md\:min-h-5 { min-height: 1.25rem !important; } .lt-md\:min-h-6 { min-height: 1.5rem !important; } .lt-md\:min-h-8 { min-height: 2rem !important; } .lt-md\:min-h-10 { min-height: 2.5rem !important; } .lt-md\:min-h-12 { min-height: 3rem !important; } .lt-md\:min-h-14 { min-height: 3.5rem !important; } .lt-md\:min-h-16 { min-height: 4rem !important; } .lt-md\:min-h-18 { min-height: 4.5rem !important; } .lt-md\:min-h-20 { min-height: 5rem !important; } .lt-md\:min-h-22 { min-height: 5.5rem !important; } .lt-md\:min-h-24 { min-height: 6rem !important; } .lt-md\:min-h-26 { min-height: 6.5rem !important; } .lt-md\:min-h-28 { min-height: 7rem !important; } .lt-md\:min-h-30 { min-height: 7.5rem !important; } .lt-md\:min-h-32 { min-height: 8rem !important; } .lt-md\:min-h-36 { min-height: 9rem !important; } .lt-md\:min-h-40 { min-height: 10rem !important; } .lt-md\:min-h-48 { min-height: 12rem !important; } .lt-md\:min-h-50 { min-height: 12.5rem !important; } .lt-md\:min-h-56 { min-height: 14rem !important; } .lt-md\:min-h-60 { min-height: 15rem !important; } .lt-md\:min-h-64 { min-height: 16rem !important; } .lt-md\:min-h-80 { min-height: 20rem !important; } .lt-md\:min-h-90 { min-height: 24rem !important; } .lt-md\:min-h-100 { min-height: 25rem !important; } .lt-md\:min-h-120 { min-height: 30rem !important; } .lt-md\:min-h-128 { min-height: 32rem !important; } .lt-md\:min-h-140 { min-height: 35rem !important; } .lt-md\:min-h-160 { min-height: 40rem !important; } .lt-md\:min-h-180 { min-height: 45rem !important; } .lt-md\:min-h-192 { min-height: 48rem !important; } .lt-md\:min-h-200 { min-height: 50rem !important; } .lt-md\:min-h-240 { min-height: 60rem !important; } .lt-md\:min-h-256 { min-height: 64rem !important; } .lt-md\:min-h-280 { min-height: 70rem !important; } .lt-md\:min-h-320 { min-height: 80rem !important; } .lt-md\:min-h-360 { min-height: 90rem !important; } .lt-md\:min-h-400 { min-height: 100rem !important; } .lt-md\:min-h-480 { min-height: 120rem !important; } .lt-md\:min-h-full { min-height: 100% !important; } .lt-md\:min-h-screen { min-height: 100vh !important; } .lt-md\:min-h-px { min-height: 1px !important; } .lt-md\:min-h-2px { min-height: 2px !important; } .lt-md\:min-h-1\/2 { min-height: 50% !important; } .lt-md\:min-h-1\/3 { min-height: 33.33333% !important; } .lt-md\:min-h-2\/3 { min-height: 66.66667% !important; } .lt-md\:min-h-1\/4 { min-height: 25% !important; } .lt-md\:min-h-2\/4 { min-height: 50% !important; } .lt-md\:min-h-3\/4 { min-height: 75% !important; } .lt-md\:min-h-1\/5 { min-height: 20% !important; } .lt-md\:min-h-2\/5 { min-height: 40% !important; } .lt-md\:min-h-3\/5 { min-height: 60% !important; } .lt-md\:min-h-4\/5 { min-height: 80% !important; } .lt-md\:min-h-1\/12 { min-height: 8.33333% !important; } .lt-md\:min-h-2\/12 { min-height: 16.66667% !important; } .lt-md\:min-h-3\/12 { min-height: 25% !important; } .lt-md\:min-h-4\/12 { min-height: 33.33333% !important; } .lt-md\:min-h-5\/12 { min-height: 41.66667% !important; } .lt-md\:min-h-6\/12 { min-height: 50% !important; } .lt-md\:min-h-7\/12 { min-height: 58.33333% !important; } .lt-md\:min-h-8\/12 { min-height: 66.66667% !important; } .lt-md\:min-h-9\/12 { min-height: 75% !important; } .lt-md\:min-h-10\/12 { min-height: 83.33333% !important; } .lt-md\:min-h-11\/12 { min-height: 91.66667% !important; } .lt-md\:min-w-0 { min-width: 0 !important; } .lt-md\:min-w-1 { min-width: 0.25rem !important; } .lt-md\:min-w-2 { min-width: 0.5rem !important; } .lt-md\:min-w-3 { min-width: 0.75rem !important; } .lt-md\:min-w-4 { min-width: 1rem !important; } .lt-md\:min-w-5 { min-width: 1.25rem !important; } .lt-md\:min-w-6 { min-width: 1.5rem !important; } .lt-md\:min-w-8 { min-width: 2rem !important; } .lt-md\:min-w-10 { min-width: 2.5rem !important; } .lt-md\:min-w-12 { min-width: 3rem !important; } .lt-md\:min-w-14 { min-width: 3.5rem !important; } .lt-md\:min-w-16 { min-width: 4rem !important; } .lt-md\:min-w-18 { min-width: 4.5rem !important; } .lt-md\:min-w-20 { min-width: 5rem !important; } .lt-md\:min-w-22 { min-width: 5.5rem !important; } .lt-md\:min-w-24 { min-width: 6rem !important; } .lt-md\:min-w-26 { min-width: 6.5rem !important; } .lt-md\:min-w-28 { min-width: 7rem !important; } .lt-md\:min-w-30 { min-width: 7.5rem !important; } .lt-md\:min-w-32 { min-width: 8rem !important; } .lt-md\:min-w-36 { min-width: 9rem !important; } .lt-md\:min-w-40 { min-width: 10rem !important; } .lt-md\:min-w-48 { min-width: 12rem !important; } .lt-md\:min-w-50 { min-width: 12.5rem !important; } .lt-md\:min-w-56 { min-width: 14rem !important; } .lt-md\:min-w-60 { min-width: 15rem !important; } .lt-md\:min-w-64 { min-width: 16rem !important; } .lt-md\:min-w-80 { min-width: 20rem !important; } .lt-md\:min-w-90 { min-width: 24rem !important; } .lt-md\:min-w-100 { min-width: 25rem !important; } .lt-md\:min-w-120 { min-width: 30rem !important; } .lt-md\:min-w-128 { min-width: 32rem !important; } .lt-md\:min-w-140 { min-width: 35rem !important; } .lt-md\:min-w-160 { min-width: 40rem !important; } .lt-md\:min-w-180 { min-width: 45rem !important; } .lt-md\:min-w-192 { min-width: 48rem !important; } .lt-md\:min-w-200 { min-width: 50rem !important; } .lt-md\:min-w-240 { min-width: 60rem !important; } .lt-md\:min-w-256 { min-width: 64rem !important; } .lt-md\:min-w-280 { min-width: 70rem !important; } .lt-md\:min-w-320 { min-width: 80rem !important; } .lt-md\:min-w-360 { min-width: 90rem !important; } .lt-md\:min-w-400 { min-width: 100rem !important; } .lt-md\:min-w-480 { min-width: 120rem !important; } .lt-md\:min-w-full { min-width: 100% !important; } .lt-md\:min-w-screen { min-width: 100vw !important; } .lt-md\:min-w-px { min-width: 1px !important; } .lt-md\:min-w-2px { min-width: 2px !important; } .lt-md\:min-w-1\/2 { min-width: 50% !important; } .lt-md\:min-w-1\/3 { min-width: 33.33333% !important; } .lt-md\:min-w-2\/3 { min-width: 66.66667% !important; } .lt-md\:min-w-1\/4 { min-width: 25% !important; } .lt-md\:min-w-2\/4 { min-width: 50% !important; } .lt-md\:min-w-3\/4 { min-width: 75% !important; } .lt-md\:min-w-1\/5 { min-width: 20% !important; } .lt-md\:min-w-2\/5 { min-width: 40% !important; } .lt-md\:min-w-3\/5 { min-width: 60% !important; } .lt-md\:min-w-4\/5 { min-width: 80% !important; } .lt-md\:min-w-1\/12 { min-width: 8.33333% !important; } .lt-md\:min-w-2\/12 { min-width: 16.66667% !important; } .lt-md\:min-w-3\/12 { min-width: 25% !important; } .lt-md\:min-w-4\/12 { min-width: 33.33333% !important; } .lt-md\:min-w-5\/12 { min-width: 41.66667% !important; } .lt-md\:min-w-6\/12 { min-width: 50% !important; } .lt-md\:min-w-7\/12 { min-width: 58.33333% !important; } .lt-md\:min-w-8\/12 { min-width: 66.66667% !important; } .lt-md\:min-w-9\/12 { min-width: 75% !important; } .lt-md\:min-w-10\/12 { min-width: 83.33333% !important; } .lt-md\:min-w-11\/12 { min-width: 91.66667% !important; } .lt-md\:object-contain { -o-object-fit: contain !important; object-fit: contain !important; } .lt-md\:object-cover { -o-object-fit: cover !important; object-fit: cover !important; } .lt-md\:object-fill { -o-object-fit: fill !important; object-fit: fill !important; } .lt-md\:object-none { -o-object-fit: none !important; object-fit: none !important; } .lt-md\:object-scale-down { -o-object-fit: scale-down !important; object-fit: scale-down !important; } .lt-md\:object-bottom { -o-object-position: bottom !important; object-position: bottom !important; } .lt-md\:object-center { -o-object-position: center !important; object-position: center !important; } .lt-md\:object-left { -o-object-position: left !important; object-position: left !important; } .lt-md\:object-left-bottom { -o-object-position: left bottom !important; object-position: left bottom !important; } .lt-md\:object-left-top { -o-object-position: left top !important; object-position: left top !important; } .lt-md\:object-right { -o-object-position: right !important; object-position: right !important; } .lt-md\:object-right-bottom { -o-object-position: right bottom !important; object-position: right bottom !important; } .lt-md\:object-right-top { -o-object-position: right top !important; object-position: right top !important; } .lt-md\:object-top { -o-object-position: top !important; object-position: top !important; } .lt-md\:opacity-0 { opacity: 0 !important; } .lt-md\:opacity-12 { opacity: 0.12 !important; } .lt-md\:opacity-25 { opacity: 0.25 !important; } .lt-md\:opacity-38 { opacity: 0.38 !important; } .lt-md\:opacity-50 { opacity: 0.5 !important; } .lt-md\:opacity-54 { opacity: 0.54 !important; } .lt-md\:opacity-70 { opacity: 0.70 !important; } .lt-md\:opacity-75 { opacity: 0.75 !important; } .lt-md\:opacity-84 { opacity: 0.84 !important; } .lt-md\:opacity-100 { opacity: 1 !important; } .lt-md\:hover\:opacity-0:hover { opacity: 0 !important; } .lt-md\:hover\:opacity-12:hover { opacity: 0.12 !important; } .lt-md\:hover\:opacity-25:hover { opacity: 0.25 !important; } .lt-md\:hover\:opacity-38:hover { opacity: 0.38 !important; } .lt-md\:hover\:opacity-50:hover { opacity: 0.5 !important; } .lt-md\:hover\:opacity-54:hover { opacity: 0.54 !important; } .lt-md\:hover\:opacity-70:hover { opacity: 0.70 !important; } .lt-md\:hover\:opacity-75:hover { opacity: 0.75 !important; } .lt-md\:hover\:opacity-84:hover { opacity: 0.84 !important; } .lt-md\:hover\:opacity-100:hover { opacity: 1 !important; } .lt-md\:focus\:opacity-0:focus { opacity: 0 !important; } .lt-md\:focus\:opacity-12:focus { opacity: 0.12 !important; } .lt-md\:focus\:opacity-25:focus { opacity: 0.25 !important; } .lt-md\:focus\:opacity-38:focus { opacity: 0.38 !important; } .lt-md\:focus\:opacity-50:focus { opacity: 0.5 !important; } .lt-md\:focus\:opacity-54:focus { opacity: 0.54 !important; } .lt-md\:focus\:opacity-70:focus { opacity: 0.70 !important; } .lt-md\:focus\:opacity-75:focus { opacity: 0.75 !important; } .lt-md\:focus\:opacity-84:focus { opacity: 0.84 !important; } .lt-md\:focus\:opacity-100:focus { opacity: 1 !important; } .lt-md\:outline-none { outline: 0 !important; } .lt-md\:focus\:outline-none:focus { outline: 0 !important; } .lt-md\:overflow-auto { overflow: auto !important; } .lt-md\:overflow-hidden { overflow: hidden !important; } .lt-md\:overflow-visible { overflow: visible !important; } .lt-md\:overflow-scroll { overflow: scroll !important; } .lt-md\:overflow-x-auto { overflow-x: auto !important; } .lt-md\:overflow-y-auto { overflow-y: auto !important; } .lt-md\:overflow-x-hidden { overflow-x: hidden !important; } .lt-md\:overflow-y-hidden { overflow-y: hidden !important; } .lt-md\:overflow-x-visible { overflow-x: visible !important; } .lt-md\:overflow-y-visible { overflow-y: visible !important; } .lt-md\:overflow-x-scroll { overflow-x: scroll !important; } .lt-md\:overflow-y-scroll { overflow-y: scroll !important; } .lt-md\:scrolling-touch { -webkit-overflow-scrolling: touch !important; } .lt-md\:scrolling-auto { -webkit-overflow-scrolling: auto !important; } .lt-md\:p-0 { padding: 0 !important; } .lt-md\:p-1 { padding: 0.25rem !important; } .lt-md\:p-2 { padding: 0.5rem !important; } .lt-md\:p-3 { padding: 0.75rem !important; } .lt-md\:p-4 { padding: 1rem !important; } .lt-md\:p-5 { padding: 1.25rem !important; } .lt-md\:p-6 { padding: 1.5rem !important; } .lt-md\:p-8 { padding: 2rem !important; } .lt-md\:p-10 { padding: 2.5rem !important; } .lt-md\:p-12 { padding: 3rem !important; } .lt-md\:p-14 { padding: 3.5rem !important; } .lt-md\:p-16 { padding: 4rem !important; } .lt-md\:p-18 { padding: 4.5rem !important; } .lt-md\:p-20 { padding: 5rem !important; } .lt-md\:p-22 { padding: 5.5rem !important; } .lt-md\:p-24 { padding: 6rem !important; } .lt-md\:p-26 { padding: 6.5rem !important; } .lt-md\:p-28 { padding: 7rem !important; } .lt-md\:p-30 { padding: 7.5rem !important; } .lt-md\:p-32 { padding: 8rem !important; } .lt-md\:p-36 { padding: 9rem !important; } .lt-md\:p-40 { padding: 10rem !important; } .lt-md\:p-48 { padding: 12rem !important; } .lt-md\:p-56 { padding: 14rem !important; } .lt-md\:p-64 { padding: 16rem !important; } .lt-md\:p-px { padding: 1px !important; } .lt-md\:p-2px { padding: 2px !important; } .lt-md\:py-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .lt-md\:px-0 { padding-left: 0 !important; padding-right: 0 !important; } .lt-md\:py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .lt-md\:px-1 { padding-left: 0.25rem !important; padding-right: 0.25rem !important; } .lt-md\:py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .lt-md\:px-2 { padding-left: 0.5rem !important; padding-right: 0.5rem !important; } .lt-md\:py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .lt-md\:px-3 { padding-left: 0.75rem !important; padding-right: 0.75rem !important; } .lt-md\:py-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .lt-md\:px-4 { padding-left: 1rem !important; padding-right: 1rem !important; } .lt-md\:py-5 { padding-top: 1.25rem !important; padding-bottom: 1.25rem !important; } .lt-md\:px-5 { padding-left: 1.25rem !important; padding-right: 1.25rem !important; } .lt-md\:py-6 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .lt-md\:px-6 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } .lt-md\:py-8 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .lt-md\:px-8 { padding-left: 2rem !important; padding-right: 2rem !important; } .lt-md\:py-10 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .lt-md\:px-10 { padding-left: 2.5rem !important; padding-right: 2.5rem !important; } .lt-md\:py-12 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .lt-md\:px-12 { padding-left: 3rem !important; padding-right: 3rem !important; } .lt-md\:py-14 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .lt-md\:px-14 { padding-left: 3.5rem !important; padding-right: 3.5rem !important; } .lt-md\:py-16 { padding-top: 4rem !important; padding-bottom: 4rem !important; } .lt-md\:px-16 { padding-left: 4rem !important; padding-right: 4rem !important; } .lt-md\:py-18 { padding-top: 4.5rem !important; padding-bottom: 4.5rem !important; } .lt-md\:px-18 { padding-left: 4.5rem !important; padding-right: 4.5rem !important; } .lt-md\:py-20 { padding-top: 5rem !important; padding-bottom: 5rem !important; } .lt-md\:px-20 { padding-left: 5rem !important; padding-right: 5rem !important; } .lt-md\:py-22 { padding-top: 5.5rem !important; padding-bottom: 5.5rem !important; } .lt-md\:px-22 { padding-left: 5.5rem !important; padding-right: 5.5rem !important; } .lt-md\:py-24 { padding-top: 6rem !important; padding-bottom: 6rem !important; } .lt-md\:px-24 { padding-left: 6rem !important; padding-right: 6rem !important; } .lt-md\:py-26 { padding-top: 6.5rem !important; padding-bottom: 6.5rem !important; } .lt-md\:px-26 { padding-left: 6.5rem !important; padding-right: 6.5rem !important; } .lt-md\:py-28 { padding-top: 7rem !important; padding-bottom: 7rem !important; } .lt-md\:px-28 { padding-left: 7rem !important; padding-right: 7rem !important; } .lt-md\:py-30 { padding-top: 7.5rem !important; padding-bottom: 7.5rem !important; } .lt-md\:px-30 { padding-left: 7.5rem !important; padding-right: 7.5rem !important; } .lt-md\:py-32 { padding-top: 8rem !important; padding-bottom: 8rem !important; } .lt-md\:px-32 { padding-left: 8rem !important; padding-right: 8rem !important; } .lt-md\:py-36 { padding-top: 9rem !important; padding-bottom: 9rem !important; } .lt-md\:px-36 { padding-left: 9rem !important; padding-right: 9rem !important; } .lt-md\:py-40 { padding-top: 10rem !important; padding-bottom: 10rem !important; } .lt-md\:px-40 { padding-left: 10rem !important; padding-right: 10rem !important; } .lt-md\:py-48 { padding-top: 12rem !important; padding-bottom: 12rem !important; } .lt-md\:px-48 { padding-left: 12rem !important; padding-right: 12rem !important; } .lt-md\:py-56 { padding-top: 14rem !important; padding-bottom: 14rem !important; } .lt-md\:px-56 { padding-left: 14rem !important; padding-right: 14rem !important; } .lt-md\:py-64 { padding-top: 16rem !important; padding-bottom: 16rem !important; } .lt-md\:px-64 { padding-left: 16rem !important; padding-right: 16rem !important; } .lt-md\:py-px { padding-top: 1px !important; padding-bottom: 1px !important; } .lt-md\:px-px { padding-left: 1px !important; padding-right: 1px !important; } .lt-md\:py-2px { padding-top: 2px !important; padding-bottom: 2px !important; } .lt-md\:px-2px { padding-left: 2px !important; padding-right: 2px !important; } .lt-md\:pt-0 { padding-top: 0 !important; } .lt-md\:pr-0 { padding-right: 0 !important; } .lt-md\:pb-0 { padding-bottom: 0 !important; } .lt-md\:pl-0 { padding-left: 0 !important; } .lt-md\:pt-1 { padding-top: 0.25rem !important; } .lt-md\:pr-1 { padding-right: 0.25rem !important; } .lt-md\:pb-1 { padding-bottom: 0.25rem !important; } .lt-md\:pl-1 { padding-left: 0.25rem !important; } .lt-md\:pt-2 { padding-top: 0.5rem !important; } .lt-md\:pr-2 { padding-right: 0.5rem !important; } .lt-md\:pb-2 { padding-bottom: 0.5rem !important; } .lt-md\:pl-2 { padding-left: 0.5rem !important; } .lt-md\:pt-3 { padding-top: 0.75rem !important; } .lt-md\:pr-3 { padding-right: 0.75rem !important; } .lt-md\:pb-3 { padding-bottom: 0.75rem !important; } .lt-md\:pl-3 { padding-left: 0.75rem !important; } .lt-md\:pt-4 { padding-top: 1rem !important; } .lt-md\:pr-4 { padding-right: 1rem !important; } .lt-md\:pb-4 { padding-bottom: 1rem !important; } .lt-md\:pl-4 { padding-left: 1rem !important; } .lt-md\:pt-5 { padding-top: 1.25rem !important; } .lt-md\:pr-5 { padding-right: 1.25rem !important; } .lt-md\:pb-5 { padding-bottom: 1.25rem !important; } .lt-md\:pl-5 { padding-left: 1.25rem !important; } .lt-md\:pt-6 { padding-top: 1.5rem !important; } .lt-md\:pr-6 { padding-right: 1.5rem !important; } .lt-md\:pb-6 { padding-bottom: 1.5rem !important; } .lt-md\:pl-6 { padding-left: 1.5rem !important; } .lt-md\:pt-8 { padding-top: 2rem !important; } .lt-md\:pr-8 { padding-right: 2rem !important; } .lt-md\:pb-8 { padding-bottom: 2rem !important; } .lt-md\:pl-8 { padding-left: 2rem !important; } .lt-md\:pt-10 { padding-top: 2.5rem !important; } .lt-md\:pr-10 { padding-right: 2.5rem !important; } .lt-md\:pb-10 { padding-bottom: 2.5rem !important; } .lt-md\:pl-10 { padding-left: 2.5rem !important; } .lt-md\:pt-12 { padding-top: 3rem !important; } .lt-md\:pr-12 { padding-right: 3rem !important; } .lt-md\:pb-12 { padding-bottom: 3rem !important; } .lt-md\:pl-12 { padding-left: 3rem !important; } .lt-md\:pt-14 { padding-top: 3.5rem !important; } .lt-md\:pr-14 { padding-right: 3.5rem !important; } .lt-md\:pb-14 { padding-bottom: 3.5rem !important; } .lt-md\:pl-14 { padding-left: 3.5rem !important; } .lt-md\:pt-16 { padding-top: 4rem !important; } .lt-md\:pr-16 { padding-right: 4rem !important; } .lt-md\:pb-16 { padding-bottom: 4rem !important; } .lt-md\:pl-16 { padding-left: 4rem !important; } .lt-md\:pt-18 { padding-top: 4.5rem !important; } .lt-md\:pr-18 { padding-right: 4.5rem !important; } .lt-md\:pb-18 { padding-bottom: 4.5rem !important; } .lt-md\:pl-18 { padding-left: 4.5rem !important; } .lt-md\:pt-20 { padding-top: 5rem !important; } .lt-md\:pr-20 { padding-right: 5rem !important; } .lt-md\:pb-20 { padding-bottom: 5rem !important; } .lt-md\:pl-20 { padding-left: 5rem !important; } .lt-md\:pt-22 { padding-top: 5.5rem !important; } .lt-md\:pr-22 { padding-right: 5.5rem !important; } .lt-md\:pb-22 { padding-bottom: 5.5rem !important; } .lt-md\:pl-22 { padding-left: 5.5rem !important; } .lt-md\:pt-24 { padding-top: 6rem !important; } .lt-md\:pr-24 { padding-right: 6rem !important; } .lt-md\:pb-24 { padding-bottom: 6rem !important; } .lt-md\:pl-24 { padding-left: 6rem !important; } .lt-md\:pt-26 { padding-top: 6.5rem !important; } .lt-md\:pr-26 { padding-right: 6.5rem !important; } .lt-md\:pb-26 { padding-bottom: 6.5rem !important; } .lt-md\:pl-26 { padding-left: 6.5rem !important; } .lt-md\:pt-28 { padding-top: 7rem !important; } .lt-md\:pr-28 { padding-right: 7rem !important; } .lt-md\:pb-28 { padding-bottom: 7rem !important; } .lt-md\:pl-28 { padding-left: 7rem !important; } .lt-md\:pt-30 { padding-top: 7.5rem !important; } .lt-md\:pr-30 { padding-right: 7.5rem !important; } .lt-md\:pb-30 { padding-bottom: 7.5rem !important; } .lt-md\:pl-30 { padding-left: 7.5rem !important; } .lt-md\:pt-32 { padding-top: 8rem !important; } .lt-md\:pr-32 { padding-right: 8rem !important; } .lt-md\:pb-32 { padding-bottom: 8rem !important; } .lt-md\:pl-32 { padding-left: 8rem !important; } .lt-md\:pt-36 { padding-top: 9rem !important; } .lt-md\:pr-36 { padding-right: 9rem !important; } .lt-md\:pb-36 { padding-bottom: 9rem !important; } .lt-md\:pl-36 { padding-left: 9rem !important; } .lt-md\:pt-40 { padding-top: 10rem !important; } .lt-md\:pr-40 { padding-right: 10rem !important; } .lt-md\:pb-40 { padding-bottom: 10rem !important; } .lt-md\:pl-40 { padding-left: 10rem !important; } .lt-md\:pt-48 { padding-top: 12rem !important; } .lt-md\:pr-48 { padding-right: 12rem !important; } .lt-md\:pb-48 { padding-bottom: 12rem !important; } .lt-md\:pl-48 { padding-left: 12rem !important; } .lt-md\:pt-56 { padding-top: 14rem !important; } .lt-md\:pr-56 { padding-right: 14rem !important; } .lt-md\:pb-56 { padding-bottom: 14rem !important; } .lt-md\:pl-56 { padding-left: 14rem !important; } .lt-md\:pt-64 { padding-top: 16rem !important; } .lt-md\:pr-64 { padding-right: 16rem !important; } .lt-md\:pb-64 { padding-bottom: 16rem !important; } .lt-md\:pl-64 { padding-left: 16rem !important; } .lt-md\:pt-px { padding-top: 1px !important; } .lt-md\:pr-px { padding-right: 1px !important; } .lt-md\:pb-px { padding-bottom: 1px !important; } .lt-md\:pl-px { padding-left: 1px !important; } .lt-md\:pt-2px { padding-top: 2px !important; } .lt-md\:pr-2px { padding-right: 2px !important; } .lt-md\:pb-2px { padding-bottom: 2px !important; } .lt-md\:pl-2px { padding-left: 2px !important; } .lt-md\:placeholder-opacity-0::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .lt-md\:placeholder-opacity-0::-moz-placeholder { --placeholder-opacity: 0 !important; } .lt-md\:placeholder-opacity-0::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .lt-md\:placeholder-opacity-0::placeholder { --placeholder-opacity: 0 !important; } .lt-md\:placeholder-opacity-12::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .lt-md\:placeholder-opacity-12::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .lt-md\:placeholder-opacity-12::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .lt-md\:placeholder-opacity-12::placeholder { --placeholder-opacity: 0.12 !important; } .lt-md\:placeholder-opacity-25::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .lt-md\:placeholder-opacity-25::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .lt-md\:placeholder-opacity-25::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .lt-md\:placeholder-opacity-25::placeholder { --placeholder-opacity: 0.25 !important; } .lt-md\:placeholder-opacity-38::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .lt-md\:placeholder-opacity-38::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .lt-md\:placeholder-opacity-38::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .lt-md\:placeholder-opacity-38::placeholder { --placeholder-opacity: 0.38 !important; } .lt-md\:placeholder-opacity-50::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .lt-md\:placeholder-opacity-50::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .lt-md\:placeholder-opacity-50::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .lt-md\:placeholder-opacity-50::placeholder { --placeholder-opacity: 0.5 !important; } .lt-md\:placeholder-opacity-54::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .lt-md\:placeholder-opacity-54::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .lt-md\:placeholder-opacity-54::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .lt-md\:placeholder-opacity-54::placeholder { --placeholder-opacity: 0.54 !important; } .lt-md\:placeholder-opacity-70::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .lt-md\:placeholder-opacity-70::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .lt-md\:placeholder-opacity-70::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .lt-md\:placeholder-opacity-70::placeholder { --placeholder-opacity: 0.70 !important; } .lt-md\:placeholder-opacity-75::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .lt-md\:placeholder-opacity-75::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .lt-md\:placeholder-opacity-75::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .lt-md\:placeholder-opacity-75::placeholder { --placeholder-opacity: 0.75 !important; } .lt-md\:placeholder-opacity-84::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .lt-md\:placeholder-opacity-84::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .lt-md\:placeholder-opacity-84::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .lt-md\:placeholder-opacity-84::placeholder { --placeholder-opacity: 0.84 !important; } .lt-md\:placeholder-opacity-100::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .lt-md\:placeholder-opacity-100::-moz-placeholder { --placeholder-opacity: 1 !important; } .lt-md\:placeholder-opacity-100::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .lt-md\:placeholder-opacity-100::placeholder { --placeholder-opacity: 1 !important; } .lt-md\:focus\:placeholder-opacity-0:focus::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .lt-md\:focus\:placeholder-opacity-0:focus::-moz-placeholder { --placeholder-opacity: 0 !important; } .lt-md\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .lt-md\:focus\:placeholder-opacity-0:focus::placeholder { --placeholder-opacity: 0 !important; } .lt-md\:focus\:placeholder-opacity-12:focus::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .lt-md\:focus\:placeholder-opacity-12:focus::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .lt-md\:focus\:placeholder-opacity-12:focus::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .lt-md\:focus\:placeholder-opacity-12:focus::placeholder { --placeholder-opacity: 0.12 !important; } .lt-md\:focus\:placeholder-opacity-25:focus::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .lt-md\:focus\:placeholder-opacity-25:focus::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .lt-md\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .lt-md\:focus\:placeholder-opacity-25:focus::placeholder { --placeholder-opacity: 0.25 !important; } .lt-md\:focus\:placeholder-opacity-38:focus::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .lt-md\:focus\:placeholder-opacity-38:focus::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .lt-md\:focus\:placeholder-opacity-38:focus::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .lt-md\:focus\:placeholder-opacity-38:focus::placeholder { --placeholder-opacity: 0.38 !important; } .lt-md\:focus\:placeholder-opacity-50:focus::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .lt-md\:focus\:placeholder-opacity-50:focus::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .lt-md\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .lt-md\:focus\:placeholder-opacity-50:focus::placeholder { --placeholder-opacity: 0.5 !important; } .lt-md\:focus\:placeholder-opacity-54:focus::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .lt-md\:focus\:placeholder-opacity-54:focus::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .lt-md\:focus\:placeholder-opacity-54:focus::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .lt-md\:focus\:placeholder-opacity-54:focus::placeholder { --placeholder-opacity: 0.54 !important; } .lt-md\:focus\:placeholder-opacity-70:focus::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .lt-md\:focus\:placeholder-opacity-70:focus::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .lt-md\:focus\:placeholder-opacity-70:focus::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .lt-md\:focus\:placeholder-opacity-70:focus::placeholder { --placeholder-opacity: 0.70 !important; } .lt-md\:focus\:placeholder-opacity-75:focus::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .lt-md\:focus\:placeholder-opacity-75:focus::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .lt-md\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .lt-md\:focus\:placeholder-opacity-75:focus::placeholder { --placeholder-opacity: 0.75 !important; } .lt-md\:focus\:placeholder-opacity-84:focus::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .lt-md\:focus\:placeholder-opacity-84:focus::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .lt-md\:focus\:placeholder-opacity-84:focus::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .lt-md\:focus\:placeholder-opacity-84:focus::placeholder { --placeholder-opacity: 0.84 !important; } .lt-md\:focus\:placeholder-opacity-100:focus::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .lt-md\:focus\:placeholder-opacity-100:focus::-moz-placeholder { --placeholder-opacity: 1 !important; } .lt-md\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .lt-md\:focus\:placeholder-opacity-100:focus::placeholder { --placeholder-opacity: 1 !important; } .lt-md\:pointer-events-none { pointer-events: none !important; } .lt-md\:pointer-events-auto { pointer-events: auto !important; } .lt-md\:static { position: static !important; } .lt-md\:fixed { position: fixed !important; } .lt-md\:absolute { position: absolute !important; } .lt-md\:relative { position: relative !important; } .lt-md\:sticky { position: -webkit-sticky !important; position: sticky !important; } .lt-md\:inset-0 { top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; } .lt-md\:inset-auto { top: auto !important; right: auto !important; bottom: auto !important; left: auto !important; } .lt-md\:inset-y-0 { top: 0 !important; bottom: 0 !important; } .lt-md\:inset-x-0 { right: 0 !important; left: 0 !important; } .lt-md\:inset-y-auto { top: auto !important; bottom: auto !important; } .lt-md\:inset-x-auto { right: auto !important; left: auto !important; } .lt-md\:top-0 { top: 0 !important; } .lt-md\:right-0 { right: 0 !important; } .lt-md\:bottom-0 { bottom: 0 !important; } .lt-md\:left-0 { left: 0 !important; } .lt-md\:top-auto { top: auto !important; } .lt-md\:right-auto { right: auto !important; } .lt-md\:bottom-auto { bottom: auto !important; } .lt-md\:left-auto { left: auto !important; } .lt-md\:shadow-xs { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .lt-md\:shadow-sm { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .lt-md\:shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .lt-md\:shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .lt-md\:shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .lt-md\:shadow-xl { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .lt-md\:shadow-2xl { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .lt-md\:shadow-inner { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .lt-md\:shadow-outline { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .lt-md\:shadow-none { box-shadow: none !important; } .lt-md\:shadow-solid { box-shadow: 0 0 0 2px currentColor !important; } .lt-md\:hover\:shadow-xs:hover { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .lt-md\:hover\:shadow-sm:hover { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .lt-md\:hover\:shadow:hover { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .lt-md\:hover\:shadow-md:hover { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .lt-md\:hover\:shadow-lg:hover { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .lt-md\:hover\:shadow-xl:hover { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .lt-md\:hover\:shadow-2xl:hover { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .lt-md\:hover\:shadow-inner:hover { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .lt-md\:hover\:shadow-outline:hover { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .lt-md\:hover\:shadow-none:hover { box-shadow: none !important; } .lt-md\:hover\:shadow-solid:hover { box-shadow: 0 0 0 2px currentColor !important; } .lt-md\:focus\:shadow-xs:focus { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .lt-md\:focus\:shadow-sm:focus { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .lt-md\:focus\:shadow:focus { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .lt-md\:focus\:shadow-md:focus { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .lt-md\:focus\:shadow-lg:focus { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .lt-md\:focus\:shadow-xl:focus { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .lt-md\:focus\:shadow-2xl:focus { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .lt-md\:focus\:shadow-inner:focus { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .lt-md\:focus\:shadow-outline:focus { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .lt-md\:focus\:shadow-none:focus { box-shadow: none !important; } .lt-md\:focus\:shadow-solid:focus { box-shadow: 0 0 0 2px currentColor !important; } .lt-md\:fill-current { fill: currentColor !important; } .lt-md\:stroke-current { stroke: currentColor !important; } .lt-md\:stroke-0 { stroke-width: 0 !important; } .lt-md\:stroke-1 { stroke-width: 1 !important; } .lt-md\:stroke-2 { stroke-width: 2 !important; } .lt-md\:table-auto { table-layout: auto !important; } .lt-md\:table-fixed { table-layout: fixed !important; } .lt-md\:text-left { text-align: left !important; } .lt-md\:text-center { text-align: center !important; } .lt-md\:text-right { text-align: right !important; } .lt-md\:text-justify { text-align: justify !important; } .lt-md\:text-opacity-0 { --text-opacity: 0 !important; } .lt-md\:text-opacity-12 { --text-opacity: 0.12 !important; } .lt-md\:text-opacity-25 { --text-opacity: 0.25 !important; } .lt-md\:text-opacity-38 { --text-opacity: 0.38 !important; } .lt-md\:text-opacity-50 { --text-opacity: 0.5 !important; } .lt-md\:text-opacity-54 { --text-opacity: 0.54 !important; } .lt-md\:text-opacity-70 { --text-opacity: 0.70 !important; } .lt-md\:text-opacity-75 { --text-opacity: 0.75 !important; } .lt-md\:text-opacity-84 { --text-opacity: 0.84 !important; } .lt-md\:text-opacity-100 { --text-opacity: 1 !important; } .lt-md\:hover\:text-opacity-0:hover { --text-opacity: 0 !important; } .lt-md\:hover\:text-opacity-12:hover { --text-opacity: 0.12 !important; } .lt-md\:hover\:text-opacity-25:hover { --text-opacity: 0.25 !important; } .lt-md\:hover\:text-opacity-38:hover { --text-opacity: 0.38 !important; } .lt-md\:hover\:text-opacity-50:hover { --text-opacity: 0.5 !important; } .lt-md\:hover\:text-opacity-54:hover { --text-opacity: 0.54 !important; } .lt-md\:hover\:text-opacity-70:hover { --text-opacity: 0.70 !important; } .lt-md\:hover\:text-opacity-75:hover { --text-opacity: 0.75 !important; } .lt-md\:hover\:text-opacity-84:hover { --text-opacity: 0.84 !important; } .lt-md\:hover\:text-opacity-100:hover { --text-opacity: 1 !important; } .lt-md\:focus\:text-opacity-0:focus { --text-opacity: 0 !important; } .lt-md\:focus\:text-opacity-12:focus { --text-opacity: 0.12 !important; } .lt-md\:focus\:text-opacity-25:focus { --text-opacity: 0.25 !important; } .lt-md\:focus\:text-opacity-38:focus { --text-opacity: 0.38 !important; } .lt-md\:focus\:text-opacity-50:focus { --text-opacity: 0.5 !important; } .lt-md\:focus\:text-opacity-54:focus { --text-opacity: 0.54 !important; } .lt-md\:focus\:text-opacity-70:focus { --text-opacity: 0.70 !important; } .lt-md\:focus\:text-opacity-75:focus { --text-opacity: 0.75 !important; } .lt-md\:focus\:text-opacity-84:focus { --text-opacity: 0.84 !important; } .lt-md\:focus\:text-opacity-100:focus { --text-opacity: 1 !important; } .lt-md\:italic { font-style: italic !important; } .lt-md\:not-italic { font-style: normal !important; } .lt-md\:uppercase { text-transform: uppercase !important; } .lt-md\:lowercase { text-transform: lowercase !important; } .lt-md\:capitalize { text-transform: capitalize !important; } .lt-md\:normal-case { text-transform: none !important; } .lt-md\:underline { text-decoration: underline !important; } .lt-md\:line-through { text-decoration: line-through !important; } .lt-md\:no-underline { text-decoration: none !important; } .lt-md\:hover\:underline:hover { text-decoration: underline !important; } .lt-md\:hover\:line-through:hover { text-decoration: line-through !important; } .lt-md\:hover\:no-underline:hover { text-decoration: none !important; } .lt-md\:focus\:underline:focus { text-decoration: underline !important; } .lt-md\:focus\:line-through:focus { text-decoration: line-through !important; } .lt-md\:focus\:no-underline:focus { text-decoration: none !important; } .lt-md\:tracking-tighter { letter-spacing: -0.05em !important; } .lt-md\:tracking-tight { letter-spacing: -0.025em !important; } .lt-md\:tracking-normal { letter-spacing: 0 !important; } .lt-md\:tracking-wide { letter-spacing: 0.025em !important; } .lt-md\:tracking-wider { letter-spacing: 0.05em !important; } .lt-md\:tracking-widest { letter-spacing: 0.1em !important; } .lt-md\:select-none { -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important; } .lt-md\:select-text { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } .lt-md\:select-all { -webkit-user-select: all !important; -moz-user-select: all !important; -ms-user-select: all !important; user-select: all !important; } .lt-md\:select-auto { -webkit-user-select: auto !important; -moz-user-select: auto !important; -ms-user-select: auto !important; user-select: auto !important; } .lt-md\:align-baseline { vertical-align: baseline !important; } .lt-md\:align-top { vertical-align: top !important; } .lt-md\:align-middle { vertical-align: middle !important; } .lt-md\:align-bottom { vertical-align: bottom !important; } .lt-md\:align-text-top { vertical-align: text-top !important; } .lt-md\:align-text-bottom { vertical-align: text-bottom !important; } .lt-md\:visible { visibility: visible !important; } .lt-md\:invisible { visibility: hidden !important; } .lt-md\:whitespace-normal { white-space: normal !important; } .lt-md\:whitespace-no-wrap { white-space: nowrap !important; } .lt-md\:whitespace-pre { white-space: pre !important; } .lt-md\:whitespace-pre-line { white-space: pre-line !important; } .lt-md\:whitespace-pre-wrap { white-space: pre-wrap !important; } .lt-md\:break-normal { overflow-wrap: normal !important; word-break: normal !important; } .lt-md\:break-words { overflow-wrap: break-word !important; } .lt-md\:break-all { word-break: break-all !important; } .lt-md\:truncate { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } .lt-md\:w-0 { width: 0 !important; } .lt-md\:w-1 { width: 0.25rem !important; } .lt-md\:w-2 { width: 0.5rem !important; } .lt-md\:w-3 { width: 0.75rem !important; } .lt-md\:w-4 { width: 1rem !important; } .lt-md\:w-5 { width: 1.25rem !important; } .lt-md\:w-6 { width: 1.5rem !important; } .lt-md\:w-8 { width: 2rem !important; } .lt-md\:w-10 { width: 2.5rem !important; } .lt-md\:w-12 { width: 3rem !important; } .lt-md\:w-14 { width: 3.5rem !important; } .lt-md\:w-16 { width: 4rem !important; } .lt-md\:w-18 { width: 4.5rem !important; } .lt-md\:w-20 { width: 5rem !important; } .lt-md\:w-22 { width: 5.5rem !important; } .lt-md\:w-24 { width: 6rem !important; } .lt-md\:w-26 { width: 6.5rem !important; } .lt-md\:w-28 { width: 7rem !important; } .lt-md\:w-30 { width: 7.5rem !important; } .lt-md\:w-32 { width: 8rem !important; } .lt-md\:w-36 { width: 9rem !important; } .lt-md\:w-40 { width: 10rem !important; } .lt-md\:w-48 { width: 12rem !important; } .lt-md\:w-50 { width: 12.5rem !important; } .lt-md\:w-56 { width: 14rem !important; } .lt-md\:w-60 { width: 15rem !important; } .lt-md\:w-64 { width: 16rem !important; } .lt-md\:w-80 { width: 20rem !important; } .lt-md\:w-90 { width: 24rem !important; } .lt-md\:w-100 { width: 25rem !important; } .lt-md\:w-120 { width: 30rem !important; } .lt-md\:w-128 { width: 32rem !important; } .lt-md\:w-140 { width: 35rem !important; } .lt-md\:w-160 { width: 40rem !important; } .lt-md\:w-180 { width: 45rem !important; } .lt-md\:w-192 { width: 48rem !important; } .lt-md\:w-200 { width: 50rem !important; } .lt-md\:w-240 { width: 60rem !important; } .lt-md\:w-256 { width: 64rem !important; } .lt-md\:w-280 { width: 70rem !important; } .lt-md\:w-320 { width: 80rem !important; } .lt-md\:w-360 { width: 90rem !important; } .lt-md\:w-400 { width: 100rem !important; } .lt-md\:w-480 { width: 120rem !important; } .lt-md\:w-auto { width: auto !important; } .lt-md\:w-px { width: 1px !important; } .lt-md\:w-2px { width: 2px !important; } .lt-md\:w-1\/2 { width: 50% !important; } .lt-md\:w-1\/3 { width: 33.33333% !important; } .lt-md\:w-2\/3 { width: 66.66667% !important; } .lt-md\:w-1\/4 { width: 25% !important; } .lt-md\:w-2\/4 { width: 50% !important; } .lt-md\:w-3\/4 { width: 75% !important; } .lt-md\:w-1\/5 { width: 20% !important; } .lt-md\:w-2\/5 { width: 40% !important; } .lt-md\:w-3\/5 { width: 60% !important; } .lt-md\:w-4\/5 { width: 80% !important; } .lt-md\:w-1\/6 { width: 16.666667% !important; } .lt-md\:w-2\/6 { width: 33.333333% !important; } .lt-md\:w-3\/6 { width: 50% !important; } .lt-md\:w-4\/6 { width: 66.666667% !important; } .lt-md\:w-5\/6 { width: 83.333333% !important; } .lt-md\:w-1\/12 { width: 8.33333% !important; } .lt-md\:w-2\/12 { width: 16.66667% !important; } .lt-md\:w-3\/12 { width: 25% !important; } .lt-md\:w-4\/12 { width: 33.33333% !important; } .lt-md\:w-5\/12 { width: 41.66667% !important; } .lt-md\:w-6\/12 { width: 50% !important; } .lt-md\:w-7\/12 { width: 58.33333% !important; } .lt-md\:w-8\/12 { width: 66.66667% !important; } .lt-md\:w-9\/12 { width: 75% !important; } .lt-md\:w-10\/12 { width: 83.33333% !important; } .lt-md\:w-11\/12 { width: 91.66667% !important; } .lt-md\:w-full { width: 100% !important; } .lt-md\:w-screen { width: 100vw !important; } .lt-md\:z-0 { z-index: 0 !important; } .lt-md\:z-10 { z-index: 10 !important; } .lt-md\:z-20 { z-index: 20 !important; } .lt-md\:z-30 { z-index: 30 !important; } .lt-md\:z-40 { z-index: 40 !important; } .lt-md\:z-50 { z-index: 50 !important; } .lt-md\:z-60 { z-index: 60 !important; } .lt-md\:z-70 { z-index: 70 !important; } .lt-md\:z-80 { z-index: 80 !important; } .lt-md\:z-90 { z-index: 90 !important; } .lt-md\:z-99 { z-index: 99 !important; } .lt-md\:z-999 { z-index: 999 !important; } .lt-md\:z-9999 { z-index: 9999 !important; } .lt-md\:z-99999 { z-index: 99999 !important; } .lt-md\:z-auto { z-index: auto !important; } .lt-md\:-z-1 { z-index: -1 !important; } .lt-md\:gap-0 { grid-gap: 0 !important; gap: 0 !important; } .lt-md\:gap-1 { grid-gap: 0.25rem !important; gap: 0.25rem !important; } .lt-md\:gap-2 { grid-gap: 0.5rem !important; gap: 0.5rem !important; } .lt-md\:gap-3 { grid-gap: 0.75rem !important; gap: 0.75rem !important; } .lt-md\:gap-4 { grid-gap: 1rem !important; gap: 1rem !important; } .lt-md\:gap-5 { grid-gap: 1.25rem !important; gap: 1.25rem !important; } .lt-md\:gap-6 { grid-gap: 1.5rem !important; gap: 1.5rem !important; } .lt-md\:gap-8 { grid-gap: 2rem !important; gap: 2rem !important; } .lt-md\:gap-10 { grid-gap: 2.5rem !important; gap: 2.5rem !important; } .lt-md\:gap-12 { grid-gap: 3rem !important; gap: 3rem !important; } .lt-md\:gap-14 { grid-gap: 3.5rem !important; gap: 3.5rem !important; } .lt-md\:gap-16 { grid-gap: 4rem !important; gap: 4rem !important; } .lt-md\:gap-18 { grid-gap: 4.5rem !important; gap: 4.5rem !important; } .lt-md\:gap-20 { grid-gap: 5rem !important; gap: 5rem !important; } .lt-md\:gap-22 { grid-gap: 5.5rem !important; gap: 5.5rem !important; } .lt-md\:gap-24 { grid-gap: 6rem !important; gap: 6rem !important; } .lt-md\:gap-26 { grid-gap: 6.5rem !important; gap: 6.5rem !important; } .lt-md\:gap-28 { grid-gap: 7rem !important; gap: 7rem !important; } .lt-md\:gap-30 { grid-gap: 7.5rem !important; gap: 7.5rem !important; } .lt-md\:gap-32 { grid-gap: 8rem !important; gap: 8rem !important; } .lt-md\:gap-36 { grid-gap: 9rem !important; gap: 9rem !important; } .lt-md\:gap-40 { grid-gap: 10rem !important; gap: 10rem !important; } .lt-md\:gap-48 { grid-gap: 12rem !important; gap: 12rem !important; } .lt-md\:gap-56 { grid-gap: 14rem !important; gap: 14rem !important; } .lt-md\:gap-64 { grid-gap: 16rem !important; gap: 16rem !important; } .lt-md\:gap-px { grid-gap: 1px !important; gap: 1px !important; } .lt-md\:gap-2px { grid-gap: 2px !important; gap: 2px !important; } .lt-md\:col-gap-0 { grid-column-gap: 0 !important; -moz-column-gap: 0 !important; column-gap: 0 !important; } .lt-md\:col-gap-1 { grid-column-gap: 0.25rem !important; -moz-column-gap: 0.25rem !important; column-gap: 0.25rem !important; } .lt-md\:col-gap-2 { grid-column-gap: 0.5rem !important; -moz-column-gap: 0.5rem !important; column-gap: 0.5rem !important; } .lt-md\:col-gap-3 { grid-column-gap: 0.75rem !important; -moz-column-gap: 0.75rem !important; column-gap: 0.75rem !important; } .lt-md\:col-gap-4 { grid-column-gap: 1rem !important; -moz-column-gap: 1rem !important; column-gap: 1rem !important; } .lt-md\:col-gap-5 { grid-column-gap: 1.25rem !important; -moz-column-gap: 1.25rem !important; column-gap: 1.25rem !important; } .lt-md\:col-gap-6 { grid-column-gap: 1.5rem !important; -moz-column-gap: 1.5rem !important; column-gap: 1.5rem !important; } .lt-md\:col-gap-8 { grid-column-gap: 2rem !important; -moz-column-gap: 2rem !important; column-gap: 2rem !important; } .lt-md\:col-gap-10 { grid-column-gap: 2.5rem !important; -moz-column-gap: 2.5rem !important; column-gap: 2.5rem !important; } .lt-md\:col-gap-12 { grid-column-gap: 3rem !important; -moz-column-gap: 3rem !important; column-gap: 3rem !important; } .lt-md\:col-gap-14 { grid-column-gap: 3.5rem !important; -moz-column-gap: 3.5rem !important; column-gap: 3.5rem !important; } .lt-md\:col-gap-16 { grid-column-gap: 4rem !important; -moz-column-gap: 4rem !important; column-gap: 4rem !important; } .lt-md\:col-gap-18 { grid-column-gap: 4.5rem !important; -moz-column-gap: 4.5rem !important; column-gap: 4.5rem !important; } .lt-md\:col-gap-20 { grid-column-gap: 5rem !important; -moz-column-gap: 5rem !important; column-gap: 5rem !important; } .lt-md\:col-gap-22 { grid-column-gap: 5.5rem !important; -moz-column-gap: 5.5rem !important; column-gap: 5.5rem !important; } .lt-md\:col-gap-24 { grid-column-gap: 6rem !important; -moz-column-gap: 6rem !important; column-gap: 6rem !important; } .lt-md\:col-gap-26 { grid-column-gap: 6.5rem !important; -moz-column-gap: 6.5rem !important; column-gap: 6.5rem !important; } .lt-md\:col-gap-28 { grid-column-gap: 7rem !important; -moz-column-gap: 7rem !important; column-gap: 7rem !important; } .lt-md\:col-gap-30 { grid-column-gap: 7.5rem !important; -moz-column-gap: 7.5rem !important; column-gap: 7.5rem !important; } .lt-md\:col-gap-32 { grid-column-gap: 8rem !important; -moz-column-gap: 8rem !important; column-gap: 8rem !important; } .lt-md\:col-gap-36 { grid-column-gap: 9rem !important; -moz-column-gap: 9rem !important; column-gap: 9rem !important; } .lt-md\:col-gap-40 { grid-column-gap: 10rem !important; -moz-column-gap: 10rem !important; column-gap: 10rem !important; } .lt-md\:col-gap-48 { grid-column-gap: 12rem !important; -moz-column-gap: 12rem !important; column-gap: 12rem !important; } .lt-md\:col-gap-56 { grid-column-gap: 14rem !important; -moz-column-gap: 14rem !important; column-gap: 14rem !important; } .lt-md\:col-gap-64 { grid-column-gap: 16rem !important; -moz-column-gap: 16rem !important; column-gap: 16rem !important; } .lt-md\:col-gap-px { grid-column-gap: 1px !important; -moz-column-gap: 1px !important; column-gap: 1px !important; } .lt-md\:col-gap-2px { grid-column-gap: 2px !important; -moz-column-gap: 2px !important; column-gap: 2px !important; } .lt-md\:row-gap-0 { grid-row-gap: 0 !important; row-gap: 0 !important; } .lt-md\:row-gap-1 { grid-row-gap: 0.25rem !important; row-gap: 0.25rem !important; } .lt-md\:row-gap-2 { grid-row-gap: 0.5rem !important; row-gap: 0.5rem !important; } .lt-md\:row-gap-3 { grid-row-gap: 0.75rem !important; row-gap: 0.75rem !important; } .lt-md\:row-gap-4 { grid-row-gap: 1rem !important; row-gap: 1rem !important; } .lt-md\:row-gap-5 { grid-row-gap: 1.25rem !important; row-gap: 1.25rem !important; } .lt-md\:row-gap-6 { grid-row-gap: 1.5rem !important; row-gap: 1.5rem !important; } .lt-md\:row-gap-8 { grid-row-gap: 2rem !important; row-gap: 2rem !important; } .lt-md\:row-gap-10 { grid-row-gap: 2.5rem !important; row-gap: 2.5rem !important; } .lt-md\:row-gap-12 { grid-row-gap: 3rem !important; row-gap: 3rem !important; } .lt-md\:row-gap-14 { grid-row-gap: 3.5rem !important; row-gap: 3.5rem !important; } .lt-md\:row-gap-16 { grid-row-gap: 4rem !important; row-gap: 4rem !important; } .lt-md\:row-gap-18 { grid-row-gap: 4.5rem !important; row-gap: 4.5rem !important; } .lt-md\:row-gap-20 { grid-row-gap: 5rem !important; row-gap: 5rem !important; } .lt-md\:row-gap-22 { grid-row-gap: 5.5rem !important; row-gap: 5.5rem !important; } .lt-md\:row-gap-24 { grid-row-gap: 6rem !important; row-gap: 6rem !important; } .lt-md\:row-gap-26 { grid-row-gap: 6.5rem !important; row-gap: 6.5rem !important; } .lt-md\:row-gap-28 { grid-row-gap: 7rem !important; row-gap: 7rem !important; } .lt-md\:row-gap-30 { grid-row-gap: 7.5rem !important; row-gap: 7.5rem !important; } .lt-md\:row-gap-32 { grid-row-gap: 8rem !important; row-gap: 8rem !important; } .lt-md\:row-gap-36 { grid-row-gap: 9rem !important; row-gap: 9rem !important; } .lt-md\:row-gap-40 { grid-row-gap: 10rem !important; row-gap: 10rem !important; } .lt-md\:row-gap-48 { grid-row-gap: 12rem !important; row-gap: 12rem !important; } .lt-md\:row-gap-56 { grid-row-gap: 14rem !important; row-gap: 14rem !important; } .lt-md\:row-gap-64 { grid-row-gap: 16rem !important; row-gap: 16rem !important; } .lt-md\:row-gap-px { grid-row-gap: 1px !important; row-gap: 1px !important; } .lt-md\:row-gap-2px { grid-row-gap: 2px !important; row-gap: 2px !important; } .lt-md\:grid-flow-row { grid-auto-flow: row !important; } .lt-md\:grid-flow-col { grid-auto-flow: column !important; } .lt-md\:grid-flow-row-dense { grid-auto-flow: row dense !important; } .lt-md\:grid-flow-col-dense { grid-auto-flow: column dense !important; } .lt-md\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; } .lt-md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } .lt-md\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; } .lt-md\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; } .lt-md\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; } .lt-md\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; } .lt-md\:grid-cols-7 { grid-template-columns: repeat(7, minmax(0, 1fr)) !important; } .lt-md\:grid-cols-8 { grid-template-columns: repeat(8, minmax(0, 1fr)) !important; } .lt-md\:grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)) !important; } .lt-md\:grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)) !important; } .lt-md\:grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)) !important; } .lt-md\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)) !important; } .lt-md\:grid-cols-none { grid-template-columns: none !important; } .lt-md\:col-auto { grid-column: auto !important; } .lt-md\:col-span-1 { grid-column: span 1 / span 1 !important; } .lt-md\:col-span-2 { grid-column: span 2 / span 2 !important; } .lt-md\:col-span-3 { grid-column: span 3 / span 3 !important; } .lt-md\:col-span-4 { grid-column: span 4 / span 4 !important; } .lt-md\:col-span-5 { grid-column: span 5 / span 5 !important; } .lt-md\:col-span-6 { grid-column: span 6 / span 6 !important; } .lt-md\:col-span-7 { grid-column: span 7 / span 7 !important; } .lt-md\:col-span-8 { grid-column: span 8 / span 8 !important; } .lt-md\:col-span-9 { grid-column: span 9 / span 9 !important; } .lt-md\:col-span-10 { grid-column: span 10 / span 10 !important; } .lt-md\:col-span-11 { grid-column: span 11 / span 11 !important; } .lt-md\:col-span-12 { grid-column: span 12 / span 12 !important; } .lt-md\:col-start-1 { grid-column-start: 1 !important; } .lt-md\:col-start-2 { grid-column-start: 2 !important; } .lt-md\:col-start-3 { grid-column-start: 3 !important; } .lt-md\:col-start-4 { grid-column-start: 4 !important; } .lt-md\:col-start-5 { grid-column-start: 5 !important; } .lt-md\:col-start-6 { grid-column-start: 6 !important; } .lt-md\:col-start-7 { grid-column-start: 7 !important; } .lt-md\:col-start-8 { grid-column-start: 8 !important; } .lt-md\:col-start-9 { grid-column-start: 9 !important; } .lt-md\:col-start-10 { grid-column-start: 10 !important; } .lt-md\:col-start-11 { grid-column-start: 11 !important; } .lt-md\:col-start-12 { grid-column-start: 12 !important; } .lt-md\:col-start-13 { grid-column-start: 13 !important; } .lt-md\:col-start-auto { grid-column-start: auto !important; } .lt-md\:col-end-1 { grid-column-end: 1 !important; } .lt-md\:col-end-2 { grid-column-end: 2 !important; } .lt-md\:col-end-3 { grid-column-end: 3 !important; } .lt-md\:col-end-4 { grid-column-end: 4 !important; } .lt-md\:col-end-5 { grid-column-end: 5 !important; } .lt-md\:col-end-6 { grid-column-end: 6 !important; } .lt-md\:col-end-7 { grid-column-end: 7 !important; } .lt-md\:col-end-8 { grid-column-end: 8 !important; } .lt-md\:col-end-9 { grid-column-end: 9 !important; } .lt-md\:col-end-10 { grid-column-end: 10 !important; } .lt-md\:col-end-11 { grid-column-end: 11 !important; } .lt-md\:col-end-12 { grid-column-end: 12 !important; } .lt-md\:col-end-13 { grid-column-end: 13 !important; } .lt-md\:col-end-auto { grid-column-end: auto !important; } .lt-md\:grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)) !important; } .lt-md\:grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)) !important; } .lt-md\:grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)) !important; } .lt-md\:grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)) !important; } .lt-md\:grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)) !important; } .lt-md\:grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)) !important; } .lt-md\:grid-rows-none { grid-template-rows: none !important; } .lt-md\:row-auto { grid-row: auto !important; } .lt-md\:row-span-1 { grid-row: span 1 / span 1 !important; } .lt-md\:row-span-2 { grid-row: span 2 / span 2 !important; } .lt-md\:row-span-3 { grid-row: span 3 / span 3 !important; } .lt-md\:row-span-4 { grid-row: span 4 / span 4 !important; } .lt-md\:row-span-5 { grid-row: span 5 / span 5 !important; } .lt-md\:row-span-6 { grid-row: span 6 / span 6 !important; } .lt-md\:row-start-1 { grid-row-start: 1 !important; } .lt-md\:row-start-2 { grid-row-start: 2 !important; } .lt-md\:row-start-3 { grid-row-start: 3 !important; } .lt-md\:row-start-4 { grid-row-start: 4 !important; } .lt-md\:row-start-5 { grid-row-start: 5 !important; } .lt-md\:row-start-6 { grid-row-start: 6 !important; } .lt-md\:row-start-7 { grid-row-start: 7 !important; } .lt-md\:row-start-auto { grid-row-start: auto !important; } .lt-md\:row-end-1 { grid-row-end: 1 !important; } .lt-md\:row-end-2 { grid-row-end: 2 !important; } .lt-md\:row-end-3 { grid-row-end: 3 !important; } .lt-md\:row-end-4 { grid-row-end: 4 !important; } .lt-md\:row-end-5 { grid-row-end: 5 !important; } .lt-md\:row-end-6 { grid-row-end: 6 !important; } .lt-md\:row-end-7 { grid-row-end: 7 !important; } .lt-md\:row-end-auto { grid-row-end: auto !important; } .lt-md\:transform { --transform-translate-x: 0 !important; --transform-translate-y: 0 !important; --transform-rotate: 0 !important; --transform-skew-x: 0 !important; --transform-skew-y: 0 !important; --transform-scale-x: 1 !important; --transform-scale-y: 1 !important; transform: translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y)) !important; } .lt-md\:transform-none { transform: none !important; } .lt-md\:origin-center { transform-origin: center !important; } .lt-md\:origin-top { transform-origin: top !important; } .lt-md\:origin-top-right { transform-origin: top right !important; } .lt-md\:origin-right { transform-origin: right !important; } .lt-md\:origin-bottom-right { transform-origin: bottom right !important; } .lt-md\:origin-bottom { transform-origin: bottom !important; } .lt-md\:origin-bottom-left { transform-origin: bottom left !important; } .lt-md\:origin-left { transform-origin: left !important; } .lt-md\:origin-top-left { transform-origin: top left !important; } .lt-md\:icon-size-12 { width: 12px !important; height: 12px !important; min-width: 12px !important; min-height: 12px !important; font-size: 12px !important; line-height: 12px !important; } .lt-md\:icon-size-12 svg { width: 12px !important; height: 12px !important; } .lt-md\:icon-size-14 { width: 14px !important; height: 14px !important; min-width: 14px !important; min-height: 14px !important; font-size: 14px !important; line-height: 14px !important; } .lt-md\:icon-size-14 svg { width: 14px !important; height: 14px !important; } .lt-md\:icon-size-16 { width: 16px !important; height: 16px !important; min-width: 16px !important; min-height: 16px !important; font-size: 16px !important; line-height: 16px !important; } .lt-md\:icon-size-16 svg { width: 16px !important; height: 16px !important; } .lt-md\:icon-size-18 { width: 18px !important; height: 18px !important; min-width: 18px !important; min-height: 18px !important; font-size: 18px !important; line-height: 18px !important; } .lt-md\:icon-size-18 svg { width: 18px !important; height: 18px !important; } .lt-md\:icon-size-20 { width: 20px !important; height: 20px !important; min-width: 20px !important; min-height: 20px !important; font-size: 20px !important; line-height: 20px !important; } .lt-md\:icon-size-20 svg { width: 20px !important; height: 20px !important; } .lt-md\:icon-size-24 { width: 24px !important; height: 24px !important; min-width: 24px !important; min-height: 24px !important; font-size: 24px !important; line-height: 24px !important; } .lt-md\:icon-size-24 svg { width: 24px !important; height: 24px !important; } .lt-md\:icon-size-32 { width: 32px !important; height: 32px !important; min-width: 32px !important; min-height: 32px !important; font-size: 32px !important; line-height: 32px !important; } .lt-md\:icon-size-32 svg { width: 32px !important; height: 32px !important; } .lt-md\:icon-size-40 { width: 40px !important; height: 40px !important; min-width: 40px !important; min-height: 40px !important; font-size: 40px !important; line-height: 40px !important; } .lt-md\:icon-size-40 svg { width: 40px !important; height: 40px !important; } .lt-md\:icon-size-48 { width: 48px !important; height: 48px !important; min-width: 48px !important; min-height: 48px !important; font-size: 48px !important; line-height: 48px !important; } .lt-md\:icon-size-48 svg { width: 48px !important; height: 48px !important; } .lt-md\:icon-size-56 { width: 56px !important; height: 56px !important; min-width: 56px !important; min-height: 56px !important; font-size: 56px !important; line-height: 56px !important; } .lt-md\:icon-size-56 svg { width: 56px !important; height: 56px !important; } .lt-md\:icon-size-64 { width: 64px !important; height: 64px !important; min-width: 64px !important; min-height: 64px !important; font-size: 64px !important; line-height: 64px !important; } .lt-md\:icon-size-64 svg { width: 64px !important; height: 64px !important; } .lt-md\:icon-size-72 { width: 72px !important; height: 72px !important; min-width: 72px !important; min-height: 72px !important; font-size: 72px !important; line-height: 72px !important; } .lt-md\:icon-size-72 svg { width: 72px !important; height: 72px !important; } .lt-md\:icon-size-80 { width: 80px !important; height: 80px !important; min-width: 80px !important; min-height: 80px !important; font-size: 80px !important; line-height: 80px !important; } .lt-md\:icon-size-80 svg { width: 80px !important; height: 80px !important; } .lt-md\:icon-size-88 { width: 88px !important; height: 88px !important; min-width: 88px !important; min-height: 88px !important; font-size: 88px !important; line-height: 88px !important; } .lt-md\:icon-size-88 svg { width: 88px !important; height: 88px !important; } .lt-md\:icon-size-96 { width: 96px !important; height: 96px !important; min-width: 96px !important; min-height: 96px !important; font-size: 96px !important; line-height: 96px !important; } .lt-md\:icon-size-96 svg { width: 96px !important; height: 96px !important; } } @media (max-width: 1279px) { .lt-lg\:space-y-0 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0px * var(--space-y-reverse)) !important; } .lt-lg\:space-x-0 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0px * var(--space-x-reverse)) !important; margin-left: calc(0px * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.25rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.25rem * var(--space-x-reverse)) !important; margin-left: calc(0.25rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.5rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.5rem * var(--space-x-reverse)) !important; margin-left: calc(0.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.75rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.75rem * var(--space-x-reverse)) !important; margin-left: calc(0.75rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1rem * var(--space-x-reverse)) !important; margin-left: calc(1rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.25rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.25rem * var(--space-x-reverse)) !important; margin-left: calc(1.25rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.5rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.5rem * var(--space-x-reverse)) !important; margin-left: calc(1.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2rem * var(--space-x-reverse)) !important; margin-left: calc(2rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2.5rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2.5rem * var(--space-x-reverse)) !important; margin-left: calc(2.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3rem * var(--space-x-reverse)) !important; margin-left: calc(3rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3.5rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3.5rem * var(--space-x-reverse)) !important; margin-left: calc(3.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4rem * var(--space-x-reverse)) !important; margin-left: calc(4rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4.5rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4.5rem * var(--space-x-reverse)) !important; margin-left: calc(4.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5rem * var(--space-x-reverse)) !important; margin-left: calc(5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5.5rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5.5rem * var(--space-x-reverse)) !important; margin-left: calc(5.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6rem * var(--space-x-reverse)) !important; margin-left: calc(6rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6.5rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6.5rem * var(--space-x-reverse)) !important; margin-left: calc(6.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7rem * var(--space-x-reverse)) !important; margin-left: calc(7rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7.5rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7.5rem * var(--space-x-reverse)) !important; margin-left: calc(7.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(8rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(8rem * var(--space-x-reverse)) !important; margin-left: calc(8rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(9rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(9rem * var(--space-x-reverse)) !important; margin-left: calc(9rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(10rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(10rem * var(--space-x-reverse)) !important; margin-left: calc(10rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(12rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(12rem * var(--space-x-reverse)) !important; margin-left: calc(12rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(14rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(14rem * var(--space-x-reverse)) !important; margin-left: calc(14rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(16rem * var(--space-y-reverse)) !important; } .lt-lg\:space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(16rem * var(--space-x-reverse)) !important; margin-left: calc(16rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1px * var(--space-y-reverse)) !important; } .lt-lg\:space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1px * var(--space-x-reverse)) !important; margin-left: calc(1px * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2px * var(--space-y-reverse)) !important; } .lt-lg\:space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2px * var(--space-x-reverse)) !important; margin-left: calc(2px * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.25rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.25rem * var(--space-x-reverse)) !important; margin-left: calc(-0.25rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.5rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.5rem * var(--space-x-reverse)) !important; margin-left: calc(-0.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.75rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.75rem * var(--space-x-reverse)) !important; margin-left: calc(-0.75rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1rem * var(--space-x-reverse)) !important; margin-left: calc(-1rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.25rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.25rem * var(--space-x-reverse)) !important; margin-left: calc(-1.25rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.5rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.5rem * var(--space-x-reverse)) !important; margin-left: calc(-1.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2rem * var(--space-x-reverse)) !important; margin-left: calc(-2rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2.5rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2.5rem * var(--space-x-reverse)) !important; margin-left: calc(-2.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3rem * var(--space-x-reverse)) !important; margin-left: calc(-3rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3.5rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3.5rem * var(--space-x-reverse)) !important; margin-left: calc(-3.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4rem * var(--space-x-reverse)) !important; margin-left: calc(-4rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4.5rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4.5rem * var(--space-x-reverse)) !important; margin-left: calc(-4.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5rem * var(--space-x-reverse)) !important; margin-left: calc(-5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5.5rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5.5rem * var(--space-x-reverse)) !important; margin-left: calc(-5.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6rem * var(--space-x-reverse)) !important; margin-left: calc(-6rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6.5rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6.5rem * var(--space-x-reverse)) !important; margin-left: calc(-6.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7rem * var(--space-x-reverse)) !important; margin-left: calc(-7rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7.5rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7.5rem * var(--space-x-reverse)) !important; margin-left: calc(-7.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-8rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-8rem * var(--space-x-reverse)) !important; margin-left: calc(-8rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-9rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-9rem * var(--space-x-reverse)) !important; margin-left: calc(-9rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-10rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-10rem * var(--space-x-reverse)) !important; margin-left: calc(-10rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-12rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-12rem * var(--space-x-reverse)) !important; margin-left: calc(-12rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-14rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-14rem * var(--space-x-reverse)) !important; margin-left: calc(-14rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-16rem * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-16rem * var(--space-x-reverse)) !important; margin-left: calc(-16rem * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1px * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1px * var(--space-x-reverse)) !important; margin-left: calc(-1px * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:-space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2px * var(--space-y-reverse)) !important; } .lt-lg\:-space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2px * var(--space-x-reverse)) !important; margin-left: calc(-2px * calc(1 - var(--space-x-reverse))) !important; } .lt-lg\:space-y-reverse > :not(template) ~ :not(template) { --space-y-reverse: 1 !important; } .lt-lg\:space-x-reverse > :not(template) ~ :not(template) { --space-x-reverse: 1 !important; } .lt-lg\:divide-y-0 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(0px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(0px * var(--divide-y-reverse)) !important; } .lt-lg\:divide-x-0 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(0px * var(--divide-x-reverse)) !important; border-left-width: calc(0px * calc(1 - var(--divide-x-reverse))) !important; } .lt-lg\:divide-y-2 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(2px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(2px * var(--divide-y-reverse)) !important; } .lt-lg\:divide-x-2 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(2px * var(--divide-x-reverse)) !important; border-left-width: calc(2px * calc(1 - var(--divide-x-reverse))) !important; } .lt-lg\:divide-y-4 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(4px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(4px * var(--divide-y-reverse)) !important; } .lt-lg\:divide-x-4 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(4px * var(--divide-x-reverse)) !important; border-left-width: calc(4px * calc(1 - var(--divide-x-reverse))) !important; } .lt-lg\:divide-y-8 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(8px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(8px * var(--divide-y-reverse)) !important; } .lt-lg\:divide-x-8 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(8px * var(--divide-x-reverse)) !important; border-left-width: calc(8px * calc(1 - var(--divide-x-reverse))) !important; } .lt-lg\:divide-y > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(1px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(1px * var(--divide-y-reverse)) !important; } .lt-lg\:divide-x > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(1px * var(--divide-x-reverse)) !important; border-left-width: calc(1px * calc(1 - var(--divide-x-reverse))) !important; } .lt-lg\:divide-y-reverse > :not(template) ~ :not(template) { --divide-y-reverse: 1 !important; } .lt-lg\:divide-x-reverse > :not(template) ~ :not(template) { --divide-x-reverse: 1 !important; } .lt-lg\:divide-current > :not(template) ~ :not(template) { border-color: currentColor !important; } .lt-lg\:divide-transparent > :not(template) ~ :not(template) { border-color: transparent !important; } .lt-lg\:divide-white > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFFFFF !important; border-color: rgba(255, 255, 255, var(--divide-opacity)) !important; } .lt-lg\:divide-black > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #000000 !important; border-color: rgba(0, 0, 0, var(--divide-opacity)) !important; } .lt-lg\:divide-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F9FAFB !important; border-color: rgba(249, 250, 251, var(--divide-opacity)) !important; } .lt-lg\:divide-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F4F5F7 !important; border-color: rgba(244, 245, 247, var(--divide-opacity)) !important; } .lt-lg\:divide-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5E7EB !important; border-color: rgba(229, 231, 235, var(--divide-opacity)) !important; } .lt-lg\:divide-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D2D6DC !important; border-color: rgba(210, 214, 220, var(--divide-opacity)) !important; } .lt-lg\:divide-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9FA6B2 !important; border-color: rgba(159, 166, 178, var(--divide-opacity)) !important; } .lt-lg\:divide-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .lt-lg\:divide-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4B5563 !important; border-color: rgba(75, 85, 99, var(--divide-opacity)) !important; } .lt-lg\:divide-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #374151 !important; border-color: rgba(55, 65, 81, var(--divide-opacity)) !important; } .lt-lg\:divide-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #252F3F !important; border-color: rgba(37, 47, 63, var(--divide-opacity)) !important; } .lt-lg\:divide-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #161E2E !important; border-color: rgba(22, 30, 46, var(--divide-opacity)) !important; } .lt-lg\:divide-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .lt-lg\:divide-cool-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBFDFE !important; border-color: rgba(251, 253, 254, var(--divide-opacity)) !important; } .lt-lg\:divide-cool-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F1F5F9 !important; border-color: rgba(241, 245, 249, var(--divide-opacity)) !important; } .lt-lg\:divide-cool-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E2E8F0 !important; border-color: rgba(226, 232, 240, var(--divide-opacity)) !important; } .lt-lg\:divide-cool-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CFD8E3 !important; border-color: rgba(207, 216, 227, var(--divide-opacity)) !important; } .lt-lg\:divide-cool-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #97A6BA !important; border-color: rgba(151, 166, 186, var(--divide-opacity)) !important; } .lt-lg\:divide-cool-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .lt-lg\:divide-cool-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #475569 !important; border-color: rgba(71, 85, 105, var(--divide-opacity)) !important; } .lt-lg\:divide-cool-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #364152 !important; border-color: rgba(54, 65, 82, var(--divide-opacity)) !important; } .lt-lg\:divide-cool-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #27303F !important; border-color: rgba(39, 48, 63, var(--divide-opacity)) !important; } .lt-lg\:divide-cool-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A202E !important; border-color: rgba(26, 32, 46, var(--divide-opacity)) !important; } .lt-lg\:divide-cool-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .lt-lg\:divide-red-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F2 !important; border-color: rgba(253, 242, 242, var(--divide-opacity)) !important; } .lt-lg\:divide-red-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDE8E8 !important; border-color: rgba(253, 232, 232, var(--divide-opacity)) !important; } .lt-lg\:divide-red-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBD5D5 !important; border-color: rgba(251, 213, 213, var(--divide-opacity)) !important; } .lt-lg\:divide-red-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4B4 !important; border-color: rgba(248, 180, 180, var(--divide-opacity)) !important; } .lt-lg\:divide-red-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F98080 !important; border-color: rgba(249, 128, 128, var(--divide-opacity)) !important; } .lt-lg\:divide-red-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .lt-lg\:divide-red-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E02424 !important; border-color: rgba(224, 36, 36, var(--divide-opacity)) !important; } .lt-lg\:divide-red-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C81E1E !important; border-color: rgba(200, 30, 30, var(--divide-opacity)) !important; } .lt-lg\:divide-red-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9B1C1C !important; border-color: rgba(155, 28, 28, var(--divide-opacity)) !important; } .lt-lg\:divide-red-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .lt-lg\:divide-red > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .lt-lg\:divide-orange-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFF8F1 !important; border-color: rgba(255, 248, 241, var(--divide-opacity)) !important; } .lt-lg\:divide-orange-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FEECDC !important; border-color: rgba(254, 236, 220, var(--divide-opacity)) !important; } .lt-lg\:divide-orange-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCD9BD !important; border-color: rgba(252, 217, 189, var(--divide-opacity)) !important; } .lt-lg\:divide-orange-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDBA8C !important; border-color: rgba(253, 186, 140, var(--divide-opacity)) !important; } .lt-lg\:divide-orange-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF8A4C !important; border-color: rgba(255, 138, 76, var(--divide-opacity)) !important; } .lt-lg\:divide-orange-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .lt-lg\:divide-orange-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D03801 !important; border-color: rgba(208, 56, 1, var(--divide-opacity)) !important; } .lt-lg\:divide-orange-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B43403 !important; border-color: rgba(180, 52, 3, var(--divide-opacity)) !important; } .lt-lg\:divide-orange-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8A2C0D !important; border-color: rgba(138, 44, 13, var(--divide-opacity)) !important; } .lt-lg\:divide-orange-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .lt-lg\:divide-orange > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .lt-lg\:divide-yellow-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDFDEA !important; border-color: rgba(253, 253, 234, var(--divide-opacity)) !important; } .lt-lg\:divide-yellow-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF6B2 !important; border-color: rgba(253, 246, 178, var(--divide-opacity)) !important; } .lt-lg\:divide-yellow-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE96A !important; border-color: rgba(252, 233, 106, var(--divide-opacity)) !important; } .lt-lg\:divide-yellow-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FACA15 !important; border-color: rgba(250, 202, 21, var(--divide-opacity)) !important; } .lt-lg\:divide-yellow-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E3A008 !important; border-color: rgba(227, 160, 8, var(--divide-opacity)) !important; } .lt-lg\:divide-yellow-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .lt-lg\:divide-yellow-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9F580A !important; border-color: rgba(159, 88, 10, var(--divide-opacity)) !important; } .lt-lg\:divide-yellow-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8E4B10 !important; border-color: rgba(142, 75, 16, var(--divide-opacity)) !important; } .lt-lg\:divide-yellow-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #723B13 !important; border-color: rgba(114, 59, 19, var(--divide-opacity)) !important; } .lt-lg\:divide-yellow-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #633112 !important; border-color: rgba(99, 49, 18, var(--divide-opacity)) !important; } .lt-lg\:divide-yellow > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .lt-lg\:divide-green-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F3FAF7 !important; border-color: rgba(243, 250, 247, var(--divide-opacity)) !important; } .lt-lg\:divide-green-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DEF7EC !important; border-color: rgba(222, 247, 236, var(--divide-opacity)) !important; } .lt-lg\:divide-green-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BCF0DA !important; border-color: rgba(188, 240, 218, var(--divide-opacity)) !important; } .lt-lg\:divide-green-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #84E1BC !important; border-color: rgba(132, 225, 188, var(--divide-opacity)) !important; } .lt-lg\:divide-green-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #31C48D !important; border-color: rgba(49, 196, 141, var(--divide-opacity)) !important; } .lt-lg\:divide-green-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .lt-lg\:divide-green-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #057A55 !important; border-color: rgba(5, 122, 85, var(--divide-opacity)) !important; } .lt-lg\:divide-green-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #046C4E !important; border-color: rgba(4, 108, 78, var(--divide-opacity)) !important; } .lt-lg\:divide-green-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #03543F !important; border-color: rgba(3, 84, 63, var(--divide-opacity)) !important; } .lt-lg\:divide-green-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014737 !important; border-color: rgba(1, 71, 55, var(--divide-opacity)) !important; } .lt-lg\:divide-green > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .lt-lg\:divide-teal-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDFAFA !important; border-color: rgba(237, 250, 250, var(--divide-opacity)) !important; } .lt-lg\:divide-teal-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D5F5F6 !important; border-color: rgba(213, 245, 246, var(--divide-opacity)) !important; } .lt-lg\:divide-teal-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AFECEF !important; border-color: rgba(175, 236, 239, var(--divide-opacity)) !important; } .lt-lg\:divide-teal-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7EDCE2 !important; border-color: rgba(126, 220, 226, var(--divide-opacity)) !important; } .lt-lg\:divide-teal-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #16BDCA !important; border-color: rgba(22, 189, 202, var(--divide-opacity)) !important; } .lt-lg\:divide-teal-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .lt-lg\:divide-teal-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #047481 !important; border-color: rgba(4, 116, 129, var(--divide-opacity)) !important; } .lt-lg\:divide-teal-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #036672 !important; border-color: rgba(3, 102, 114, var(--divide-opacity)) !important; } .lt-lg\:divide-teal-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #05505C !important; border-color: rgba(5, 80, 92, var(--divide-opacity)) !important; } .lt-lg\:divide-teal-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014451 !important; border-color: rgba(1, 68, 81, var(--divide-opacity)) !important; } .lt-lg\:divide-teal > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .lt-lg\:divide-blue-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EBF5FF !important; border-color: rgba(235, 245, 255, var(--divide-opacity)) !important; } .lt-lg\:divide-blue-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E1EFFE !important; border-color: rgba(225, 239, 254, var(--divide-opacity)) !important; } .lt-lg\:divide-blue-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C3DDFD !important; border-color: rgba(195, 221, 253, var(--divide-opacity)) !important; } .lt-lg\:divide-blue-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #A4CAFE !important; border-color: rgba(164, 202, 254, var(--divide-opacity)) !important; } .lt-lg\:divide-blue-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #76A9FA !important; border-color: rgba(118, 169, 250, var(--divide-opacity)) !important; } .lt-lg\:divide-blue-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .lt-lg\:divide-blue-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1C64F2 !important; border-color: rgba(28, 100, 242, var(--divide-opacity)) !important; } .lt-lg\:divide-blue-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A56DB !important; border-color: rgba(26, 86, 219, var(--divide-opacity)) !important; } .lt-lg\:divide-blue-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1E429F !important; border-color: rgba(30, 66, 159, var(--divide-opacity)) !important; } .lt-lg\:divide-blue-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #233876 !important; border-color: rgba(35, 56, 118, var(--divide-opacity)) !important; } .lt-lg\:divide-blue > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .lt-lg\:divide-indigo-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F0F5FF !important; border-color: rgba(240, 245, 255, var(--divide-opacity)) !important; } .lt-lg\:divide-indigo-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5EDFF !important; border-color: rgba(229, 237, 255, var(--divide-opacity)) !important; } .lt-lg\:divide-indigo-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CDDBFE !important; border-color: rgba(205, 219, 254, var(--divide-opacity)) !important; } .lt-lg\:divide-indigo-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B4C6FC !important; border-color: rgba(180, 198, 252, var(--divide-opacity)) !important; } .lt-lg\:divide-indigo-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8DA2FB !important; border-color: rgba(141, 162, 251, var(--divide-opacity)) !important; } .lt-lg\:divide-indigo-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .lt-lg\:divide-indigo-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5850EC !important; border-color: rgba(88, 80, 236, var(--divide-opacity)) !important; } .lt-lg\:divide-indigo-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5145CD !important; border-color: rgba(81, 69, 205, var(--divide-opacity)) !important; } .lt-lg\:divide-indigo-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #42389D !important; border-color: rgba(66, 56, 157, var(--divide-opacity)) !important; } .lt-lg\:divide-indigo-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #362F78 !important; border-color: rgba(54, 47, 120, var(--divide-opacity)) !important; } .lt-lg\:divide-indigo > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .lt-lg\:divide-purple-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F6F5FF !important; border-color: rgba(246, 245, 255, var(--divide-opacity)) !important; } .lt-lg\:divide-purple-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDEBFE !important; border-color: rgba(237, 235, 254, var(--divide-opacity)) !important; } .lt-lg\:divide-purple-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DCD7FE !important; border-color: rgba(220, 215, 254, var(--divide-opacity)) !important; } .lt-lg\:divide-purple-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CABFFD !important; border-color: rgba(202, 191, 253, var(--divide-opacity)) !important; } .lt-lg\:divide-purple-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AC94FA !important; border-color: rgba(172, 148, 250, var(--divide-opacity)) !important; } .lt-lg\:divide-purple-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .lt-lg\:divide-purple-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7E3AF2 !important; border-color: rgba(126, 58, 242, var(--divide-opacity)) !important; } .lt-lg\:divide-purple-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6C2BD9 !important; border-color: rgba(108, 43, 217, var(--divide-opacity)) !important; } .lt-lg\:divide-purple-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5521B5 !important; border-color: rgba(85, 33, 181, var(--divide-opacity)) !important; } .lt-lg\:divide-purple-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4A1D96 !important; border-color: rgba(74, 29, 150, var(--divide-opacity)) !important; } .lt-lg\:divide-purple > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .lt-lg\:divide-pink-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F8 !important; border-color: rgba(253, 242, 248, var(--divide-opacity)) !important; } .lt-lg\:divide-pink-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE8F3 !important; border-color: rgba(252, 232, 243, var(--divide-opacity)) !important; } .lt-lg\:divide-pink-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FAD1E8 !important; border-color: rgba(250, 209, 232, var(--divide-opacity)) !important; } .lt-lg\:divide-pink-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4D9 !important; border-color: rgba(248, 180, 217, var(--divide-opacity)) !important; } .lt-lg\:divide-pink-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F17EB8 !important; border-color: rgba(241, 126, 184, var(--divide-opacity)) !important; } .lt-lg\:divide-pink-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .lt-lg\:divide-pink-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D61F69 !important; border-color: rgba(214, 31, 105, var(--divide-opacity)) !important; } .lt-lg\:divide-pink-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BF125D !important; border-color: rgba(191, 18, 93, var(--divide-opacity)) !important; } .lt-lg\:divide-pink-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #99154B !important; border-color: rgba(153, 21, 75, var(--divide-opacity)) !important; } .lt-lg\:divide-pink-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #751A3D !important; border-color: rgba(117, 26, 61, var(--divide-opacity)) !important; } .lt-lg\:divide-pink > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .lt-lg\:divide-opacity-0 > :not(template) ~ :not(template) { --divide-opacity: 0 !important; } .lt-lg\:divide-opacity-12 > :not(template) ~ :not(template) { --divide-opacity: 0.12 !important; } .lt-lg\:divide-opacity-25 > :not(template) ~ :not(template) { --divide-opacity: 0.25 !important; } .lt-lg\:divide-opacity-38 > :not(template) ~ :not(template) { --divide-opacity: 0.38 !important; } .lt-lg\:divide-opacity-50 > :not(template) ~ :not(template) { --divide-opacity: 0.5 !important; } .lt-lg\:divide-opacity-54 > :not(template) ~ :not(template) { --divide-opacity: 0.54 !important; } .lt-lg\:divide-opacity-70 > :not(template) ~ :not(template) { --divide-opacity: 0.70 !important; } .lt-lg\:divide-opacity-75 > :not(template) ~ :not(template) { --divide-opacity: 0.75 !important; } .lt-lg\:divide-opacity-84 > :not(template) ~ :not(template) { --divide-opacity: 0.84 !important; } .lt-lg\:divide-opacity-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; } .lt-lg\:sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .lt-lg\:not-sr-only { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .lt-lg\:focus\:sr-only:focus { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .lt-lg\:focus\:not-sr-only:focus { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .lt-lg\:appearance-none { -webkit-appearance: none !important; -moz-appearance: none !important; appearance: none !important; } .lt-lg\:bg-fixed { background-attachment: fixed !important; } .lt-lg\:bg-local { background-attachment: local !important; } .lt-lg\:bg-scroll { background-attachment: scroll !important; } .lt-lg\:bg-opacity-0 { --bg-opacity: 0 !important; } .lt-lg\:bg-opacity-12 { --bg-opacity: 0.12 !important; } .lt-lg\:bg-opacity-25 { --bg-opacity: 0.25 !important; } .lt-lg\:bg-opacity-38 { --bg-opacity: 0.38 !important; } .lt-lg\:bg-opacity-50 { --bg-opacity: 0.5 !important; } .lt-lg\:bg-opacity-54 { --bg-opacity: 0.54 !important; } .lt-lg\:bg-opacity-70 { --bg-opacity: 0.70 !important; } .lt-lg\:bg-opacity-75 { --bg-opacity: 0.75 !important; } .lt-lg\:bg-opacity-84 { --bg-opacity: 0.84 !important; } .lt-lg\:bg-opacity-100 { --bg-opacity: 1 !important; } .lt-lg\:hover\:bg-opacity-0:hover { --bg-opacity: 0 !important; } .lt-lg\:hover\:bg-opacity-12:hover { --bg-opacity: 0.12 !important; } .lt-lg\:hover\:bg-opacity-25:hover { --bg-opacity: 0.25 !important; } .lt-lg\:hover\:bg-opacity-38:hover { --bg-opacity: 0.38 !important; } .lt-lg\:hover\:bg-opacity-50:hover { --bg-opacity: 0.5 !important; } .lt-lg\:hover\:bg-opacity-54:hover { --bg-opacity: 0.54 !important; } .lt-lg\:hover\:bg-opacity-70:hover { --bg-opacity: 0.70 !important; } .lt-lg\:hover\:bg-opacity-75:hover { --bg-opacity: 0.75 !important; } .lt-lg\:hover\:bg-opacity-84:hover { --bg-opacity: 0.84 !important; } .lt-lg\:hover\:bg-opacity-100:hover { --bg-opacity: 1 !important; } .lt-lg\:focus\:bg-opacity-0:focus { --bg-opacity: 0 !important; } .lt-lg\:focus\:bg-opacity-12:focus { --bg-opacity: 0.12 !important; } .lt-lg\:focus\:bg-opacity-25:focus { --bg-opacity: 0.25 !important; } .lt-lg\:focus\:bg-opacity-38:focus { --bg-opacity: 0.38 !important; } .lt-lg\:focus\:bg-opacity-50:focus { --bg-opacity: 0.5 !important; } .lt-lg\:focus\:bg-opacity-54:focus { --bg-opacity: 0.54 !important; } .lt-lg\:focus\:bg-opacity-70:focus { --bg-opacity: 0.70 !important; } .lt-lg\:focus\:bg-opacity-75:focus { --bg-opacity: 0.75 !important; } .lt-lg\:focus\:bg-opacity-84:focus { --bg-opacity: 0.84 !important; } .lt-lg\:focus\:bg-opacity-100:focus { --bg-opacity: 1 !important; } .lt-lg\:bg-bottom { background-position: bottom !important; } .lt-lg\:bg-center { background-position: center !important; } .lt-lg\:bg-left { background-position: left !important; } .lt-lg\:bg-left-bottom { background-position: left bottom !important; } .lt-lg\:bg-left-top { background-position: left top !important; } .lt-lg\:bg-right { background-position: right !important; } .lt-lg\:bg-right-bottom { background-position: right bottom !important; } .lt-lg\:bg-right-top { background-position: right top !important; } .lt-lg\:bg-top { background-position: top !important; } .lt-lg\:bg-repeat { background-repeat: repeat !important; } .lt-lg\:bg-no-repeat { background-repeat: no-repeat !important; } .lt-lg\:bg-repeat-x { background-repeat: repeat-x !important; } .lt-lg\:bg-repeat-y { background-repeat: repeat-y !important; } .lt-lg\:bg-repeat-round { background-repeat: round !important; } .lt-lg\:bg-repeat-space { background-repeat: space !important; } .lt-lg\:bg-auto { background-size: auto !important; } .lt-lg\:bg-cover { background-size: cover !important; } .lt-lg\:bg-contain { background-size: contain !important; } .lt-lg\:border-collapse { border-collapse: collapse !important; } .lt-lg\:border-separate { border-collapse: separate !important; } .lt-lg\:border-opacity-0 { --border-opacity: 0 !important; } .lt-lg\:border-opacity-12 { --border-opacity: 0.12 !important; } .lt-lg\:border-opacity-25 { --border-opacity: 0.25 !important; } .lt-lg\:border-opacity-38 { --border-opacity: 0.38 !important; } .lt-lg\:border-opacity-50 { --border-opacity: 0.5 !important; } .lt-lg\:border-opacity-54 { --border-opacity: 0.54 !important; } .lt-lg\:border-opacity-70 { --border-opacity: 0.70 !important; } .lt-lg\:border-opacity-75 { --border-opacity: 0.75 !important; } .lt-lg\:border-opacity-84 { --border-opacity: 0.84 !important; } .lt-lg\:border-opacity-100 { --border-opacity: 1 !important; } .lt-lg\:hover\:border-opacity-0:hover { --border-opacity: 0 !important; } .lt-lg\:hover\:border-opacity-12:hover { --border-opacity: 0.12 !important; } .lt-lg\:hover\:border-opacity-25:hover { --border-opacity: 0.25 !important; } .lt-lg\:hover\:border-opacity-38:hover { --border-opacity: 0.38 !important; } .lt-lg\:hover\:border-opacity-50:hover { --border-opacity: 0.5 !important; } .lt-lg\:hover\:border-opacity-54:hover { --border-opacity: 0.54 !important; } .lt-lg\:hover\:border-opacity-70:hover { --border-opacity: 0.70 !important; } .lt-lg\:hover\:border-opacity-75:hover { --border-opacity: 0.75 !important; } .lt-lg\:hover\:border-opacity-84:hover { --border-opacity: 0.84 !important; } .lt-lg\:hover\:border-opacity-100:hover { --border-opacity: 1 !important; } .lt-lg\:focus\:border-opacity-0:focus { --border-opacity: 0 !important; } .lt-lg\:focus\:border-opacity-12:focus { --border-opacity: 0.12 !important; } .lt-lg\:focus\:border-opacity-25:focus { --border-opacity: 0.25 !important; } .lt-lg\:focus\:border-opacity-38:focus { --border-opacity: 0.38 !important; } .lt-lg\:focus\:border-opacity-50:focus { --border-opacity: 0.5 !important; } .lt-lg\:focus\:border-opacity-54:focus { --border-opacity: 0.54 !important; } .lt-lg\:focus\:border-opacity-70:focus { --border-opacity: 0.70 !important; } .lt-lg\:focus\:border-opacity-75:focus { --border-opacity: 0.75 !important; } .lt-lg\:focus\:border-opacity-84:focus { --border-opacity: 0.84 !important; } .lt-lg\:focus\:border-opacity-100:focus { --border-opacity: 1 !important; } .lt-lg\:rounded-none { border-radius: 0 !important; } .lt-lg\:rounded-sm { border-radius: 0.125rem !important; } .lt-lg\:rounded { border-radius: 0.25rem !important; } .lt-lg\:rounded-md { border-radius: 0.375rem !important; } .lt-lg\:rounded-lg { border-radius: 0.5rem !important; } .lt-lg\:rounded-full { border-radius: 9999px !important; } .lt-lg\:rounded-t-none { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } .lt-lg\:rounded-r-none { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } .lt-lg\:rounded-b-none { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } .lt-lg\:rounded-l-none { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; } .lt-lg\:rounded-t-sm { border-top-left-radius: 0.125rem !important; border-top-right-radius: 0.125rem !important; } .lt-lg\:rounded-r-sm { border-top-right-radius: 0.125rem !important; border-bottom-right-radius: 0.125rem !important; } .lt-lg\:rounded-b-sm { border-bottom-right-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .lt-lg\:rounded-l-sm { border-top-left-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .lt-lg\:rounded-t { border-top-left-radius: 0.25rem !important; border-top-right-radius: 0.25rem !important; } .lt-lg\:rounded-r { border-top-right-radius: 0.25rem !important; border-bottom-right-radius: 0.25rem !important; } .lt-lg\:rounded-b { border-bottom-right-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .lt-lg\:rounded-l { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .lt-lg\:rounded-t-md { border-top-left-radius: 0.375rem !important; border-top-right-radius: 0.375rem !important; } .lt-lg\:rounded-r-md { border-top-right-radius: 0.375rem !important; border-bottom-right-radius: 0.375rem !important; } .lt-lg\:rounded-b-md { border-bottom-right-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .lt-lg\:rounded-l-md { border-top-left-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .lt-lg\:rounded-t-lg { border-top-left-radius: 0.5rem !important; border-top-right-radius: 0.5rem !important; } .lt-lg\:rounded-r-lg { border-top-right-radius: 0.5rem !important; border-bottom-right-radius: 0.5rem !important; } .lt-lg\:rounded-b-lg { border-bottom-right-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .lt-lg\:rounded-l-lg { border-top-left-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .lt-lg\:rounded-t-full { border-top-left-radius: 9999px !important; border-top-right-radius: 9999px !important; } .lt-lg\:rounded-r-full { border-top-right-radius: 9999px !important; border-bottom-right-radius: 9999px !important; } .lt-lg\:rounded-b-full { border-bottom-right-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .lt-lg\:rounded-l-full { border-top-left-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .lt-lg\:rounded-tl-none { border-top-left-radius: 0 !important; } .lt-lg\:rounded-tr-none { border-top-right-radius: 0 !important; } .lt-lg\:rounded-br-none { border-bottom-right-radius: 0 !important; } .lt-lg\:rounded-bl-none { border-bottom-left-radius: 0 !important; } .lt-lg\:rounded-tl-sm { border-top-left-radius: 0.125rem !important; } .lt-lg\:rounded-tr-sm { border-top-right-radius: 0.125rem !important; } .lt-lg\:rounded-br-sm { border-bottom-right-radius: 0.125rem !important; } .lt-lg\:rounded-bl-sm { border-bottom-left-radius: 0.125rem !important; } .lt-lg\:rounded-tl { border-top-left-radius: 0.25rem !important; } .lt-lg\:rounded-tr { border-top-right-radius: 0.25rem !important; } .lt-lg\:rounded-br { border-bottom-right-radius: 0.25rem !important; } .lt-lg\:rounded-bl { border-bottom-left-radius: 0.25rem !important; } .lt-lg\:rounded-tl-md { border-top-left-radius: 0.375rem !important; } .lt-lg\:rounded-tr-md { border-top-right-radius: 0.375rem !important; } .lt-lg\:rounded-br-md { border-bottom-right-radius: 0.375rem !important; } .lt-lg\:rounded-bl-md { border-bottom-left-radius: 0.375rem !important; } .lt-lg\:rounded-tl-lg { border-top-left-radius: 0.5rem !important; } .lt-lg\:rounded-tr-lg { border-top-right-radius: 0.5rem !important; } .lt-lg\:rounded-br-lg { border-bottom-right-radius: 0.5rem !important; } .lt-lg\:rounded-bl-lg { border-bottom-left-radius: 0.5rem !important; } .lt-lg\:rounded-tl-full { border-top-left-radius: 9999px !important; } .lt-lg\:rounded-tr-full { border-top-right-radius: 9999px !important; } .lt-lg\:rounded-br-full { border-bottom-right-radius: 9999px !important; } .lt-lg\:rounded-bl-full { border-bottom-left-radius: 9999px !important; } .lt-lg\:border-solid { border-style: solid !important; } .lt-lg\:border-dashed { border-style: dashed !important; } .lt-lg\:border-dotted { border-style: dotted !important; } .lt-lg\:border-double { border-style: double !important; } .lt-lg\:border-none { border-style: none !important; } .lt-lg\:border-0 { border-width: 0 !important; } .lt-lg\:border-2 { border-width: 2px !important; } .lt-lg\:border-4 { border-width: 4px !important; } .lt-lg\:border-8 { border-width: 8px !important; } .lt-lg\:border { border-width: 1px !important; } .lt-lg\:border-t-0 { border-top-width: 0 !important; } .lt-lg\:border-r-0 { border-right-width: 0 !important; } .lt-lg\:border-b-0 { border-bottom-width: 0 !important; } .lt-lg\:border-l-0 { border-left-width: 0 !important; } .lt-lg\:border-t-2 { border-top-width: 2px !important; } .lt-lg\:border-r-2 { border-right-width: 2px !important; } .lt-lg\:border-b-2 { border-bottom-width: 2px !important; } .lt-lg\:border-l-2 { border-left-width: 2px !important; } .lt-lg\:border-t-4 { border-top-width: 4px !important; } .lt-lg\:border-r-4 { border-right-width: 4px !important; } .lt-lg\:border-b-4 { border-bottom-width: 4px !important; } .lt-lg\:border-l-4 { border-left-width: 4px !important; } .lt-lg\:border-t-8 { border-top-width: 8px !important; } .lt-lg\:border-r-8 { border-right-width: 8px !important; } .lt-lg\:border-b-8 { border-bottom-width: 8px !important; } .lt-lg\:border-l-8 { border-left-width: 8px !important; } .lt-lg\:border-t { border-top-width: 1px !important; } .lt-lg\:border-r { border-right-width: 1px !important; } .lt-lg\:border-b { border-bottom-width: 1px !important; } .lt-lg\:border-l { border-left-width: 1px !important; } .lt-lg\:first\:border-0:first-child { border-width: 0 !important; } .lt-lg\:first\:border-2:first-child { border-width: 2px !important; } .lt-lg\:first\:border-4:first-child { border-width: 4px !important; } .lt-lg\:first\:border-8:first-child { border-width: 8px !important; } .lt-lg\:first\:border:first-child { border-width: 1px !important; } .lt-lg\:first\:border-t-0:first-child { border-top-width: 0 !important; } .lt-lg\:first\:border-r-0:first-child { border-right-width: 0 !important; } .lt-lg\:first\:border-b-0:first-child { border-bottom-width: 0 !important; } .lt-lg\:first\:border-l-0:first-child { border-left-width: 0 !important; } .lt-lg\:first\:border-t-2:first-child { border-top-width: 2px !important; } .lt-lg\:first\:border-r-2:first-child { border-right-width: 2px !important; } .lt-lg\:first\:border-b-2:first-child { border-bottom-width: 2px !important; } .lt-lg\:first\:border-l-2:first-child { border-left-width: 2px !important; } .lt-lg\:first\:border-t-4:first-child { border-top-width: 4px !important; } .lt-lg\:first\:border-r-4:first-child { border-right-width: 4px !important; } .lt-lg\:first\:border-b-4:first-child { border-bottom-width: 4px !important; } .lt-lg\:first\:border-l-4:first-child { border-left-width: 4px !important; } .lt-lg\:first\:border-t-8:first-child { border-top-width: 8px !important; } .lt-lg\:first\:border-r-8:first-child { border-right-width: 8px !important; } .lt-lg\:first\:border-b-8:first-child { border-bottom-width: 8px !important; } .lt-lg\:first\:border-l-8:first-child { border-left-width: 8px !important; } .lt-lg\:first\:border-t:first-child { border-top-width: 1px !important; } .lt-lg\:first\:border-r:first-child { border-right-width: 1px !important; } .lt-lg\:first\:border-b:first-child { border-bottom-width: 1px !important; } .lt-lg\:first\:border-l:first-child { border-left-width: 1px !important; } .lt-lg\:last\:border-0:last-child { border-width: 0 !important; } .lt-lg\:last\:border-2:last-child { border-width: 2px !important; } .lt-lg\:last\:border-4:last-child { border-width: 4px !important; } .lt-lg\:last\:border-8:last-child { border-width: 8px !important; } .lt-lg\:last\:border:last-child { border-width: 1px !important; } .lt-lg\:last\:border-t-0:last-child { border-top-width: 0 !important; } .lt-lg\:last\:border-r-0:last-child { border-right-width: 0 !important; } .lt-lg\:last\:border-b-0:last-child { border-bottom-width: 0 !important; } .lt-lg\:last\:border-l-0:last-child { border-left-width: 0 !important; } .lt-lg\:last\:border-t-2:last-child { border-top-width: 2px !important; } .lt-lg\:last\:border-r-2:last-child { border-right-width: 2px !important; } .lt-lg\:last\:border-b-2:last-child { border-bottom-width: 2px !important; } .lt-lg\:last\:border-l-2:last-child { border-left-width: 2px !important; } .lt-lg\:last\:border-t-4:last-child { border-top-width: 4px !important; } .lt-lg\:last\:border-r-4:last-child { border-right-width: 4px !important; } .lt-lg\:last\:border-b-4:last-child { border-bottom-width: 4px !important; } .lt-lg\:last\:border-l-4:last-child { border-left-width: 4px !important; } .lt-lg\:last\:border-t-8:last-child { border-top-width: 8px !important; } .lt-lg\:last\:border-r-8:last-child { border-right-width: 8px !important; } .lt-lg\:last\:border-b-8:last-child { border-bottom-width: 8px !important; } .lt-lg\:last\:border-l-8:last-child { border-left-width: 8px !important; } .lt-lg\:last\:border-t:last-child { border-top-width: 1px !important; } .lt-lg\:last\:border-r:last-child { border-right-width: 1px !important; } .lt-lg\:last\:border-b:last-child { border-bottom-width: 1px !important; } .lt-lg\:last\:border-l:last-child { border-left-width: 1px !important; } .lt-lg\:box-border { box-sizing: border-box !important; } .lt-lg\:box-content { box-sizing: content-box !important; } .lt-lg\:block { display: block !important; } .lt-lg\:inline-block { display: inline-block !important; } .lt-lg\:inline { display: inline !important; } .lt-lg\:flex { display: flex !important; } .lt-lg\:inline-flex { display: inline-flex !important; } .lt-lg\:table { display: table !important; } .lt-lg\:table-caption { display: table-caption !important; } .lt-lg\:table-cell { display: table-cell !important; } .lt-lg\:table-column { display: table-column !important; } .lt-lg\:table-column-group { display: table-column-group !important; } .lt-lg\:table-footer-group { display: table-footer-group !important; } .lt-lg\:table-header-group { display: table-header-group !important; } .lt-lg\:table-row-group { display: table-row-group !important; } .lt-lg\:table-row { display: table-row !important; } .lt-lg\:flow-root { display: flow-root !important; } .lt-lg\:grid { display: grid !important; } .lt-lg\:inline-grid { display: inline-grid !important; } .lt-lg\:hidden { display: none !important; } .lt-lg\:flex-row { flex-direction: row !important; } .lt-lg\:flex-row-reverse { flex-direction: row-reverse !important; } .lt-lg\:flex-col { flex-direction: column !important; } .lt-lg\:flex-col-reverse { flex-direction: column-reverse !important; } .lt-lg\:flex-wrap { flex-wrap: wrap !important; } .lt-lg\:flex-wrap-reverse { flex-wrap: wrap-reverse !important; } .lt-lg\:flex-no-wrap { flex-wrap: nowrap !important; } .lt-lg\:items-start { align-items: flex-start !important; } .lt-lg\:items-end { align-items: flex-end !important; } .lt-lg\:items-center { align-items: center !important; } .lt-lg\:items-baseline { align-items: baseline !important; } .lt-lg\:items-stretch { align-items: stretch !important; } .lt-lg\:self-auto { align-self: auto !important; } .lt-lg\:self-start { align-self: flex-start !important; } .lt-lg\:self-end { align-self: flex-end !important; } .lt-lg\:self-center { align-self: center !important; } .lt-lg\:self-stretch { align-self: stretch !important; } .lt-lg\:justify-start { justify-content: flex-start !important; } .lt-lg\:justify-end { justify-content: flex-end !important; } .lt-lg\:justify-center { justify-content: center !important; } .lt-lg\:justify-between { justify-content: space-between !important; } .lt-lg\:justify-around { justify-content: space-around !important; } .lt-lg\:justify-evenly { justify-content: space-evenly !important; } .lt-lg\:content-center { align-content: center !important; } .lt-lg\:content-start { align-content: flex-start !important; } .lt-lg\:content-end { align-content: flex-end !important; } .lt-lg\:content-between { align-content: space-between !important; } .lt-lg\:content-around { align-content: space-around !important; } .lt-lg\:flex-0 { flex: 0 0 auto !important; } .lt-lg\:flex-1 { flex: 1 1 0% !important; } .lt-lg\:flex-auto { flex: 1 1 auto !important; } .lt-lg\:flex-initial { flex: 0 1 auto !important; } .lt-lg\:flex-none { flex: none !important; } .lt-lg\:flex-grow-0 { flex-grow: 0 !important; } .lt-lg\:flex-grow { flex-grow: 1 !important; } .lt-lg\:flex-shrink-0 { flex-shrink: 0 !important; } .lt-lg\:flex-shrink { flex-shrink: 1 !important; } .lt-lg\:order-1 { order: 1 !important; } .lt-lg\:order-2 { order: 2 !important; } .lt-lg\:order-3 { order: 3 !important; } .lt-lg\:order-4 { order: 4 !important; } .lt-lg\:order-5 { order: 5 !important; } .lt-lg\:order-6 { order: 6 !important; } .lt-lg\:order-7 { order: 7 !important; } .lt-lg\:order-8 { order: 8 !important; } .lt-lg\:order-9 { order: 9 !important; } .lt-lg\:order-10 { order: 10 !important; } .lt-lg\:order-11 { order: 11 !important; } .lt-lg\:order-12 { order: 12 !important; } .lt-lg\:order-first { order: -9999 !important; } .lt-lg\:order-last { order: 9999 !important; } .lt-lg\:order-none { order: 0 !important; } .lt-lg\:font-hairline { font-weight: 100 !important; } .lt-lg\:font-thin { font-weight: 200 !important; } .lt-lg\:font-light { font-weight: 300 !important; } .lt-lg\:font-normal { font-weight: 400 !important; } .lt-lg\:font-medium { font-weight: 500 !important; } .lt-lg\:font-semibold { font-weight: 600 !important; } .lt-lg\:font-bold { font-weight: 700 !important; } .lt-lg\:font-extrabold { font-weight: 800 !important; } .lt-lg\:font-black { font-weight: 900 !important; } .lt-lg\:h-0 { height: 0 !important; } .lt-lg\:h-1 { height: 0.25rem !important; } .lt-lg\:h-2 { height: 0.5rem !important; } .lt-lg\:h-3 { height: 0.75rem !important; } .lt-lg\:h-4 { height: 1rem !important; } .lt-lg\:h-5 { height: 1.25rem !important; } .lt-lg\:h-6 { height: 1.5rem !important; } .lt-lg\:h-8 { height: 2rem !important; } .lt-lg\:h-10 { height: 2.5rem !important; } .lt-lg\:h-12 { height: 3rem !important; } .lt-lg\:h-14 { height: 3.5rem !important; } .lt-lg\:h-16 { height: 4rem !important; } .lt-lg\:h-18 { height: 4.5rem !important; } .lt-lg\:h-20 { height: 5rem !important; } .lt-lg\:h-22 { height: 5.5rem !important; } .lt-lg\:h-24 { height: 6rem !important; } .lt-lg\:h-26 { height: 6.5rem !important; } .lt-lg\:h-28 { height: 7rem !important; } .lt-lg\:h-30 { height: 7.5rem !important; } .lt-lg\:h-32 { height: 8rem !important; } .lt-lg\:h-36 { height: 9rem !important; } .lt-lg\:h-40 { height: 10rem !important; } .lt-lg\:h-48 { height: 12rem !important; } .lt-lg\:h-50 { height: 12.5rem !important; } .lt-lg\:h-56 { height: 14rem !important; } .lt-lg\:h-60 { height: 15rem !important; } .lt-lg\:h-64 { height: 16rem !important; } .lt-lg\:h-80 { height: 20rem !important; } .lt-lg\:h-90 { height: 24rem !important; } .lt-lg\:h-100 { height: 25rem !important; } .lt-lg\:h-120 { height: 30rem !important; } .lt-lg\:h-128 { height: 32rem !important; } .lt-lg\:h-140 { height: 35rem !important; } .lt-lg\:h-160 { height: 40rem !important; } .lt-lg\:h-180 { height: 45rem !important; } .lt-lg\:h-192 { height: 48rem !important; } .lt-lg\:h-200 { height: 50rem !important; } .lt-lg\:h-240 { height: 60rem !important; } .lt-lg\:h-256 { height: 64rem !important; } .lt-lg\:h-280 { height: 70rem !important; } .lt-lg\:h-320 { height: 80rem !important; } .lt-lg\:h-360 { height: 90rem !important; } .lt-lg\:h-400 { height: 100rem !important; } .lt-lg\:h-480 { height: 120rem !important; } .lt-lg\:h-auto { height: auto !important; } .lt-lg\:h-px { height: 1px !important; } .lt-lg\:h-2px { height: 2px !important; } .lt-lg\:h-full { height: 100% !important; } .lt-lg\:h-screen { height: 100vh !important; } .lt-lg\:h-1\/2 { height: 50% !important; } .lt-lg\:h-1\/3 { height: 33.33333% !important; } .lt-lg\:h-2\/3 { height: 66.66667% !important; } .lt-lg\:h-1\/4 { height: 25% !important; } .lt-lg\:h-2\/4 { height: 50% !important; } .lt-lg\:h-3\/4 { height: 75% !important; } .lt-lg\:h-1\/5 { height: 20% !important; } .lt-lg\:h-2\/5 { height: 40% !important; } .lt-lg\:h-3\/5 { height: 60% !important; } .lt-lg\:h-4\/5 { height: 80% !important; } .lt-lg\:h-1\/12 { height: 8.33333% !important; } .lt-lg\:h-2\/12 { height: 16.66667% !important; } .lt-lg\:h-3\/12 { height: 25% !important; } .lt-lg\:h-4\/12 { height: 33.33333% !important; } .lt-lg\:h-5\/12 { height: 41.66667% !important; } .lt-lg\:h-6\/12 { height: 50% !important; } .lt-lg\:h-7\/12 { height: 58.33333% !important; } .lt-lg\:h-8\/12 { height: 66.66667% !important; } .lt-lg\:h-9\/12 { height: 75% !important; } .lt-lg\:h-10\/12 { height: 83.33333% !important; } .lt-lg\:h-11\/12 { height: 91.66667% !important; } .lt-lg\:text-xs { font-size: 0.625rem !important; } .lt-lg\:text-sm { font-size: 0.75rem !important; } .lt-lg\:text-md { font-size: 0.8125rem !important; } .lt-lg\:text-base { font-size: 0.875rem !important; } .lt-lg\:text-lg { font-size: 1rem !important; } .lt-lg\:text-xl { font-size: 1.125rem !important; } .lt-lg\:text-2xl { font-size: 1.25rem !important; } .lt-lg\:text-3xl { font-size: 1.5rem !important; } .lt-lg\:text-4xl { font-size: 2rem !important; } .lt-lg\:text-5xl { font-size: 2.25rem !important; } .lt-lg\:text-6xl { font-size: 2.5rem !important; } .lt-lg\:text-7xl { font-size: 3rem !important; } .lt-lg\:text-8xl { font-size: 4rem !important; } .lt-lg\:text-9xl { font-size: 6rem !important; } .lt-lg\:text-10xl { font-size: 8rem !important; } .lt-lg\:leading-3 { line-height: .75rem !important; } .lt-lg\:leading-4 { line-height: 1rem !important; } .lt-lg\:leading-5 { line-height: 1.25rem !important; } .lt-lg\:leading-6 { line-height: 1.5rem !important; } .lt-lg\:leading-7 { line-height: 1.75rem !important; } .lt-lg\:leading-8 { line-height: 2rem !important; } .lt-lg\:leading-9 { line-height: 2.25rem !important; } .lt-lg\:leading-10 { line-height: 2.5rem !important; } .lt-lg\:leading-none { line-height: 1 !important; } .lt-lg\:leading-tight { line-height: 1.25 !important; } .lt-lg\:leading-snug { line-height: 1.375 !important; } .lt-lg\:leading-normal { line-height: 1.5 !important; } .lt-lg\:leading-relaxed { line-height: 1.625 !important; } .lt-lg\:leading-loose { line-height: 2 !important; } .lt-lg\:list-inside { list-style-position: inside !important; } .lt-lg\:list-outside { list-style-position: outside !important; } .lt-lg\:list-none { list-style-type: none !important; } .lt-lg\:list-disc { list-style-type: disc !important; } .lt-lg\:list-decimal { list-style-type: decimal !important; } .lt-lg\:m-0 { margin: 0 !important; } .lt-lg\:m-1 { margin: 0.25rem !important; } .lt-lg\:m-2 { margin: 0.5rem !important; } .lt-lg\:m-3 { margin: 0.75rem !important; } .lt-lg\:m-4 { margin: 1rem !important; } .lt-lg\:m-5 { margin: 1.25rem !important; } .lt-lg\:m-6 { margin: 1.5rem !important; } .lt-lg\:m-8 { margin: 2rem !important; } .lt-lg\:m-10 { margin: 2.5rem !important; } .lt-lg\:m-12 { margin: 3rem !important; } .lt-lg\:m-14 { margin: 3.5rem !important; } .lt-lg\:m-16 { margin: 4rem !important; } .lt-lg\:m-18 { margin: 4.5rem !important; } .lt-lg\:m-20 { margin: 5rem !important; } .lt-lg\:m-22 { margin: 5.5rem !important; } .lt-lg\:m-24 { margin: 6rem !important; } .lt-lg\:m-26 { margin: 6.5rem !important; } .lt-lg\:m-28 { margin: 7rem !important; } .lt-lg\:m-30 { margin: 7.5rem !important; } .lt-lg\:m-32 { margin: 8rem !important; } .lt-lg\:m-36 { margin: 9rem !important; } .lt-lg\:m-40 { margin: 10rem !important; } .lt-lg\:m-48 { margin: 12rem !important; } .lt-lg\:m-56 { margin: 14rem !important; } .lt-lg\:m-64 { margin: 16rem !important; } .lt-lg\:m-auto { margin: auto !important; } .lt-lg\:m-px { margin: 1px !important; } .lt-lg\:m-2px { margin: 2px !important; } .lt-lg\:-m-1 { margin: -0.25rem !important; } .lt-lg\:-m-2 { margin: -0.5rem !important; } .lt-lg\:-m-3 { margin: -0.75rem !important; } .lt-lg\:-m-4 { margin: -1rem !important; } .lt-lg\:-m-5 { margin: -1.25rem !important; } .lt-lg\:-m-6 { margin: -1.5rem !important; } .lt-lg\:-m-8 { margin: -2rem !important; } .lt-lg\:-m-10 { margin: -2.5rem !important; } .lt-lg\:-m-12 { margin: -3rem !important; } .lt-lg\:-m-14 { margin: -3.5rem !important; } .lt-lg\:-m-16 { margin: -4rem !important; } .lt-lg\:-m-18 { margin: -4.5rem !important; } .lt-lg\:-m-20 { margin: -5rem !important; } .lt-lg\:-m-22 { margin: -5.5rem !important; } .lt-lg\:-m-24 { margin: -6rem !important; } .lt-lg\:-m-26 { margin: -6.5rem !important; } .lt-lg\:-m-28 { margin: -7rem !important; } .lt-lg\:-m-30 { margin: -7.5rem !important; } .lt-lg\:-m-32 { margin: -8rem !important; } .lt-lg\:-m-36 { margin: -9rem !important; } .lt-lg\:-m-40 { margin: -10rem !important; } .lt-lg\:-m-48 { margin: -12rem !important; } .lt-lg\:-m-56 { margin: -14rem !important; } .lt-lg\:-m-64 { margin: -16rem !important; } .lt-lg\:-m-px { margin: -1px !important; } .lt-lg\:-m-2px { margin: -2px !important; } .lt-lg\:my-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .lt-lg\:mx-0 { margin-left: 0 !important; margin-right: 0 !important; } .lt-lg\:my-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .lt-lg\:mx-1 { margin-left: 0.25rem !important; margin-right: 0.25rem !important; } .lt-lg\:my-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .lt-lg\:mx-2 { margin-left: 0.5rem !important; margin-right: 0.5rem !important; } .lt-lg\:my-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .lt-lg\:mx-3 { margin-left: 0.75rem !important; margin-right: 0.75rem !important; } .lt-lg\:my-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .lt-lg\:mx-4 { margin-left: 1rem !important; margin-right: 1rem !important; } .lt-lg\:my-5 { margin-top: 1.25rem !important; margin-bottom: 1.25rem !important; } .lt-lg\:mx-5 { margin-left: 1.25rem !important; margin-right: 1.25rem !important; } .lt-lg\:my-6 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .lt-lg\:mx-6 { margin-left: 1.5rem !important; margin-right: 1.5rem !important; } .lt-lg\:my-8 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .lt-lg\:mx-8 { margin-left: 2rem !important; margin-right: 2rem !important; } .lt-lg\:my-10 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .lt-lg\:mx-10 { margin-left: 2.5rem !important; margin-right: 2.5rem !important; } .lt-lg\:my-12 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .lt-lg\:mx-12 { margin-left: 3rem !important; margin-right: 3rem !important; } .lt-lg\:my-14 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .lt-lg\:mx-14 { margin-left: 3.5rem !important; margin-right: 3.5rem !important; } .lt-lg\:my-16 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .lt-lg\:mx-16 { margin-left: 4rem !important; margin-right: 4rem !important; } .lt-lg\:my-18 { margin-top: 4.5rem !important; margin-bottom: 4.5rem !important; } .lt-lg\:mx-18 { margin-left: 4.5rem !important; margin-right: 4.5rem !important; } .lt-lg\:my-20 { margin-top: 5rem !important; margin-bottom: 5rem !important; } .lt-lg\:mx-20 { margin-left: 5rem !important; margin-right: 5rem !important; } .lt-lg\:my-22 { margin-top: 5.5rem !important; margin-bottom: 5.5rem !important; } .lt-lg\:mx-22 { margin-left: 5.5rem !important; margin-right: 5.5rem !important; } .lt-lg\:my-24 { margin-top: 6rem !important; margin-bottom: 6rem !important; } .lt-lg\:mx-24 { margin-left: 6rem !important; margin-right: 6rem !important; } .lt-lg\:my-26 { margin-top: 6.5rem !important; margin-bottom: 6.5rem !important; } .lt-lg\:mx-26 { margin-left: 6.5rem !important; margin-right: 6.5rem !important; } .lt-lg\:my-28 { margin-top: 7rem !important; margin-bottom: 7rem !important; } .lt-lg\:mx-28 { margin-left: 7rem !important; margin-right: 7rem !important; } .lt-lg\:my-30 { margin-top: 7.5rem !important; margin-bottom: 7.5rem !important; } .lt-lg\:mx-30 { margin-left: 7.5rem !important; margin-right: 7.5rem !important; } .lt-lg\:my-32 { margin-top: 8rem !important; margin-bottom: 8rem !important; } .lt-lg\:mx-32 { margin-left: 8rem !important; margin-right: 8rem !important; } .lt-lg\:my-36 { margin-top: 9rem !important; margin-bottom: 9rem !important; } .lt-lg\:mx-36 { margin-left: 9rem !important; margin-right: 9rem !important; } .lt-lg\:my-40 { margin-top: 10rem !important; margin-bottom: 10rem !important; } .lt-lg\:mx-40 { margin-left: 10rem !important; margin-right: 10rem !important; } .lt-lg\:my-48 { margin-top: 12rem !important; margin-bottom: 12rem !important; } .lt-lg\:mx-48 { margin-left: 12rem !important; margin-right: 12rem !important; } .lt-lg\:my-56 { margin-top: 14rem !important; margin-bottom: 14rem !important; } .lt-lg\:mx-56 { margin-left: 14rem !important; margin-right: 14rem !important; } .lt-lg\:my-64 { margin-top: 16rem !important; margin-bottom: 16rem !important; } .lt-lg\:mx-64 { margin-left: 16rem !important; margin-right: 16rem !important; } .lt-lg\:my-auto { margin-top: auto !important; margin-bottom: auto !important; } .lt-lg\:mx-auto { margin-left: auto !important; margin-right: auto !important; } .lt-lg\:my-px { margin-top: 1px !important; margin-bottom: 1px !important; } .lt-lg\:mx-px { margin-left: 1px !important; margin-right: 1px !important; } .lt-lg\:my-2px { margin-top: 2px !important; margin-bottom: 2px !important; } .lt-lg\:mx-2px { margin-left: 2px !important; margin-right: 2px !important; } .lt-lg\:-my-1 { margin-top: -0.25rem !important; margin-bottom: -0.25rem !important; } .lt-lg\:-mx-1 { margin-left: -0.25rem !important; margin-right: -0.25rem !important; } .lt-lg\:-my-2 { margin-top: -0.5rem !important; margin-bottom: -0.5rem !important; } .lt-lg\:-mx-2 { margin-left: -0.5rem !important; margin-right: -0.5rem !important; } .lt-lg\:-my-3 { margin-top: -0.75rem !important; margin-bottom: -0.75rem !important; } .lt-lg\:-mx-3 { margin-left: -0.75rem !important; margin-right: -0.75rem !important; } .lt-lg\:-my-4 { margin-top: -1rem !important; margin-bottom: -1rem !important; } .lt-lg\:-mx-4 { margin-left: -1rem !important; margin-right: -1rem !important; } .lt-lg\:-my-5 { margin-top: -1.25rem !important; margin-bottom: -1.25rem !important; } .lt-lg\:-mx-5 { margin-left: -1.25rem !important; margin-right: -1.25rem !important; } .lt-lg\:-my-6 { margin-top: -1.5rem !important; margin-bottom: -1.5rem !important; } .lt-lg\:-mx-6 { margin-left: -1.5rem !important; margin-right: -1.5rem !important; } .lt-lg\:-my-8 { margin-top: -2rem !important; margin-bottom: -2rem !important; } .lt-lg\:-mx-8 { margin-left: -2rem !important; margin-right: -2rem !important; } .lt-lg\:-my-10 { margin-top: -2.5rem !important; margin-bottom: -2.5rem !important; } .lt-lg\:-mx-10 { margin-left: -2.5rem !important; margin-right: -2.5rem !important; } .lt-lg\:-my-12 { margin-top: -3rem !important; margin-bottom: -3rem !important; } .lt-lg\:-mx-12 { margin-left: -3rem !important; margin-right: -3rem !important; } .lt-lg\:-my-14 { margin-top: -3.5rem !important; margin-bottom: -3.5rem !important; } .lt-lg\:-mx-14 { margin-left: -3.5rem !important; margin-right: -3.5rem !important; } .lt-lg\:-my-16 { margin-top: -4rem !important; margin-bottom: -4rem !important; } .lt-lg\:-mx-16 { margin-left: -4rem !important; margin-right: -4rem !important; } .lt-lg\:-my-18 { margin-top: -4.5rem !important; margin-bottom: -4.5rem !important; } .lt-lg\:-mx-18 { margin-left: -4.5rem !important; margin-right: -4.5rem !important; } .lt-lg\:-my-20 { margin-top: -5rem !important; margin-bottom: -5rem !important; } .lt-lg\:-mx-20 { margin-left: -5rem !important; margin-right: -5rem !important; } .lt-lg\:-my-22 { margin-top: -5.5rem !important; margin-bottom: -5.5rem !important; } .lt-lg\:-mx-22 { margin-left: -5.5rem !important; margin-right: -5.5rem !important; } .lt-lg\:-my-24 { margin-top: -6rem !important; margin-bottom: -6rem !important; } .lt-lg\:-mx-24 { margin-left: -6rem !important; margin-right: -6rem !important; } .lt-lg\:-my-26 { margin-top: -6.5rem !important; margin-bottom: -6.5rem !important; } .lt-lg\:-mx-26 { margin-left: -6.5rem !important; margin-right: -6.5rem !important; } .lt-lg\:-my-28 { margin-top: -7rem !important; margin-bottom: -7rem !important; } .lt-lg\:-mx-28 { margin-left: -7rem !important; margin-right: -7rem !important; } .lt-lg\:-my-30 { margin-top: -7.5rem !important; margin-bottom: -7.5rem !important; } .lt-lg\:-mx-30 { margin-left: -7.5rem !important; margin-right: -7.5rem !important; } .lt-lg\:-my-32 { margin-top: -8rem !important; margin-bottom: -8rem !important; } .lt-lg\:-mx-32 { margin-left: -8rem !important; margin-right: -8rem !important; } .lt-lg\:-my-36 { margin-top: -9rem !important; margin-bottom: -9rem !important; } .lt-lg\:-mx-36 { margin-left: -9rem !important; margin-right: -9rem !important; } .lt-lg\:-my-40 { margin-top: -10rem !important; margin-bottom: -10rem !important; } .lt-lg\:-mx-40 { margin-left: -10rem !important; margin-right: -10rem !important; } .lt-lg\:-my-48 { margin-top: -12rem !important; margin-bottom: -12rem !important; } .lt-lg\:-mx-48 { margin-left: -12rem !important; margin-right: -12rem !important; } .lt-lg\:-my-56 { margin-top: -14rem !important; margin-bottom: -14rem !important; } .lt-lg\:-mx-56 { margin-left: -14rem !important; margin-right: -14rem !important; } .lt-lg\:-my-64 { margin-top: -16rem !important; margin-bottom: -16rem !important; } .lt-lg\:-mx-64 { margin-left: -16rem !important; margin-right: -16rem !important; } .lt-lg\:-my-px { margin-top: -1px !important; margin-bottom: -1px !important; } .lt-lg\:-mx-px { margin-left: -1px !important; margin-right: -1px !important; } .lt-lg\:-my-2px { margin-top: -2px !important; margin-bottom: -2px !important; } .lt-lg\:-mx-2px { margin-left: -2px !important; margin-right: -2px !important; } .lt-lg\:mt-0 { margin-top: 0 !important; } .lt-lg\:mr-0 { margin-right: 0 !important; } .lt-lg\:mb-0 { margin-bottom: 0 !important; } .lt-lg\:ml-0 { margin-left: 0 !important; } .lt-lg\:mt-1 { margin-top: 0.25rem !important; } .lt-lg\:mr-1 { margin-right: 0.25rem !important; } .lt-lg\:mb-1 { margin-bottom: 0.25rem !important; } .lt-lg\:ml-1 { margin-left: 0.25rem !important; } .lt-lg\:mt-2 { margin-top: 0.5rem !important; } .lt-lg\:mr-2 { margin-right: 0.5rem !important; } .lt-lg\:mb-2 { margin-bottom: 0.5rem !important; } .lt-lg\:ml-2 { margin-left: 0.5rem !important; } .lt-lg\:mt-3 { margin-top: 0.75rem !important; } .lt-lg\:mr-3 { margin-right: 0.75rem !important; } .lt-lg\:mb-3 { margin-bottom: 0.75rem !important; } .lt-lg\:ml-3 { margin-left: 0.75rem !important; } .lt-lg\:mt-4 { margin-top: 1rem !important; } .lt-lg\:mr-4 { margin-right: 1rem !important; } .lt-lg\:mb-4 { margin-bottom: 1rem !important; } .lt-lg\:ml-4 { margin-left: 1rem !important; } .lt-lg\:mt-5 { margin-top: 1.25rem !important; } .lt-lg\:mr-5 { margin-right: 1.25rem !important; } .lt-lg\:mb-5 { margin-bottom: 1.25rem !important; } .lt-lg\:ml-5 { margin-left: 1.25rem !important; } .lt-lg\:mt-6 { margin-top: 1.5rem !important; } .lt-lg\:mr-6 { margin-right: 1.5rem !important; } .lt-lg\:mb-6 { margin-bottom: 1.5rem !important; } .lt-lg\:ml-6 { margin-left: 1.5rem !important; } .lt-lg\:mt-8 { margin-top: 2rem !important; } .lt-lg\:mr-8 { margin-right: 2rem !important; } .lt-lg\:mb-8 { margin-bottom: 2rem !important; } .lt-lg\:ml-8 { margin-left: 2rem !important; } .lt-lg\:mt-10 { margin-top: 2.5rem !important; } .lt-lg\:mr-10 { margin-right: 2.5rem !important; } .lt-lg\:mb-10 { margin-bottom: 2.5rem !important; } .lt-lg\:ml-10 { margin-left: 2.5rem !important; } .lt-lg\:mt-12 { margin-top: 3rem !important; } .lt-lg\:mr-12 { margin-right: 3rem !important; } .lt-lg\:mb-12 { margin-bottom: 3rem !important; } .lt-lg\:ml-12 { margin-left: 3rem !important; } .lt-lg\:mt-14 { margin-top: 3.5rem !important; } .lt-lg\:mr-14 { margin-right: 3.5rem !important; } .lt-lg\:mb-14 { margin-bottom: 3.5rem !important; } .lt-lg\:ml-14 { margin-left: 3.5rem !important; } .lt-lg\:mt-16 { margin-top: 4rem !important; } .lt-lg\:mr-16 { margin-right: 4rem !important; } .lt-lg\:mb-16 { margin-bottom: 4rem !important; } .lt-lg\:ml-16 { margin-left: 4rem !important; } .lt-lg\:mt-18 { margin-top: 4.5rem !important; } .lt-lg\:mr-18 { margin-right: 4.5rem !important; } .lt-lg\:mb-18 { margin-bottom: 4.5rem !important; } .lt-lg\:ml-18 { margin-left: 4.5rem !important; } .lt-lg\:mt-20 { margin-top: 5rem !important; } .lt-lg\:mr-20 { margin-right: 5rem !important; } .lt-lg\:mb-20 { margin-bottom: 5rem !important; } .lt-lg\:ml-20 { margin-left: 5rem !important; } .lt-lg\:mt-22 { margin-top: 5.5rem !important; } .lt-lg\:mr-22 { margin-right: 5.5rem !important; } .lt-lg\:mb-22 { margin-bottom: 5.5rem !important; } .lt-lg\:ml-22 { margin-left: 5.5rem !important; } .lt-lg\:mt-24 { margin-top: 6rem !important; } .lt-lg\:mr-24 { margin-right: 6rem !important; } .lt-lg\:mb-24 { margin-bottom: 6rem !important; } .lt-lg\:ml-24 { margin-left: 6rem !important; } .lt-lg\:mt-26 { margin-top: 6.5rem !important; } .lt-lg\:mr-26 { margin-right: 6.5rem !important; } .lt-lg\:mb-26 { margin-bottom: 6.5rem !important; } .lt-lg\:ml-26 { margin-left: 6.5rem !important; } .lt-lg\:mt-28 { margin-top: 7rem !important; } .lt-lg\:mr-28 { margin-right: 7rem !important; } .lt-lg\:mb-28 { margin-bottom: 7rem !important; } .lt-lg\:ml-28 { margin-left: 7rem !important; } .lt-lg\:mt-30 { margin-top: 7.5rem !important; } .lt-lg\:mr-30 { margin-right: 7.5rem !important; } .lt-lg\:mb-30 { margin-bottom: 7.5rem !important; } .lt-lg\:ml-30 { margin-left: 7.5rem !important; } .lt-lg\:mt-32 { margin-top: 8rem !important; } .lt-lg\:mr-32 { margin-right: 8rem !important; } .lt-lg\:mb-32 { margin-bottom: 8rem !important; } .lt-lg\:ml-32 { margin-left: 8rem !important; } .lt-lg\:mt-36 { margin-top: 9rem !important; } .lt-lg\:mr-36 { margin-right: 9rem !important; } .lt-lg\:mb-36 { margin-bottom: 9rem !important; } .lt-lg\:ml-36 { margin-left: 9rem !important; } .lt-lg\:mt-40 { margin-top: 10rem !important; } .lt-lg\:mr-40 { margin-right: 10rem !important; } .lt-lg\:mb-40 { margin-bottom: 10rem !important; } .lt-lg\:ml-40 { margin-left: 10rem !important; } .lt-lg\:mt-48 { margin-top: 12rem !important; } .lt-lg\:mr-48 { margin-right: 12rem !important; } .lt-lg\:mb-48 { margin-bottom: 12rem !important; } .lt-lg\:ml-48 { margin-left: 12rem !important; } .lt-lg\:mt-56 { margin-top: 14rem !important; } .lt-lg\:mr-56 { margin-right: 14rem !important; } .lt-lg\:mb-56 { margin-bottom: 14rem !important; } .lt-lg\:ml-56 { margin-left: 14rem !important; } .lt-lg\:mt-64 { margin-top: 16rem !important; } .lt-lg\:mr-64 { margin-right: 16rem !important; } .lt-lg\:mb-64 { margin-bottom: 16rem !important; } .lt-lg\:ml-64 { margin-left: 16rem !important; } .lt-lg\:mt-auto { margin-top: auto !important; } .lt-lg\:mr-auto { margin-right: auto !important; } .lt-lg\:mb-auto { margin-bottom: auto !important; } .lt-lg\:ml-auto { margin-left: auto !important; } .lt-lg\:mt-px { margin-top: 1px !important; } .lt-lg\:mr-px { margin-right: 1px !important; } .lt-lg\:mb-px { margin-bottom: 1px !important; } .lt-lg\:ml-px { margin-left: 1px !important; } .lt-lg\:mt-2px { margin-top: 2px !important; } .lt-lg\:mr-2px { margin-right: 2px !important; } .lt-lg\:mb-2px { margin-bottom: 2px !important; } .lt-lg\:ml-2px { margin-left: 2px !important; } .lt-lg\:-mt-1 { margin-top: -0.25rem !important; } .lt-lg\:-mr-1 { margin-right: -0.25rem !important; } .lt-lg\:-mb-1 { margin-bottom: -0.25rem !important; } .lt-lg\:-ml-1 { margin-left: -0.25rem !important; } .lt-lg\:-mt-2 { margin-top: -0.5rem !important; } .lt-lg\:-mr-2 { margin-right: -0.5rem !important; } .lt-lg\:-mb-2 { margin-bottom: -0.5rem !important; } .lt-lg\:-ml-2 { margin-left: -0.5rem !important; } .lt-lg\:-mt-3 { margin-top: -0.75rem !important; } .lt-lg\:-mr-3 { margin-right: -0.75rem !important; } .lt-lg\:-mb-3 { margin-bottom: -0.75rem !important; } .lt-lg\:-ml-3 { margin-left: -0.75rem !important; } .lt-lg\:-mt-4 { margin-top: -1rem !important; } .lt-lg\:-mr-4 { margin-right: -1rem !important; } .lt-lg\:-mb-4 { margin-bottom: -1rem !important; } .lt-lg\:-ml-4 { margin-left: -1rem !important; } .lt-lg\:-mt-5 { margin-top: -1.25rem !important; } .lt-lg\:-mr-5 { margin-right: -1.25rem !important; } .lt-lg\:-mb-5 { margin-bottom: -1.25rem !important; } .lt-lg\:-ml-5 { margin-left: -1.25rem !important; } .lt-lg\:-mt-6 { margin-top: -1.5rem !important; } .lt-lg\:-mr-6 { margin-right: -1.5rem !important; } .lt-lg\:-mb-6 { margin-bottom: -1.5rem !important; } .lt-lg\:-ml-6 { margin-left: -1.5rem !important; } .lt-lg\:-mt-8 { margin-top: -2rem !important; } .lt-lg\:-mr-8 { margin-right: -2rem !important; } .lt-lg\:-mb-8 { margin-bottom: -2rem !important; } .lt-lg\:-ml-8 { margin-left: -2rem !important; } .lt-lg\:-mt-10 { margin-top: -2.5rem !important; } .lt-lg\:-mr-10 { margin-right: -2.5rem !important; } .lt-lg\:-mb-10 { margin-bottom: -2.5rem !important; } .lt-lg\:-ml-10 { margin-left: -2.5rem !important; } .lt-lg\:-mt-12 { margin-top: -3rem !important; } .lt-lg\:-mr-12 { margin-right: -3rem !important; } .lt-lg\:-mb-12 { margin-bottom: -3rem !important; } .lt-lg\:-ml-12 { margin-left: -3rem !important; } .lt-lg\:-mt-14 { margin-top: -3.5rem !important; } .lt-lg\:-mr-14 { margin-right: -3.5rem !important; } .lt-lg\:-mb-14 { margin-bottom: -3.5rem !important; } .lt-lg\:-ml-14 { margin-left: -3.5rem !important; } .lt-lg\:-mt-16 { margin-top: -4rem !important; } .lt-lg\:-mr-16 { margin-right: -4rem !important; } .lt-lg\:-mb-16 { margin-bottom: -4rem !important; } .lt-lg\:-ml-16 { margin-left: -4rem !important; } .lt-lg\:-mt-18 { margin-top: -4.5rem !important; } .lt-lg\:-mr-18 { margin-right: -4.5rem !important; } .lt-lg\:-mb-18 { margin-bottom: -4.5rem !important; } .lt-lg\:-ml-18 { margin-left: -4.5rem !important; } .lt-lg\:-mt-20 { margin-top: -5rem !important; } .lt-lg\:-mr-20 { margin-right: -5rem !important; } .lt-lg\:-mb-20 { margin-bottom: -5rem !important; } .lt-lg\:-ml-20 { margin-left: -5rem !important; } .lt-lg\:-mt-22 { margin-top: -5.5rem !important; } .lt-lg\:-mr-22 { margin-right: -5.5rem !important; } .lt-lg\:-mb-22 { margin-bottom: -5.5rem !important; } .lt-lg\:-ml-22 { margin-left: -5.5rem !important; } .lt-lg\:-mt-24 { margin-top: -6rem !important; } .lt-lg\:-mr-24 { margin-right: -6rem !important; } .lt-lg\:-mb-24 { margin-bottom: -6rem !important; } .lt-lg\:-ml-24 { margin-left: -6rem !important; } .lt-lg\:-mt-26 { margin-top: -6.5rem !important; } .lt-lg\:-mr-26 { margin-right: -6.5rem !important; } .lt-lg\:-mb-26 { margin-bottom: -6.5rem !important; } .lt-lg\:-ml-26 { margin-left: -6.5rem !important; } .lt-lg\:-mt-28 { margin-top: -7rem !important; } .lt-lg\:-mr-28 { margin-right: -7rem !important; } .lt-lg\:-mb-28 { margin-bottom: -7rem !important; } .lt-lg\:-ml-28 { margin-left: -7rem !important; } .lt-lg\:-mt-30 { margin-top: -7.5rem !important; } .lt-lg\:-mr-30 { margin-right: -7.5rem !important; } .lt-lg\:-mb-30 { margin-bottom: -7.5rem !important; } .lt-lg\:-ml-30 { margin-left: -7.5rem !important; } .lt-lg\:-mt-32 { margin-top: -8rem !important; } .lt-lg\:-mr-32 { margin-right: -8rem !important; } .lt-lg\:-mb-32 { margin-bottom: -8rem !important; } .lt-lg\:-ml-32 { margin-left: -8rem !important; } .lt-lg\:-mt-36 { margin-top: -9rem !important; } .lt-lg\:-mr-36 { margin-right: -9rem !important; } .lt-lg\:-mb-36 { margin-bottom: -9rem !important; } .lt-lg\:-ml-36 { margin-left: -9rem !important; } .lt-lg\:-mt-40 { margin-top: -10rem !important; } .lt-lg\:-mr-40 { margin-right: -10rem !important; } .lt-lg\:-mb-40 { margin-bottom: -10rem !important; } .lt-lg\:-ml-40 { margin-left: -10rem !important; } .lt-lg\:-mt-48 { margin-top: -12rem !important; } .lt-lg\:-mr-48 { margin-right: -12rem !important; } .lt-lg\:-mb-48 { margin-bottom: -12rem !important; } .lt-lg\:-ml-48 { margin-left: -12rem !important; } .lt-lg\:-mt-56 { margin-top: -14rem !important; } .lt-lg\:-mr-56 { margin-right: -14rem !important; } .lt-lg\:-mb-56 { margin-bottom: -14rem !important; } .lt-lg\:-ml-56 { margin-left: -14rem !important; } .lt-lg\:-mt-64 { margin-top: -16rem !important; } .lt-lg\:-mr-64 { margin-right: -16rem !important; } .lt-lg\:-mb-64 { margin-bottom: -16rem !important; } .lt-lg\:-ml-64 { margin-left: -16rem !important; } .lt-lg\:-mt-px { margin-top: -1px !important; } .lt-lg\:-mr-px { margin-right: -1px !important; } .lt-lg\:-mb-px { margin-bottom: -1px !important; } .lt-lg\:-ml-px { margin-left: -1px !important; } .lt-lg\:-mt-2px { margin-top: -2px !important; } .lt-lg\:-mr-2px { margin-right: -2px !important; } .lt-lg\:-mb-2px { margin-bottom: -2px !important; } .lt-lg\:-ml-2px { margin-left: -2px !important; } .lt-lg\:max-h-0 { max-height: 0 !important; } .lt-lg\:max-h-1 { max-height: 0.25rem !important; } .lt-lg\:max-h-2 { max-height: 0.5rem !important; } .lt-lg\:max-h-3 { max-height: 0.75rem !important; } .lt-lg\:max-h-4 { max-height: 1rem !important; } .lt-lg\:max-h-5 { max-height: 1.25rem !important; } .lt-lg\:max-h-6 { max-height: 1.5rem !important; } .lt-lg\:max-h-8 { max-height: 2rem !important; } .lt-lg\:max-h-10 { max-height: 2.5rem !important; } .lt-lg\:max-h-12 { max-height: 3rem !important; } .lt-lg\:max-h-14 { max-height: 3.5rem !important; } .lt-lg\:max-h-16 { max-height: 4rem !important; } .lt-lg\:max-h-18 { max-height: 4.5rem !important; } .lt-lg\:max-h-20 { max-height: 5rem !important; } .lt-lg\:max-h-22 { max-height: 5.5rem !important; } .lt-lg\:max-h-24 { max-height: 6rem !important; } .lt-lg\:max-h-26 { max-height: 6.5rem !important; } .lt-lg\:max-h-28 { max-height: 7rem !important; } .lt-lg\:max-h-30 { max-height: 7.5rem !important; } .lt-lg\:max-h-32 { max-height: 8rem !important; } .lt-lg\:max-h-36 { max-height: 9rem !important; } .lt-lg\:max-h-40 { max-height: 10rem !important; } .lt-lg\:max-h-48 { max-height: 12rem !important; } .lt-lg\:max-h-50 { max-height: 12.5rem !important; } .lt-lg\:max-h-56 { max-height: 14rem !important; } .lt-lg\:max-h-60 { max-height: 15rem !important; } .lt-lg\:max-h-64 { max-height: 16rem !important; } .lt-lg\:max-h-80 { max-height: 20rem !important; } .lt-lg\:max-h-90 { max-height: 24rem !important; } .lt-lg\:max-h-100 { max-height: 25rem !important; } .lt-lg\:max-h-120 { max-height: 30rem !important; } .lt-lg\:max-h-128 { max-height: 32rem !important; } .lt-lg\:max-h-140 { max-height: 35rem !important; } .lt-lg\:max-h-160 { max-height: 40rem !important; } .lt-lg\:max-h-180 { max-height: 45rem !important; } .lt-lg\:max-h-192 { max-height: 48rem !important; } .lt-lg\:max-h-200 { max-height: 50rem !important; } .lt-lg\:max-h-240 { max-height: 60rem !important; } .lt-lg\:max-h-256 { max-height: 64rem !important; } .lt-lg\:max-h-280 { max-height: 70rem !important; } .lt-lg\:max-h-320 { max-height: 80rem !important; } .lt-lg\:max-h-360 { max-height: 90rem !important; } .lt-lg\:max-h-400 { max-height: 100rem !important; } .lt-lg\:max-h-480 { max-height: 120rem !important; } .lt-lg\:max-h-full { max-height: 100% !important; } .lt-lg\:max-h-screen { max-height: 100vh !important; } .lt-lg\:max-h-none { max-height: none !important; } .lt-lg\:max-h-px { max-height: 1px !important; } .lt-lg\:max-h-2px { max-height: 2px !important; } .lt-lg\:max-h-1\/2 { max-height: 50% !important; } .lt-lg\:max-h-1\/3 { max-height: 33.33333% !important; } .lt-lg\:max-h-2\/3 { max-height: 66.66667% !important; } .lt-lg\:max-h-1\/4 { max-height: 25% !important; } .lt-lg\:max-h-2\/4 { max-height: 50% !important; } .lt-lg\:max-h-3\/4 { max-height: 75% !important; } .lt-lg\:max-h-1\/5 { max-height: 20% !important; } .lt-lg\:max-h-2\/5 { max-height: 40% !important; } .lt-lg\:max-h-3\/5 { max-height: 60% !important; } .lt-lg\:max-h-4\/5 { max-height: 80% !important; } .lt-lg\:max-h-1\/12 { max-height: 8.33333% !important; } .lt-lg\:max-h-2\/12 { max-height: 16.66667% !important; } .lt-lg\:max-h-3\/12 { max-height: 25% !important; } .lt-lg\:max-h-4\/12 { max-height: 33.33333% !important; } .lt-lg\:max-h-5\/12 { max-height: 41.66667% !important; } .lt-lg\:max-h-6\/12 { max-height: 50% !important; } .lt-lg\:max-h-7\/12 { max-height: 58.33333% !important; } .lt-lg\:max-h-8\/12 { max-height: 66.66667% !important; } .lt-lg\:max-h-9\/12 { max-height: 75% !important; } .lt-lg\:max-h-10\/12 { max-height: 83.33333% !important; } .lt-lg\:max-h-11\/12 { max-height: 91.66667% !important; } .lt-lg\:max-w-0 { max-width: 0 !important; } .lt-lg\:max-w-1 { max-width: 0.25rem !important; } .lt-lg\:max-w-2 { max-width: 0.5rem !important; } .lt-lg\:max-w-3 { max-width: 0.75rem !important; } .lt-lg\:max-w-4 { max-width: 1rem !important; } .lt-lg\:max-w-5 { max-width: 1.25rem !important; } .lt-lg\:max-w-6 { max-width: 1.5rem !important; } .lt-lg\:max-w-8 { max-width: 2rem !important; } .lt-lg\:max-w-10 { max-width: 2.5rem !important; } .lt-lg\:max-w-12 { max-width: 3rem !important; } .lt-lg\:max-w-14 { max-width: 3.5rem !important; } .lt-lg\:max-w-16 { max-width: 4rem !important; } .lt-lg\:max-w-18 { max-width: 4.5rem !important; } .lt-lg\:max-w-20 { max-width: 5rem !important; } .lt-lg\:max-w-22 { max-width: 5.5rem !important; } .lt-lg\:max-w-24 { max-width: 6rem !important; } .lt-lg\:max-w-26 { max-width: 6.5rem !important; } .lt-lg\:max-w-28 { max-width: 7rem !important; } .lt-lg\:max-w-30 { max-width: 7.5rem !important; } .lt-lg\:max-w-32 { max-width: 8rem !important; } .lt-lg\:max-w-36 { max-width: 9rem !important; } .lt-lg\:max-w-40 { max-width: 10rem !important; } .lt-lg\:max-w-48 { max-width: 12rem !important; } .lt-lg\:max-w-50 { max-width: 12.5rem !important; } .lt-lg\:max-w-56 { max-width: 14rem !important; } .lt-lg\:max-w-60 { max-width: 15rem !important; } .lt-lg\:max-w-64 { max-width: 16rem !important; } .lt-lg\:max-w-80 { max-width: 20rem !important; } .lt-lg\:max-w-90 { max-width: 24rem !important; } .lt-lg\:max-w-100 { max-width: 25rem !important; } .lt-lg\:max-w-120 { max-width: 30rem !important; } .lt-lg\:max-w-128 { max-width: 32rem !important; } .lt-lg\:max-w-140 { max-width: 35rem !important; } .lt-lg\:max-w-160 { max-width: 40rem !important; } .lt-lg\:max-w-180 { max-width: 45rem !important; } .lt-lg\:max-w-192 { max-width: 48rem !important; } .lt-lg\:max-w-200 { max-width: 50rem !important; } .lt-lg\:max-w-240 { max-width: 60rem !important; } .lt-lg\:max-w-256 { max-width: 64rem !important; } .lt-lg\:max-w-280 { max-width: 70rem !important; } .lt-lg\:max-w-320 { max-width: 80rem !important; } .lt-lg\:max-w-360 { max-width: 90rem !important; } .lt-lg\:max-w-400 { max-width: 100rem !important; } .lt-lg\:max-w-480 { max-width: 120rem !important; } .lt-lg\:max-w-none { max-width: none !important; } .lt-lg\:max-w-xs { max-width: 20rem !important; } .lt-lg\:max-w-sm { max-width: 24rem !important; } .lt-lg\:max-w-md { max-width: 28rem !important; } .lt-lg\:max-w-lg { max-width: 32rem !important; } .lt-lg\:max-w-xl { max-width: 36rem !important; } .lt-lg\:max-w-2xl { max-width: 42rem !important; } .lt-lg\:max-w-3xl { max-width: 48rem !important; } .lt-lg\:max-w-4xl { max-width: 56rem !important; } .lt-lg\:max-w-5xl { max-width: 64rem !important; } .lt-lg\:max-w-6xl { max-width: 72rem !important; } .lt-lg\:max-w-full { max-width: 100% !important; } .lt-lg\:max-w-screen { max-width: 100vw !important; } .lt-lg\:max-w-px { max-width: 1px !important; } .lt-lg\:max-w-2px { max-width: 2px !important; } .lt-lg\:max-w-1\/2 { max-width: 50% !important; } .lt-lg\:max-w-1\/3 { max-width: 33.33333% !important; } .lt-lg\:max-w-2\/3 { max-width: 66.66667% !important; } .lt-lg\:max-w-1\/4 { max-width: 25% !important; } .lt-lg\:max-w-2\/4 { max-width: 50% !important; } .lt-lg\:max-w-3\/4 { max-width: 75% !important; } .lt-lg\:max-w-1\/5 { max-width: 20% !important; } .lt-lg\:max-w-2\/5 { max-width: 40% !important; } .lt-lg\:max-w-3\/5 { max-width: 60% !important; } .lt-lg\:max-w-4\/5 { max-width: 80% !important; } .lt-lg\:max-w-1\/12 { max-width: 8.33333% !important; } .lt-lg\:max-w-2\/12 { max-width: 16.66667% !important; } .lt-lg\:max-w-3\/12 { max-width: 25% !important; } .lt-lg\:max-w-4\/12 { max-width: 33.33333% !important; } .lt-lg\:max-w-5\/12 { max-width: 41.66667% !important; } .lt-lg\:max-w-6\/12 { max-width: 50% !important; } .lt-lg\:max-w-7\/12 { max-width: 58.33333% !important; } .lt-lg\:max-w-8\/12 { max-width: 66.66667% !important; } .lt-lg\:max-w-9\/12 { max-width: 75% !important; } .lt-lg\:max-w-10\/12 { max-width: 83.33333% !important; } .lt-lg\:max-w-11\/12 { max-width: 91.66667% !important; } .lt-lg\:min-h-0 { min-height: 0 !important; } .lt-lg\:min-h-1 { min-height: 0.25rem !important; } .lt-lg\:min-h-2 { min-height: 0.5rem !important; } .lt-lg\:min-h-3 { min-height: 0.75rem !important; } .lt-lg\:min-h-4 { min-height: 1rem !important; } .lt-lg\:min-h-5 { min-height: 1.25rem !important; } .lt-lg\:min-h-6 { min-height: 1.5rem !important; } .lt-lg\:min-h-8 { min-height: 2rem !important; } .lt-lg\:min-h-10 { min-height: 2.5rem !important; } .lt-lg\:min-h-12 { min-height: 3rem !important; } .lt-lg\:min-h-14 { min-height: 3.5rem !important; } .lt-lg\:min-h-16 { min-height: 4rem !important; } .lt-lg\:min-h-18 { min-height: 4.5rem !important; } .lt-lg\:min-h-20 { min-height: 5rem !important; } .lt-lg\:min-h-22 { min-height: 5.5rem !important; } .lt-lg\:min-h-24 { min-height: 6rem !important; } .lt-lg\:min-h-26 { min-height: 6.5rem !important; } .lt-lg\:min-h-28 { min-height: 7rem !important; } .lt-lg\:min-h-30 { min-height: 7.5rem !important; } .lt-lg\:min-h-32 { min-height: 8rem !important; } .lt-lg\:min-h-36 { min-height: 9rem !important; } .lt-lg\:min-h-40 { min-height: 10rem !important; } .lt-lg\:min-h-48 { min-height: 12rem !important; } .lt-lg\:min-h-50 { min-height: 12.5rem !important; } .lt-lg\:min-h-56 { min-height: 14rem !important; } .lt-lg\:min-h-60 { min-height: 15rem !important; } .lt-lg\:min-h-64 { min-height: 16rem !important; } .lt-lg\:min-h-80 { min-height: 20rem !important; } .lt-lg\:min-h-90 { min-height: 24rem !important; } .lt-lg\:min-h-100 { min-height: 25rem !important; } .lt-lg\:min-h-120 { min-height: 30rem !important; } .lt-lg\:min-h-128 { min-height: 32rem !important; } .lt-lg\:min-h-140 { min-height: 35rem !important; } .lt-lg\:min-h-160 { min-height: 40rem !important; } .lt-lg\:min-h-180 { min-height: 45rem !important; } .lt-lg\:min-h-192 { min-height: 48rem !important; } .lt-lg\:min-h-200 { min-height: 50rem !important; } .lt-lg\:min-h-240 { min-height: 60rem !important; } .lt-lg\:min-h-256 { min-height: 64rem !important; } .lt-lg\:min-h-280 { min-height: 70rem !important; } .lt-lg\:min-h-320 { min-height: 80rem !important; } .lt-lg\:min-h-360 { min-height: 90rem !important; } .lt-lg\:min-h-400 { min-height: 100rem !important; } .lt-lg\:min-h-480 { min-height: 120rem !important; } .lt-lg\:min-h-full { min-height: 100% !important; } .lt-lg\:min-h-screen { min-height: 100vh !important; } .lt-lg\:min-h-px { min-height: 1px !important; } .lt-lg\:min-h-2px { min-height: 2px !important; } .lt-lg\:min-h-1\/2 { min-height: 50% !important; } .lt-lg\:min-h-1\/3 { min-height: 33.33333% !important; } .lt-lg\:min-h-2\/3 { min-height: 66.66667% !important; } .lt-lg\:min-h-1\/4 { min-height: 25% !important; } .lt-lg\:min-h-2\/4 { min-height: 50% !important; } .lt-lg\:min-h-3\/4 { min-height: 75% !important; } .lt-lg\:min-h-1\/5 { min-height: 20% !important; } .lt-lg\:min-h-2\/5 { min-height: 40% !important; } .lt-lg\:min-h-3\/5 { min-height: 60% !important; } .lt-lg\:min-h-4\/5 { min-height: 80% !important; } .lt-lg\:min-h-1\/12 { min-height: 8.33333% !important; } .lt-lg\:min-h-2\/12 { min-height: 16.66667% !important; } .lt-lg\:min-h-3\/12 { min-height: 25% !important; } .lt-lg\:min-h-4\/12 { min-height: 33.33333% !important; } .lt-lg\:min-h-5\/12 { min-height: 41.66667% !important; } .lt-lg\:min-h-6\/12 { min-height: 50% !important; } .lt-lg\:min-h-7\/12 { min-height: 58.33333% !important; } .lt-lg\:min-h-8\/12 { min-height: 66.66667% !important; } .lt-lg\:min-h-9\/12 { min-height: 75% !important; } .lt-lg\:min-h-10\/12 { min-height: 83.33333% !important; } .lt-lg\:min-h-11\/12 { min-height: 91.66667% !important; } .lt-lg\:min-w-0 { min-width: 0 !important; } .lt-lg\:min-w-1 { min-width: 0.25rem !important; } .lt-lg\:min-w-2 { min-width: 0.5rem !important; } .lt-lg\:min-w-3 { min-width: 0.75rem !important; } .lt-lg\:min-w-4 { min-width: 1rem !important; } .lt-lg\:min-w-5 { min-width: 1.25rem !important; } .lt-lg\:min-w-6 { min-width: 1.5rem !important; } .lt-lg\:min-w-8 { min-width: 2rem !important; } .lt-lg\:min-w-10 { min-width: 2.5rem !important; } .lt-lg\:min-w-12 { min-width: 3rem !important; } .lt-lg\:min-w-14 { min-width: 3.5rem !important; } .lt-lg\:min-w-16 { min-width: 4rem !important; } .lt-lg\:min-w-18 { min-width: 4.5rem !important; } .lt-lg\:min-w-20 { min-width: 5rem !important; } .lt-lg\:min-w-22 { min-width: 5.5rem !important; } .lt-lg\:min-w-24 { min-width: 6rem !important; } .lt-lg\:min-w-26 { min-width: 6.5rem !important; } .lt-lg\:min-w-28 { min-width: 7rem !important; } .lt-lg\:min-w-30 { min-width: 7.5rem !important; } .lt-lg\:min-w-32 { min-width: 8rem !important; } .lt-lg\:min-w-36 { min-width: 9rem !important; } .lt-lg\:min-w-40 { min-width: 10rem !important; } .lt-lg\:min-w-48 { min-width: 12rem !important; } .lt-lg\:min-w-50 { min-width: 12.5rem !important; } .lt-lg\:min-w-56 { min-width: 14rem !important; } .lt-lg\:min-w-60 { min-width: 15rem !important; } .lt-lg\:min-w-64 { min-width: 16rem !important; } .lt-lg\:min-w-80 { min-width: 20rem !important; } .lt-lg\:min-w-90 { min-width: 24rem !important; } .lt-lg\:min-w-100 { min-width: 25rem !important; } .lt-lg\:min-w-120 { min-width: 30rem !important; } .lt-lg\:min-w-128 { min-width: 32rem !important; } .lt-lg\:min-w-140 { min-width: 35rem !important; } .lt-lg\:min-w-160 { min-width: 40rem !important; } .lt-lg\:min-w-180 { min-width: 45rem !important; } .lt-lg\:min-w-192 { min-width: 48rem !important; } .lt-lg\:min-w-200 { min-width: 50rem !important; } .lt-lg\:min-w-240 { min-width: 60rem !important; } .lt-lg\:min-w-256 { min-width: 64rem !important; } .lt-lg\:min-w-280 { min-width: 70rem !important; } .lt-lg\:min-w-320 { min-width: 80rem !important; } .lt-lg\:min-w-360 { min-width: 90rem !important; } .lt-lg\:min-w-400 { min-width: 100rem !important; } .lt-lg\:min-w-480 { min-width: 120rem !important; } .lt-lg\:min-w-full { min-width: 100% !important; } .lt-lg\:min-w-screen { min-width: 100vw !important; } .lt-lg\:min-w-px { min-width: 1px !important; } .lt-lg\:min-w-2px { min-width: 2px !important; } .lt-lg\:min-w-1\/2 { min-width: 50% !important; } .lt-lg\:min-w-1\/3 { min-width: 33.33333% !important; } .lt-lg\:min-w-2\/3 { min-width: 66.66667% !important; } .lt-lg\:min-w-1\/4 { min-width: 25% !important; } .lt-lg\:min-w-2\/4 { min-width: 50% !important; } .lt-lg\:min-w-3\/4 { min-width: 75% !important; } .lt-lg\:min-w-1\/5 { min-width: 20% !important; } .lt-lg\:min-w-2\/5 { min-width: 40% !important; } .lt-lg\:min-w-3\/5 { min-width: 60% !important; } .lt-lg\:min-w-4\/5 { min-width: 80% !important; } .lt-lg\:min-w-1\/12 { min-width: 8.33333% !important; } .lt-lg\:min-w-2\/12 { min-width: 16.66667% !important; } .lt-lg\:min-w-3\/12 { min-width: 25% !important; } .lt-lg\:min-w-4\/12 { min-width: 33.33333% !important; } .lt-lg\:min-w-5\/12 { min-width: 41.66667% !important; } .lt-lg\:min-w-6\/12 { min-width: 50% !important; } .lt-lg\:min-w-7\/12 { min-width: 58.33333% !important; } .lt-lg\:min-w-8\/12 { min-width: 66.66667% !important; } .lt-lg\:min-w-9\/12 { min-width: 75% !important; } .lt-lg\:min-w-10\/12 { min-width: 83.33333% !important; } .lt-lg\:min-w-11\/12 { min-width: 91.66667% !important; } .lt-lg\:object-contain { -o-object-fit: contain !important; object-fit: contain !important; } .lt-lg\:object-cover { -o-object-fit: cover !important; object-fit: cover !important; } .lt-lg\:object-fill { -o-object-fit: fill !important; object-fit: fill !important; } .lt-lg\:object-none { -o-object-fit: none !important; object-fit: none !important; } .lt-lg\:object-scale-down { -o-object-fit: scale-down !important; object-fit: scale-down !important; } .lt-lg\:object-bottom { -o-object-position: bottom !important; object-position: bottom !important; } .lt-lg\:object-center { -o-object-position: center !important; object-position: center !important; } .lt-lg\:object-left { -o-object-position: left !important; object-position: left !important; } .lt-lg\:object-left-bottom { -o-object-position: left bottom !important; object-position: left bottom !important; } .lt-lg\:object-left-top { -o-object-position: left top !important; object-position: left top !important; } .lt-lg\:object-right { -o-object-position: right !important; object-position: right !important; } .lt-lg\:object-right-bottom { -o-object-position: right bottom !important; object-position: right bottom !important; } .lt-lg\:object-right-top { -o-object-position: right top !important; object-position: right top !important; } .lt-lg\:object-top { -o-object-position: top !important; object-position: top !important; } .lt-lg\:opacity-0 { opacity: 0 !important; } .lt-lg\:opacity-12 { opacity: 0.12 !important; } .lt-lg\:opacity-25 { opacity: 0.25 !important; } .lt-lg\:opacity-38 { opacity: 0.38 !important; } .lt-lg\:opacity-50 { opacity: 0.5 !important; } .lt-lg\:opacity-54 { opacity: 0.54 !important; } .lt-lg\:opacity-70 { opacity: 0.70 !important; } .lt-lg\:opacity-75 { opacity: 0.75 !important; } .lt-lg\:opacity-84 { opacity: 0.84 !important; } .lt-lg\:opacity-100 { opacity: 1 !important; } .lt-lg\:hover\:opacity-0:hover { opacity: 0 !important; } .lt-lg\:hover\:opacity-12:hover { opacity: 0.12 !important; } .lt-lg\:hover\:opacity-25:hover { opacity: 0.25 !important; } .lt-lg\:hover\:opacity-38:hover { opacity: 0.38 !important; } .lt-lg\:hover\:opacity-50:hover { opacity: 0.5 !important; } .lt-lg\:hover\:opacity-54:hover { opacity: 0.54 !important; } .lt-lg\:hover\:opacity-70:hover { opacity: 0.70 !important; } .lt-lg\:hover\:opacity-75:hover { opacity: 0.75 !important; } .lt-lg\:hover\:opacity-84:hover { opacity: 0.84 !important; } .lt-lg\:hover\:opacity-100:hover { opacity: 1 !important; } .lt-lg\:focus\:opacity-0:focus { opacity: 0 !important; } .lt-lg\:focus\:opacity-12:focus { opacity: 0.12 !important; } .lt-lg\:focus\:opacity-25:focus { opacity: 0.25 !important; } .lt-lg\:focus\:opacity-38:focus { opacity: 0.38 !important; } .lt-lg\:focus\:opacity-50:focus { opacity: 0.5 !important; } .lt-lg\:focus\:opacity-54:focus { opacity: 0.54 !important; } .lt-lg\:focus\:opacity-70:focus { opacity: 0.70 !important; } .lt-lg\:focus\:opacity-75:focus { opacity: 0.75 !important; } .lt-lg\:focus\:opacity-84:focus { opacity: 0.84 !important; } .lt-lg\:focus\:opacity-100:focus { opacity: 1 !important; } .lt-lg\:outline-none { outline: 0 !important; } .lt-lg\:focus\:outline-none:focus { outline: 0 !important; } .lt-lg\:overflow-auto { overflow: auto !important; } .lt-lg\:overflow-hidden { overflow: hidden !important; } .lt-lg\:overflow-visible { overflow: visible !important; } .lt-lg\:overflow-scroll { overflow: scroll !important; } .lt-lg\:overflow-x-auto { overflow-x: auto !important; } .lt-lg\:overflow-y-auto { overflow-y: auto !important; } .lt-lg\:overflow-x-hidden { overflow-x: hidden !important; } .lt-lg\:overflow-y-hidden { overflow-y: hidden !important; } .lt-lg\:overflow-x-visible { overflow-x: visible !important; } .lt-lg\:overflow-y-visible { overflow-y: visible !important; } .lt-lg\:overflow-x-scroll { overflow-x: scroll !important; } .lt-lg\:overflow-y-scroll { overflow-y: scroll !important; } .lt-lg\:scrolling-touch { -webkit-overflow-scrolling: touch !important; } .lt-lg\:scrolling-auto { -webkit-overflow-scrolling: auto !important; } .lt-lg\:p-0 { padding: 0 !important; } .lt-lg\:p-1 { padding: 0.25rem !important; } .lt-lg\:p-2 { padding: 0.5rem !important; } .lt-lg\:p-3 { padding: 0.75rem !important; } .lt-lg\:p-4 { padding: 1rem !important; } .lt-lg\:p-5 { padding: 1.25rem !important; } .lt-lg\:p-6 { padding: 1.5rem !important; } .lt-lg\:p-8 { padding: 2rem !important; } .lt-lg\:p-10 { padding: 2.5rem !important; } .lt-lg\:p-12 { padding: 3rem !important; } .lt-lg\:p-14 { padding: 3.5rem !important; } .lt-lg\:p-16 { padding: 4rem !important; } .lt-lg\:p-18 { padding: 4.5rem !important; } .lt-lg\:p-20 { padding: 5rem !important; } .lt-lg\:p-22 { padding: 5.5rem !important; } .lt-lg\:p-24 { padding: 6rem !important; } .lt-lg\:p-26 { padding: 6.5rem !important; } .lt-lg\:p-28 { padding: 7rem !important; } .lt-lg\:p-30 { padding: 7.5rem !important; } .lt-lg\:p-32 { padding: 8rem !important; } .lt-lg\:p-36 { padding: 9rem !important; } .lt-lg\:p-40 { padding: 10rem !important; } .lt-lg\:p-48 { padding: 12rem !important; } .lt-lg\:p-56 { padding: 14rem !important; } .lt-lg\:p-64 { padding: 16rem !important; } .lt-lg\:p-px { padding: 1px !important; } .lt-lg\:p-2px { padding: 2px !important; } .lt-lg\:py-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .lt-lg\:px-0 { padding-left: 0 !important; padding-right: 0 !important; } .lt-lg\:py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .lt-lg\:px-1 { padding-left: 0.25rem !important; padding-right: 0.25rem !important; } .lt-lg\:py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .lt-lg\:px-2 { padding-left: 0.5rem !important; padding-right: 0.5rem !important; } .lt-lg\:py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .lt-lg\:px-3 { padding-left: 0.75rem !important; padding-right: 0.75rem !important; } .lt-lg\:py-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .lt-lg\:px-4 { padding-left: 1rem !important; padding-right: 1rem !important; } .lt-lg\:py-5 { padding-top: 1.25rem !important; padding-bottom: 1.25rem !important; } .lt-lg\:px-5 { padding-left: 1.25rem !important; padding-right: 1.25rem !important; } .lt-lg\:py-6 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .lt-lg\:px-6 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } .lt-lg\:py-8 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .lt-lg\:px-8 { padding-left: 2rem !important; padding-right: 2rem !important; } .lt-lg\:py-10 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .lt-lg\:px-10 { padding-left: 2.5rem !important; padding-right: 2.5rem !important; } .lt-lg\:py-12 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .lt-lg\:px-12 { padding-left: 3rem !important; padding-right: 3rem !important; } .lt-lg\:py-14 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .lt-lg\:px-14 { padding-left: 3.5rem !important; padding-right: 3.5rem !important; } .lt-lg\:py-16 { padding-top: 4rem !important; padding-bottom: 4rem !important; } .lt-lg\:px-16 { padding-left: 4rem !important; padding-right: 4rem !important; } .lt-lg\:py-18 { padding-top: 4.5rem !important; padding-bottom: 4.5rem !important; } .lt-lg\:px-18 { padding-left: 4.5rem !important; padding-right: 4.5rem !important; } .lt-lg\:py-20 { padding-top: 5rem !important; padding-bottom: 5rem !important; } .lt-lg\:px-20 { padding-left: 5rem !important; padding-right: 5rem !important; } .lt-lg\:py-22 { padding-top: 5.5rem !important; padding-bottom: 5.5rem !important; } .lt-lg\:px-22 { padding-left: 5.5rem !important; padding-right: 5.5rem !important; } .lt-lg\:py-24 { padding-top: 6rem !important; padding-bottom: 6rem !important; } .lt-lg\:px-24 { padding-left: 6rem !important; padding-right: 6rem !important; } .lt-lg\:py-26 { padding-top: 6.5rem !important; padding-bottom: 6.5rem !important; } .lt-lg\:px-26 { padding-left: 6.5rem !important; padding-right: 6.5rem !important; } .lt-lg\:py-28 { padding-top: 7rem !important; padding-bottom: 7rem !important; } .lt-lg\:px-28 { padding-left: 7rem !important; padding-right: 7rem !important; } .lt-lg\:py-30 { padding-top: 7.5rem !important; padding-bottom: 7.5rem !important; } .lt-lg\:px-30 { padding-left: 7.5rem !important; padding-right: 7.5rem !important; } .lt-lg\:py-32 { padding-top: 8rem !important; padding-bottom: 8rem !important; } .lt-lg\:px-32 { padding-left: 8rem !important; padding-right: 8rem !important; } .lt-lg\:py-36 { padding-top: 9rem !important; padding-bottom: 9rem !important; } .lt-lg\:px-36 { padding-left: 9rem !important; padding-right: 9rem !important; } .lt-lg\:py-40 { padding-top: 10rem !important; padding-bottom: 10rem !important; } .lt-lg\:px-40 { padding-left: 10rem !important; padding-right: 10rem !important; } .lt-lg\:py-48 { padding-top: 12rem !important; padding-bottom: 12rem !important; } .lt-lg\:px-48 { padding-left: 12rem !important; padding-right: 12rem !important; } .lt-lg\:py-56 { padding-top: 14rem !important; padding-bottom: 14rem !important; } .lt-lg\:px-56 { padding-left: 14rem !important; padding-right: 14rem !important; } .lt-lg\:py-64 { padding-top: 16rem !important; padding-bottom: 16rem !important; } .lt-lg\:px-64 { padding-left: 16rem !important; padding-right: 16rem !important; } .lt-lg\:py-px { padding-top: 1px !important; padding-bottom: 1px !important; } .lt-lg\:px-px { padding-left: 1px !important; padding-right: 1px !important; } .lt-lg\:py-2px { padding-top: 2px !important; padding-bottom: 2px !important; } .lt-lg\:px-2px { padding-left: 2px !important; padding-right: 2px !important; } .lt-lg\:pt-0 { padding-top: 0 !important; } .lt-lg\:pr-0 { padding-right: 0 !important; } .lt-lg\:pb-0 { padding-bottom: 0 !important; } .lt-lg\:pl-0 { padding-left: 0 !important; } .lt-lg\:pt-1 { padding-top: 0.25rem !important; } .lt-lg\:pr-1 { padding-right: 0.25rem !important; } .lt-lg\:pb-1 { padding-bottom: 0.25rem !important; } .lt-lg\:pl-1 { padding-left: 0.25rem !important; } .lt-lg\:pt-2 { padding-top: 0.5rem !important; } .lt-lg\:pr-2 { padding-right: 0.5rem !important; } .lt-lg\:pb-2 { padding-bottom: 0.5rem !important; } .lt-lg\:pl-2 { padding-left: 0.5rem !important; } .lt-lg\:pt-3 { padding-top: 0.75rem !important; } .lt-lg\:pr-3 { padding-right: 0.75rem !important; } .lt-lg\:pb-3 { padding-bottom: 0.75rem !important; } .lt-lg\:pl-3 { padding-left: 0.75rem !important; } .lt-lg\:pt-4 { padding-top: 1rem !important; } .lt-lg\:pr-4 { padding-right: 1rem !important; } .lt-lg\:pb-4 { padding-bottom: 1rem !important; } .lt-lg\:pl-4 { padding-left: 1rem !important; } .lt-lg\:pt-5 { padding-top: 1.25rem !important; } .lt-lg\:pr-5 { padding-right: 1.25rem !important; } .lt-lg\:pb-5 { padding-bottom: 1.25rem !important; } .lt-lg\:pl-5 { padding-left: 1.25rem !important; } .lt-lg\:pt-6 { padding-top: 1.5rem !important; } .lt-lg\:pr-6 { padding-right: 1.5rem !important; } .lt-lg\:pb-6 { padding-bottom: 1.5rem !important; } .lt-lg\:pl-6 { padding-left: 1.5rem !important; } .lt-lg\:pt-8 { padding-top: 2rem !important; } .lt-lg\:pr-8 { padding-right: 2rem !important; } .lt-lg\:pb-8 { padding-bottom: 2rem !important; } .lt-lg\:pl-8 { padding-left: 2rem !important; } .lt-lg\:pt-10 { padding-top: 2.5rem !important; } .lt-lg\:pr-10 { padding-right: 2.5rem !important; } .lt-lg\:pb-10 { padding-bottom: 2.5rem !important; } .lt-lg\:pl-10 { padding-left: 2.5rem !important; } .lt-lg\:pt-12 { padding-top: 3rem !important; } .lt-lg\:pr-12 { padding-right: 3rem !important; } .lt-lg\:pb-12 { padding-bottom: 3rem !important; } .lt-lg\:pl-12 { padding-left: 3rem !important; } .lt-lg\:pt-14 { padding-top: 3.5rem !important; } .lt-lg\:pr-14 { padding-right: 3.5rem !important; } .lt-lg\:pb-14 { padding-bottom: 3.5rem !important; } .lt-lg\:pl-14 { padding-left: 3.5rem !important; } .lt-lg\:pt-16 { padding-top: 4rem !important; } .lt-lg\:pr-16 { padding-right: 4rem !important; } .lt-lg\:pb-16 { padding-bottom: 4rem !important; } .lt-lg\:pl-16 { padding-left: 4rem !important; } .lt-lg\:pt-18 { padding-top: 4.5rem !important; } .lt-lg\:pr-18 { padding-right: 4.5rem !important; } .lt-lg\:pb-18 { padding-bottom: 4.5rem !important; } .lt-lg\:pl-18 { padding-left: 4.5rem !important; } .lt-lg\:pt-20 { padding-top: 5rem !important; } .lt-lg\:pr-20 { padding-right: 5rem !important; } .lt-lg\:pb-20 { padding-bottom: 5rem !important; } .lt-lg\:pl-20 { padding-left: 5rem !important; } .lt-lg\:pt-22 { padding-top: 5.5rem !important; } .lt-lg\:pr-22 { padding-right: 5.5rem !important; } .lt-lg\:pb-22 { padding-bottom: 5.5rem !important; } .lt-lg\:pl-22 { padding-left: 5.5rem !important; } .lt-lg\:pt-24 { padding-top: 6rem !important; } .lt-lg\:pr-24 { padding-right: 6rem !important; } .lt-lg\:pb-24 { padding-bottom: 6rem !important; } .lt-lg\:pl-24 { padding-left: 6rem !important; } .lt-lg\:pt-26 { padding-top: 6.5rem !important; } .lt-lg\:pr-26 { padding-right: 6.5rem !important; } .lt-lg\:pb-26 { padding-bottom: 6.5rem !important; } .lt-lg\:pl-26 { padding-left: 6.5rem !important; } .lt-lg\:pt-28 { padding-top: 7rem !important; } .lt-lg\:pr-28 { padding-right: 7rem !important; } .lt-lg\:pb-28 { padding-bottom: 7rem !important; } .lt-lg\:pl-28 { padding-left: 7rem !important; } .lt-lg\:pt-30 { padding-top: 7.5rem !important; } .lt-lg\:pr-30 { padding-right: 7.5rem !important; } .lt-lg\:pb-30 { padding-bottom: 7.5rem !important; } .lt-lg\:pl-30 { padding-left: 7.5rem !important; } .lt-lg\:pt-32 { padding-top: 8rem !important; } .lt-lg\:pr-32 { padding-right: 8rem !important; } .lt-lg\:pb-32 { padding-bottom: 8rem !important; } .lt-lg\:pl-32 { padding-left: 8rem !important; } .lt-lg\:pt-36 { padding-top: 9rem !important; } .lt-lg\:pr-36 { padding-right: 9rem !important; } .lt-lg\:pb-36 { padding-bottom: 9rem !important; } .lt-lg\:pl-36 { padding-left: 9rem !important; } .lt-lg\:pt-40 { padding-top: 10rem !important; } .lt-lg\:pr-40 { padding-right: 10rem !important; } .lt-lg\:pb-40 { padding-bottom: 10rem !important; } .lt-lg\:pl-40 { padding-left: 10rem !important; } .lt-lg\:pt-48 { padding-top: 12rem !important; } .lt-lg\:pr-48 { padding-right: 12rem !important; } .lt-lg\:pb-48 { padding-bottom: 12rem !important; } .lt-lg\:pl-48 { padding-left: 12rem !important; } .lt-lg\:pt-56 { padding-top: 14rem !important; } .lt-lg\:pr-56 { padding-right: 14rem !important; } .lt-lg\:pb-56 { padding-bottom: 14rem !important; } .lt-lg\:pl-56 { padding-left: 14rem !important; } .lt-lg\:pt-64 { padding-top: 16rem !important; } .lt-lg\:pr-64 { padding-right: 16rem !important; } .lt-lg\:pb-64 { padding-bottom: 16rem !important; } .lt-lg\:pl-64 { padding-left: 16rem !important; } .lt-lg\:pt-px { padding-top: 1px !important; } .lt-lg\:pr-px { padding-right: 1px !important; } .lt-lg\:pb-px { padding-bottom: 1px !important; } .lt-lg\:pl-px { padding-left: 1px !important; } .lt-lg\:pt-2px { padding-top: 2px !important; } .lt-lg\:pr-2px { padding-right: 2px !important; } .lt-lg\:pb-2px { padding-bottom: 2px !important; } .lt-lg\:pl-2px { padding-left: 2px !important; } .lt-lg\:placeholder-opacity-0::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .lt-lg\:placeholder-opacity-0::-moz-placeholder { --placeholder-opacity: 0 !important; } .lt-lg\:placeholder-opacity-0::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .lt-lg\:placeholder-opacity-0::placeholder { --placeholder-opacity: 0 !important; } .lt-lg\:placeholder-opacity-12::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .lt-lg\:placeholder-opacity-12::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .lt-lg\:placeholder-opacity-12::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .lt-lg\:placeholder-opacity-12::placeholder { --placeholder-opacity: 0.12 !important; } .lt-lg\:placeholder-opacity-25::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .lt-lg\:placeholder-opacity-25::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .lt-lg\:placeholder-opacity-25::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .lt-lg\:placeholder-opacity-25::placeholder { --placeholder-opacity: 0.25 !important; } .lt-lg\:placeholder-opacity-38::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .lt-lg\:placeholder-opacity-38::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .lt-lg\:placeholder-opacity-38::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .lt-lg\:placeholder-opacity-38::placeholder { --placeholder-opacity: 0.38 !important; } .lt-lg\:placeholder-opacity-50::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .lt-lg\:placeholder-opacity-50::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .lt-lg\:placeholder-opacity-50::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .lt-lg\:placeholder-opacity-50::placeholder { --placeholder-opacity: 0.5 !important; } .lt-lg\:placeholder-opacity-54::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .lt-lg\:placeholder-opacity-54::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .lt-lg\:placeholder-opacity-54::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .lt-lg\:placeholder-opacity-54::placeholder { --placeholder-opacity: 0.54 !important; } .lt-lg\:placeholder-opacity-70::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .lt-lg\:placeholder-opacity-70::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .lt-lg\:placeholder-opacity-70::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .lt-lg\:placeholder-opacity-70::placeholder { --placeholder-opacity: 0.70 !important; } .lt-lg\:placeholder-opacity-75::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .lt-lg\:placeholder-opacity-75::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .lt-lg\:placeholder-opacity-75::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .lt-lg\:placeholder-opacity-75::placeholder { --placeholder-opacity: 0.75 !important; } .lt-lg\:placeholder-opacity-84::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .lt-lg\:placeholder-opacity-84::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .lt-lg\:placeholder-opacity-84::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .lt-lg\:placeholder-opacity-84::placeholder { --placeholder-opacity: 0.84 !important; } .lt-lg\:placeholder-opacity-100::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .lt-lg\:placeholder-opacity-100::-moz-placeholder { --placeholder-opacity: 1 !important; } .lt-lg\:placeholder-opacity-100::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .lt-lg\:placeholder-opacity-100::placeholder { --placeholder-opacity: 1 !important; } .lt-lg\:focus\:placeholder-opacity-0:focus::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .lt-lg\:focus\:placeholder-opacity-0:focus::-moz-placeholder { --placeholder-opacity: 0 !important; } .lt-lg\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .lt-lg\:focus\:placeholder-opacity-0:focus::placeholder { --placeholder-opacity: 0 !important; } .lt-lg\:focus\:placeholder-opacity-12:focus::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .lt-lg\:focus\:placeholder-opacity-12:focus::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .lt-lg\:focus\:placeholder-opacity-12:focus::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .lt-lg\:focus\:placeholder-opacity-12:focus::placeholder { --placeholder-opacity: 0.12 !important; } .lt-lg\:focus\:placeholder-opacity-25:focus::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .lt-lg\:focus\:placeholder-opacity-25:focus::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .lt-lg\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .lt-lg\:focus\:placeholder-opacity-25:focus::placeholder { --placeholder-opacity: 0.25 !important; } .lt-lg\:focus\:placeholder-opacity-38:focus::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .lt-lg\:focus\:placeholder-opacity-38:focus::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .lt-lg\:focus\:placeholder-opacity-38:focus::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .lt-lg\:focus\:placeholder-opacity-38:focus::placeholder { --placeholder-opacity: 0.38 !important; } .lt-lg\:focus\:placeholder-opacity-50:focus::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .lt-lg\:focus\:placeholder-opacity-50:focus::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .lt-lg\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .lt-lg\:focus\:placeholder-opacity-50:focus::placeholder { --placeholder-opacity: 0.5 !important; } .lt-lg\:focus\:placeholder-opacity-54:focus::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .lt-lg\:focus\:placeholder-opacity-54:focus::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .lt-lg\:focus\:placeholder-opacity-54:focus::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .lt-lg\:focus\:placeholder-opacity-54:focus::placeholder { --placeholder-opacity: 0.54 !important; } .lt-lg\:focus\:placeholder-opacity-70:focus::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .lt-lg\:focus\:placeholder-opacity-70:focus::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .lt-lg\:focus\:placeholder-opacity-70:focus::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .lt-lg\:focus\:placeholder-opacity-70:focus::placeholder { --placeholder-opacity: 0.70 !important; } .lt-lg\:focus\:placeholder-opacity-75:focus::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .lt-lg\:focus\:placeholder-opacity-75:focus::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .lt-lg\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .lt-lg\:focus\:placeholder-opacity-75:focus::placeholder { --placeholder-opacity: 0.75 !important; } .lt-lg\:focus\:placeholder-opacity-84:focus::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .lt-lg\:focus\:placeholder-opacity-84:focus::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .lt-lg\:focus\:placeholder-opacity-84:focus::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .lt-lg\:focus\:placeholder-opacity-84:focus::placeholder { --placeholder-opacity: 0.84 !important; } .lt-lg\:focus\:placeholder-opacity-100:focus::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .lt-lg\:focus\:placeholder-opacity-100:focus::-moz-placeholder { --placeholder-opacity: 1 !important; } .lt-lg\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .lt-lg\:focus\:placeholder-opacity-100:focus::placeholder { --placeholder-opacity: 1 !important; } .lt-lg\:pointer-events-none { pointer-events: none !important; } .lt-lg\:pointer-events-auto { pointer-events: auto !important; } .lt-lg\:static { position: static !important; } .lt-lg\:fixed { position: fixed !important; } .lt-lg\:absolute { position: absolute !important; } .lt-lg\:relative { position: relative !important; } .lt-lg\:sticky { position: -webkit-sticky !important; position: sticky !important; } .lt-lg\:inset-0 { top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; } .lt-lg\:inset-auto { top: auto !important; right: auto !important; bottom: auto !important; left: auto !important; } .lt-lg\:inset-y-0 { top: 0 !important; bottom: 0 !important; } .lt-lg\:inset-x-0 { right: 0 !important; left: 0 !important; } .lt-lg\:inset-y-auto { top: auto !important; bottom: auto !important; } .lt-lg\:inset-x-auto { right: auto !important; left: auto !important; } .lt-lg\:top-0 { top: 0 !important; } .lt-lg\:right-0 { right: 0 !important; } .lt-lg\:bottom-0 { bottom: 0 !important; } .lt-lg\:left-0 { left: 0 !important; } .lt-lg\:top-auto { top: auto !important; } .lt-lg\:right-auto { right: auto !important; } .lt-lg\:bottom-auto { bottom: auto !important; } .lt-lg\:left-auto { left: auto !important; } .lt-lg\:shadow-xs { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .lt-lg\:shadow-sm { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .lt-lg\:shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .lt-lg\:shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .lt-lg\:shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .lt-lg\:shadow-xl { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .lt-lg\:shadow-2xl { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .lt-lg\:shadow-inner { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .lt-lg\:shadow-outline { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .lt-lg\:shadow-none { box-shadow: none !important; } .lt-lg\:shadow-solid { box-shadow: 0 0 0 2px currentColor !important; } .lt-lg\:hover\:shadow-xs:hover { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .lt-lg\:hover\:shadow-sm:hover { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .lt-lg\:hover\:shadow:hover { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .lt-lg\:hover\:shadow-md:hover { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .lt-lg\:hover\:shadow-lg:hover { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .lt-lg\:hover\:shadow-xl:hover { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .lt-lg\:hover\:shadow-2xl:hover { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .lt-lg\:hover\:shadow-inner:hover { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .lt-lg\:hover\:shadow-outline:hover { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .lt-lg\:hover\:shadow-none:hover { box-shadow: none !important; } .lt-lg\:hover\:shadow-solid:hover { box-shadow: 0 0 0 2px currentColor !important; } .lt-lg\:focus\:shadow-xs:focus { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .lt-lg\:focus\:shadow-sm:focus { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .lt-lg\:focus\:shadow:focus { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .lt-lg\:focus\:shadow-md:focus { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .lt-lg\:focus\:shadow-lg:focus { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .lt-lg\:focus\:shadow-xl:focus { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .lt-lg\:focus\:shadow-2xl:focus { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .lt-lg\:focus\:shadow-inner:focus { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .lt-lg\:focus\:shadow-outline:focus { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .lt-lg\:focus\:shadow-none:focus { box-shadow: none !important; } .lt-lg\:focus\:shadow-solid:focus { box-shadow: 0 0 0 2px currentColor !important; } .lt-lg\:fill-current { fill: currentColor !important; } .lt-lg\:stroke-current { stroke: currentColor !important; } .lt-lg\:stroke-0 { stroke-width: 0 !important; } .lt-lg\:stroke-1 { stroke-width: 1 !important; } .lt-lg\:stroke-2 { stroke-width: 2 !important; } .lt-lg\:table-auto { table-layout: auto !important; } .lt-lg\:table-fixed { table-layout: fixed !important; } .lt-lg\:text-left { text-align: left !important; } .lt-lg\:text-center { text-align: center !important; } .lt-lg\:text-right { text-align: right !important; } .lt-lg\:text-justify { text-align: justify !important; } .lt-lg\:text-opacity-0 { --text-opacity: 0 !important; } .lt-lg\:text-opacity-12 { --text-opacity: 0.12 !important; } .lt-lg\:text-opacity-25 { --text-opacity: 0.25 !important; } .lt-lg\:text-opacity-38 { --text-opacity: 0.38 !important; } .lt-lg\:text-opacity-50 { --text-opacity: 0.5 !important; } .lt-lg\:text-opacity-54 { --text-opacity: 0.54 !important; } .lt-lg\:text-opacity-70 { --text-opacity: 0.70 !important; } .lt-lg\:text-opacity-75 { --text-opacity: 0.75 !important; } .lt-lg\:text-opacity-84 { --text-opacity: 0.84 !important; } .lt-lg\:text-opacity-100 { --text-opacity: 1 !important; } .lt-lg\:hover\:text-opacity-0:hover { --text-opacity: 0 !important; } .lt-lg\:hover\:text-opacity-12:hover { --text-opacity: 0.12 !important; } .lt-lg\:hover\:text-opacity-25:hover { --text-opacity: 0.25 !important; } .lt-lg\:hover\:text-opacity-38:hover { --text-opacity: 0.38 !important; } .lt-lg\:hover\:text-opacity-50:hover { --text-opacity: 0.5 !important; } .lt-lg\:hover\:text-opacity-54:hover { --text-opacity: 0.54 !important; } .lt-lg\:hover\:text-opacity-70:hover { --text-opacity: 0.70 !important; } .lt-lg\:hover\:text-opacity-75:hover { --text-opacity: 0.75 !important; } .lt-lg\:hover\:text-opacity-84:hover { --text-opacity: 0.84 !important; } .lt-lg\:hover\:text-opacity-100:hover { --text-opacity: 1 !important; } .lt-lg\:focus\:text-opacity-0:focus { --text-opacity: 0 !important; } .lt-lg\:focus\:text-opacity-12:focus { --text-opacity: 0.12 !important; } .lt-lg\:focus\:text-opacity-25:focus { --text-opacity: 0.25 !important; } .lt-lg\:focus\:text-opacity-38:focus { --text-opacity: 0.38 !important; } .lt-lg\:focus\:text-opacity-50:focus { --text-opacity: 0.5 !important; } .lt-lg\:focus\:text-opacity-54:focus { --text-opacity: 0.54 !important; } .lt-lg\:focus\:text-opacity-70:focus { --text-opacity: 0.70 !important; } .lt-lg\:focus\:text-opacity-75:focus { --text-opacity: 0.75 !important; } .lt-lg\:focus\:text-opacity-84:focus { --text-opacity: 0.84 !important; } .lt-lg\:focus\:text-opacity-100:focus { --text-opacity: 1 !important; } .lt-lg\:italic { font-style: italic !important; } .lt-lg\:not-italic { font-style: normal !important; } .lt-lg\:uppercase { text-transform: uppercase !important; } .lt-lg\:lowercase { text-transform: lowercase !important; } .lt-lg\:capitalize { text-transform: capitalize !important; } .lt-lg\:normal-case { text-transform: none !important; } .lt-lg\:underline { text-decoration: underline !important; } .lt-lg\:line-through { text-decoration: line-through !important; } .lt-lg\:no-underline { text-decoration: none !important; } .lt-lg\:hover\:underline:hover { text-decoration: underline !important; } .lt-lg\:hover\:line-through:hover { text-decoration: line-through !important; } .lt-lg\:hover\:no-underline:hover { text-decoration: none !important; } .lt-lg\:focus\:underline:focus { text-decoration: underline !important; } .lt-lg\:focus\:line-through:focus { text-decoration: line-through !important; } .lt-lg\:focus\:no-underline:focus { text-decoration: none !important; } .lt-lg\:tracking-tighter { letter-spacing: -0.05em !important; } .lt-lg\:tracking-tight { letter-spacing: -0.025em !important; } .lt-lg\:tracking-normal { letter-spacing: 0 !important; } .lt-lg\:tracking-wide { letter-spacing: 0.025em !important; } .lt-lg\:tracking-wider { letter-spacing: 0.05em !important; } .lt-lg\:tracking-widest { letter-spacing: 0.1em !important; } .lt-lg\:select-none { -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important; } .lt-lg\:select-text { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } .lt-lg\:select-all { -webkit-user-select: all !important; -moz-user-select: all !important; -ms-user-select: all !important; user-select: all !important; } .lt-lg\:select-auto { -webkit-user-select: auto !important; -moz-user-select: auto !important; -ms-user-select: auto !important; user-select: auto !important; } .lt-lg\:align-baseline { vertical-align: baseline !important; } .lt-lg\:align-top { vertical-align: top !important; } .lt-lg\:align-middle { vertical-align: middle !important; } .lt-lg\:align-bottom { vertical-align: bottom !important; } .lt-lg\:align-text-top { vertical-align: text-top !important; } .lt-lg\:align-text-bottom { vertical-align: text-bottom !important; } .lt-lg\:visible { visibility: visible !important; } .lt-lg\:invisible { visibility: hidden !important; } .lt-lg\:whitespace-normal { white-space: normal !important; } .lt-lg\:whitespace-no-wrap { white-space: nowrap !important; } .lt-lg\:whitespace-pre { white-space: pre !important; } .lt-lg\:whitespace-pre-line { white-space: pre-line !important; } .lt-lg\:whitespace-pre-wrap { white-space: pre-wrap !important; } .lt-lg\:break-normal { overflow-wrap: normal !important; word-break: normal !important; } .lt-lg\:break-words { overflow-wrap: break-word !important; } .lt-lg\:break-all { word-break: break-all !important; } .lt-lg\:truncate { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } .lt-lg\:w-0 { width: 0 !important; } .lt-lg\:w-1 { width: 0.25rem !important; } .lt-lg\:w-2 { width: 0.5rem !important; } .lt-lg\:w-3 { width: 0.75rem !important; } .lt-lg\:w-4 { width: 1rem !important; } .lt-lg\:w-5 { width: 1.25rem !important; } .lt-lg\:w-6 { width: 1.5rem !important; } .lt-lg\:w-8 { width: 2rem !important; } .lt-lg\:w-10 { width: 2.5rem !important; } .lt-lg\:w-12 { width: 3rem !important; } .lt-lg\:w-14 { width: 3.5rem !important; } .lt-lg\:w-16 { width: 4rem !important; } .lt-lg\:w-18 { width: 4.5rem !important; } .lt-lg\:w-20 { width: 5rem !important; } .lt-lg\:w-22 { width: 5.5rem !important; } .lt-lg\:w-24 { width: 6rem !important; } .lt-lg\:w-26 { width: 6.5rem !important; } .lt-lg\:w-28 { width: 7rem !important; } .lt-lg\:w-30 { width: 7.5rem !important; } .lt-lg\:w-32 { width: 8rem !important; } .lt-lg\:w-36 { width: 9rem !important; } .lt-lg\:w-40 { width: 10rem !important; } .lt-lg\:w-48 { width: 12rem !important; } .lt-lg\:w-50 { width: 12.5rem !important; } .lt-lg\:w-56 { width: 14rem !important; } .lt-lg\:w-60 { width: 15rem !important; } .lt-lg\:w-64 { width: 16rem !important; } .lt-lg\:w-80 { width: 20rem !important; } .lt-lg\:w-90 { width: 24rem !important; } .lt-lg\:w-100 { width: 25rem !important; } .lt-lg\:w-120 { width: 30rem !important; } .lt-lg\:w-128 { width: 32rem !important; } .lt-lg\:w-140 { width: 35rem !important; } .lt-lg\:w-160 { width: 40rem !important; } .lt-lg\:w-180 { width: 45rem !important; } .lt-lg\:w-192 { width: 48rem !important; } .lt-lg\:w-200 { width: 50rem !important; } .lt-lg\:w-240 { width: 60rem !important; } .lt-lg\:w-256 { width: 64rem !important; } .lt-lg\:w-280 { width: 70rem !important; } .lt-lg\:w-320 { width: 80rem !important; } .lt-lg\:w-360 { width: 90rem !important; } .lt-lg\:w-400 { width: 100rem !important; } .lt-lg\:w-480 { width: 120rem !important; } .lt-lg\:w-auto { width: auto !important; } .lt-lg\:w-px { width: 1px !important; } .lt-lg\:w-2px { width: 2px !important; } .lt-lg\:w-1\/2 { width: 50% !important; } .lt-lg\:w-1\/3 { width: 33.33333% !important; } .lt-lg\:w-2\/3 { width: 66.66667% !important; } .lt-lg\:w-1\/4 { width: 25% !important; } .lt-lg\:w-2\/4 { width: 50% !important; } .lt-lg\:w-3\/4 { width: 75% !important; } .lt-lg\:w-1\/5 { width: 20% !important; } .lt-lg\:w-2\/5 { width: 40% !important; } .lt-lg\:w-3\/5 { width: 60% !important; } .lt-lg\:w-4\/5 { width: 80% !important; } .lt-lg\:w-1\/6 { width: 16.666667% !important; } .lt-lg\:w-2\/6 { width: 33.333333% !important; } .lt-lg\:w-3\/6 { width: 50% !important; } .lt-lg\:w-4\/6 { width: 66.666667% !important; } .lt-lg\:w-5\/6 { width: 83.333333% !important; } .lt-lg\:w-1\/12 { width: 8.33333% !important; } .lt-lg\:w-2\/12 { width: 16.66667% !important; } .lt-lg\:w-3\/12 { width: 25% !important; } .lt-lg\:w-4\/12 { width: 33.33333% !important; } .lt-lg\:w-5\/12 { width: 41.66667% !important; } .lt-lg\:w-6\/12 { width: 50% !important; } .lt-lg\:w-7\/12 { width: 58.33333% !important; } .lt-lg\:w-8\/12 { width: 66.66667% !important; } .lt-lg\:w-9\/12 { width: 75% !important; } .lt-lg\:w-10\/12 { width: 83.33333% !important; } .lt-lg\:w-11\/12 { width: 91.66667% !important; } .lt-lg\:w-full { width: 100% !important; } .lt-lg\:w-screen { width: 100vw !important; } .lt-lg\:z-0 { z-index: 0 !important; } .lt-lg\:z-10 { z-index: 10 !important; } .lt-lg\:z-20 { z-index: 20 !important; } .lt-lg\:z-30 { z-index: 30 !important; } .lt-lg\:z-40 { z-index: 40 !important; } .lt-lg\:z-50 { z-index: 50 !important; } .lt-lg\:z-60 { z-index: 60 !important; } .lt-lg\:z-70 { z-index: 70 !important; } .lt-lg\:z-80 { z-index: 80 !important; } .lt-lg\:z-90 { z-index: 90 !important; } .lt-lg\:z-99 { z-index: 99 !important; } .lt-lg\:z-999 { z-index: 999 !important; } .lt-lg\:z-9999 { z-index: 9999 !important; } .lt-lg\:z-99999 { z-index: 99999 !important; } .lt-lg\:z-auto { z-index: auto !important; } .lt-lg\:-z-1 { z-index: -1 !important; } .lt-lg\:gap-0 { grid-gap: 0 !important; gap: 0 !important; } .lt-lg\:gap-1 { grid-gap: 0.25rem !important; gap: 0.25rem !important; } .lt-lg\:gap-2 { grid-gap: 0.5rem !important; gap: 0.5rem !important; } .lt-lg\:gap-3 { grid-gap: 0.75rem !important; gap: 0.75rem !important; } .lt-lg\:gap-4 { grid-gap: 1rem !important; gap: 1rem !important; } .lt-lg\:gap-5 { grid-gap: 1.25rem !important; gap: 1.25rem !important; } .lt-lg\:gap-6 { grid-gap: 1.5rem !important; gap: 1.5rem !important; } .lt-lg\:gap-8 { grid-gap: 2rem !important; gap: 2rem !important; } .lt-lg\:gap-10 { grid-gap: 2.5rem !important; gap: 2.5rem !important; } .lt-lg\:gap-12 { grid-gap: 3rem !important; gap: 3rem !important; } .lt-lg\:gap-14 { grid-gap: 3.5rem !important; gap: 3.5rem !important; } .lt-lg\:gap-16 { grid-gap: 4rem !important; gap: 4rem !important; } .lt-lg\:gap-18 { grid-gap: 4.5rem !important; gap: 4.5rem !important; } .lt-lg\:gap-20 { grid-gap: 5rem !important; gap: 5rem !important; } .lt-lg\:gap-22 { grid-gap: 5.5rem !important; gap: 5.5rem !important; } .lt-lg\:gap-24 { grid-gap: 6rem !important; gap: 6rem !important; } .lt-lg\:gap-26 { grid-gap: 6.5rem !important; gap: 6.5rem !important; } .lt-lg\:gap-28 { grid-gap: 7rem !important; gap: 7rem !important; } .lt-lg\:gap-30 { grid-gap: 7.5rem !important; gap: 7.5rem !important; } .lt-lg\:gap-32 { grid-gap: 8rem !important; gap: 8rem !important; } .lt-lg\:gap-36 { grid-gap: 9rem !important; gap: 9rem !important; } .lt-lg\:gap-40 { grid-gap: 10rem !important; gap: 10rem !important; } .lt-lg\:gap-48 { grid-gap: 12rem !important; gap: 12rem !important; } .lt-lg\:gap-56 { grid-gap: 14rem !important; gap: 14rem !important; } .lt-lg\:gap-64 { grid-gap: 16rem !important; gap: 16rem !important; } .lt-lg\:gap-px { grid-gap: 1px !important; gap: 1px !important; } .lt-lg\:gap-2px { grid-gap: 2px !important; gap: 2px !important; } .lt-lg\:col-gap-0 { grid-column-gap: 0 !important; -moz-column-gap: 0 !important; column-gap: 0 !important; } .lt-lg\:col-gap-1 { grid-column-gap: 0.25rem !important; -moz-column-gap: 0.25rem !important; column-gap: 0.25rem !important; } .lt-lg\:col-gap-2 { grid-column-gap: 0.5rem !important; -moz-column-gap: 0.5rem !important; column-gap: 0.5rem !important; } .lt-lg\:col-gap-3 { grid-column-gap: 0.75rem !important; -moz-column-gap: 0.75rem !important; column-gap: 0.75rem !important; } .lt-lg\:col-gap-4 { grid-column-gap: 1rem !important; -moz-column-gap: 1rem !important; column-gap: 1rem !important; } .lt-lg\:col-gap-5 { grid-column-gap: 1.25rem !important; -moz-column-gap: 1.25rem !important; column-gap: 1.25rem !important; } .lt-lg\:col-gap-6 { grid-column-gap: 1.5rem !important; -moz-column-gap: 1.5rem !important; column-gap: 1.5rem !important; } .lt-lg\:col-gap-8 { grid-column-gap: 2rem !important; -moz-column-gap: 2rem !important; column-gap: 2rem !important; } .lt-lg\:col-gap-10 { grid-column-gap: 2.5rem !important; -moz-column-gap: 2.5rem !important; column-gap: 2.5rem !important; } .lt-lg\:col-gap-12 { grid-column-gap: 3rem !important; -moz-column-gap: 3rem !important; column-gap: 3rem !important; } .lt-lg\:col-gap-14 { grid-column-gap: 3.5rem !important; -moz-column-gap: 3.5rem !important; column-gap: 3.5rem !important; } .lt-lg\:col-gap-16 { grid-column-gap: 4rem !important; -moz-column-gap: 4rem !important; column-gap: 4rem !important; } .lt-lg\:col-gap-18 { grid-column-gap: 4.5rem !important; -moz-column-gap: 4.5rem !important; column-gap: 4.5rem !important; } .lt-lg\:col-gap-20 { grid-column-gap: 5rem !important; -moz-column-gap: 5rem !important; column-gap: 5rem !important; } .lt-lg\:col-gap-22 { grid-column-gap: 5.5rem !important; -moz-column-gap: 5.5rem !important; column-gap: 5.5rem !important; } .lt-lg\:col-gap-24 { grid-column-gap: 6rem !important; -moz-column-gap: 6rem !important; column-gap: 6rem !important; } .lt-lg\:col-gap-26 { grid-column-gap: 6.5rem !important; -moz-column-gap: 6.5rem !important; column-gap: 6.5rem !important; } .lt-lg\:col-gap-28 { grid-column-gap: 7rem !important; -moz-column-gap: 7rem !important; column-gap: 7rem !important; } .lt-lg\:col-gap-30 { grid-column-gap: 7.5rem !important; -moz-column-gap: 7.5rem !important; column-gap: 7.5rem !important; } .lt-lg\:col-gap-32 { grid-column-gap: 8rem !important; -moz-column-gap: 8rem !important; column-gap: 8rem !important; } .lt-lg\:col-gap-36 { grid-column-gap: 9rem !important; -moz-column-gap: 9rem !important; column-gap: 9rem !important; } .lt-lg\:col-gap-40 { grid-column-gap: 10rem !important; -moz-column-gap: 10rem !important; column-gap: 10rem !important; } .lt-lg\:col-gap-48 { grid-column-gap: 12rem !important; -moz-column-gap: 12rem !important; column-gap: 12rem !important; } .lt-lg\:col-gap-56 { grid-column-gap: 14rem !important; -moz-column-gap: 14rem !important; column-gap: 14rem !important; } .lt-lg\:col-gap-64 { grid-column-gap: 16rem !important; -moz-column-gap: 16rem !important; column-gap: 16rem !important; } .lt-lg\:col-gap-px { grid-column-gap: 1px !important; -moz-column-gap: 1px !important; column-gap: 1px !important; } .lt-lg\:col-gap-2px { grid-column-gap: 2px !important; -moz-column-gap: 2px !important; column-gap: 2px !important; } .lt-lg\:row-gap-0 { grid-row-gap: 0 !important; row-gap: 0 !important; } .lt-lg\:row-gap-1 { grid-row-gap: 0.25rem !important; row-gap: 0.25rem !important; } .lt-lg\:row-gap-2 { grid-row-gap: 0.5rem !important; row-gap: 0.5rem !important; } .lt-lg\:row-gap-3 { grid-row-gap: 0.75rem !important; row-gap: 0.75rem !important; } .lt-lg\:row-gap-4 { grid-row-gap: 1rem !important; row-gap: 1rem !important; } .lt-lg\:row-gap-5 { grid-row-gap: 1.25rem !important; row-gap: 1.25rem !important; } .lt-lg\:row-gap-6 { grid-row-gap: 1.5rem !important; row-gap: 1.5rem !important; } .lt-lg\:row-gap-8 { grid-row-gap: 2rem !important; row-gap: 2rem !important; } .lt-lg\:row-gap-10 { grid-row-gap: 2.5rem !important; row-gap: 2.5rem !important; } .lt-lg\:row-gap-12 { grid-row-gap: 3rem !important; row-gap: 3rem !important; } .lt-lg\:row-gap-14 { grid-row-gap: 3.5rem !important; row-gap: 3.5rem !important; } .lt-lg\:row-gap-16 { grid-row-gap: 4rem !important; row-gap: 4rem !important; } .lt-lg\:row-gap-18 { grid-row-gap: 4.5rem !important; row-gap: 4.5rem !important; } .lt-lg\:row-gap-20 { grid-row-gap: 5rem !important; row-gap: 5rem !important; } .lt-lg\:row-gap-22 { grid-row-gap: 5.5rem !important; row-gap: 5.5rem !important; } .lt-lg\:row-gap-24 { grid-row-gap: 6rem !important; row-gap: 6rem !important; } .lt-lg\:row-gap-26 { grid-row-gap: 6.5rem !important; row-gap: 6.5rem !important; } .lt-lg\:row-gap-28 { grid-row-gap: 7rem !important; row-gap: 7rem !important; } .lt-lg\:row-gap-30 { grid-row-gap: 7.5rem !important; row-gap: 7.5rem !important; } .lt-lg\:row-gap-32 { grid-row-gap: 8rem !important; row-gap: 8rem !important; } .lt-lg\:row-gap-36 { grid-row-gap: 9rem !important; row-gap: 9rem !important; } .lt-lg\:row-gap-40 { grid-row-gap: 10rem !important; row-gap: 10rem !important; } .lt-lg\:row-gap-48 { grid-row-gap: 12rem !important; row-gap: 12rem !important; } .lt-lg\:row-gap-56 { grid-row-gap: 14rem !important; row-gap: 14rem !important; } .lt-lg\:row-gap-64 { grid-row-gap: 16rem !important; row-gap: 16rem !important; } .lt-lg\:row-gap-px { grid-row-gap: 1px !important; row-gap: 1px !important; } .lt-lg\:row-gap-2px { grid-row-gap: 2px !important; row-gap: 2px !important; } .lt-lg\:grid-flow-row { grid-auto-flow: row !important; } .lt-lg\:grid-flow-col { grid-auto-flow: column !important; } .lt-lg\:grid-flow-row-dense { grid-auto-flow: row dense !important; } .lt-lg\:grid-flow-col-dense { grid-auto-flow: column dense !important; } .lt-lg\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; } .lt-lg\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } .lt-lg\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; } .lt-lg\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; } .lt-lg\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; } .lt-lg\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; } .lt-lg\:grid-cols-7 { grid-template-columns: repeat(7, minmax(0, 1fr)) !important; } .lt-lg\:grid-cols-8 { grid-template-columns: repeat(8, minmax(0, 1fr)) !important; } .lt-lg\:grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)) !important; } .lt-lg\:grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)) !important; } .lt-lg\:grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)) !important; } .lt-lg\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)) !important; } .lt-lg\:grid-cols-none { grid-template-columns: none !important; } .lt-lg\:col-auto { grid-column: auto !important; } .lt-lg\:col-span-1 { grid-column: span 1 / span 1 !important; } .lt-lg\:col-span-2 { grid-column: span 2 / span 2 !important; } .lt-lg\:col-span-3 { grid-column: span 3 / span 3 !important; } .lt-lg\:col-span-4 { grid-column: span 4 / span 4 !important; } .lt-lg\:col-span-5 { grid-column: span 5 / span 5 !important; } .lt-lg\:col-span-6 { grid-column: span 6 / span 6 !important; } .lt-lg\:col-span-7 { grid-column: span 7 / span 7 !important; } .lt-lg\:col-span-8 { grid-column: span 8 / span 8 !important; } .lt-lg\:col-span-9 { grid-column: span 9 / span 9 !important; } .lt-lg\:col-span-10 { grid-column: span 10 / span 10 !important; } .lt-lg\:col-span-11 { grid-column: span 11 / span 11 !important; } .lt-lg\:col-span-12 { grid-column: span 12 / span 12 !important; } .lt-lg\:col-start-1 { grid-column-start: 1 !important; } .lt-lg\:col-start-2 { grid-column-start: 2 !important; } .lt-lg\:col-start-3 { grid-column-start: 3 !important; } .lt-lg\:col-start-4 { grid-column-start: 4 !important; } .lt-lg\:col-start-5 { grid-column-start: 5 !important; } .lt-lg\:col-start-6 { grid-column-start: 6 !important; } .lt-lg\:col-start-7 { grid-column-start: 7 !important; } .lt-lg\:col-start-8 { grid-column-start: 8 !important; } .lt-lg\:col-start-9 { grid-column-start: 9 !important; } .lt-lg\:col-start-10 { grid-column-start: 10 !important; } .lt-lg\:col-start-11 { grid-column-start: 11 !important; } .lt-lg\:col-start-12 { grid-column-start: 12 !important; } .lt-lg\:col-start-13 { grid-column-start: 13 !important; } .lt-lg\:col-start-auto { grid-column-start: auto !important; } .lt-lg\:col-end-1 { grid-column-end: 1 !important; } .lt-lg\:col-end-2 { grid-column-end: 2 !important; } .lt-lg\:col-end-3 { grid-column-end: 3 !important; } .lt-lg\:col-end-4 { grid-column-end: 4 !important; } .lt-lg\:col-end-5 { grid-column-end: 5 !important; } .lt-lg\:col-end-6 { grid-column-end: 6 !important; } .lt-lg\:col-end-7 { grid-column-end: 7 !important; } .lt-lg\:col-end-8 { grid-column-end: 8 !important; } .lt-lg\:col-end-9 { grid-column-end: 9 !important; } .lt-lg\:col-end-10 { grid-column-end: 10 !important; } .lt-lg\:col-end-11 { grid-column-end: 11 !important; } .lt-lg\:col-end-12 { grid-column-end: 12 !important; } .lt-lg\:col-end-13 { grid-column-end: 13 !important; } .lt-lg\:col-end-auto { grid-column-end: auto !important; } .lt-lg\:grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)) !important; } .lt-lg\:grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)) !important; } .lt-lg\:grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)) !important; } .lt-lg\:grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)) !important; } .lt-lg\:grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)) !important; } .lt-lg\:grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)) !important; } .lt-lg\:grid-rows-none { grid-template-rows: none !important; } .lt-lg\:row-auto { grid-row: auto !important; } .lt-lg\:row-span-1 { grid-row: span 1 / span 1 !important; } .lt-lg\:row-span-2 { grid-row: span 2 / span 2 !important; } .lt-lg\:row-span-3 { grid-row: span 3 / span 3 !important; } .lt-lg\:row-span-4 { grid-row: span 4 / span 4 !important; } .lt-lg\:row-span-5 { grid-row: span 5 / span 5 !important; } .lt-lg\:row-span-6 { grid-row: span 6 / span 6 !important; } .lt-lg\:row-start-1 { grid-row-start: 1 !important; } .lt-lg\:row-start-2 { grid-row-start: 2 !important; } .lt-lg\:row-start-3 { grid-row-start: 3 !important; } .lt-lg\:row-start-4 { grid-row-start: 4 !important; } .lt-lg\:row-start-5 { grid-row-start: 5 !important; } .lt-lg\:row-start-6 { grid-row-start: 6 !important; } .lt-lg\:row-start-7 { grid-row-start: 7 !important; } .lt-lg\:row-start-auto { grid-row-start: auto !important; } .lt-lg\:row-end-1 { grid-row-end: 1 !important; } .lt-lg\:row-end-2 { grid-row-end: 2 !important; } .lt-lg\:row-end-3 { grid-row-end: 3 !important; } .lt-lg\:row-end-4 { grid-row-end: 4 !important; } .lt-lg\:row-end-5 { grid-row-end: 5 !important; } .lt-lg\:row-end-6 { grid-row-end: 6 !important; } .lt-lg\:row-end-7 { grid-row-end: 7 !important; } .lt-lg\:row-end-auto { grid-row-end: auto !important; } .lt-lg\:transform { --transform-translate-x: 0 !important; --transform-translate-y: 0 !important; --transform-rotate: 0 !important; --transform-skew-x: 0 !important; --transform-skew-y: 0 !important; --transform-scale-x: 1 !important; --transform-scale-y: 1 !important; transform: translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y)) !important; } .lt-lg\:transform-none { transform: none !important; } .lt-lg\:origin-center { transform-origin: center !important; } .lt-lg\:origin-top { transform-origin: top !important; } .lt-lg\:origin-top-right { transform-origin: top right !important; } .lt-lg\:origin-right { transform-origin: right !important; } .lt-lg\:origin-bottom-right { transform-origin: bottom right !important; } .lt-lg\:origin-bottom { transform-origin: bottom !important; } .lt-lg\:origin-bottom-left { transform-origin: bottom left !important; } .lt-lg\:origin-left { transform-origin: left !important; } .lt-lg\:origin-top-left { transform-origin: top left !important; } .lt-lg\:icon-size-12 { width: 12px !important; height: 12px !important; min-width: 12px !important; min-height: 12px !important; font-size: 12px !important; line-height: 12px !important; } .lt-lg\:icon-size-12 svg { width: 12px !important; height: 12px !important; } .lt-lg\:icon-size-14 { width: 14px !important; height: 14px !important; min-width: 14px !important; min-height: 14px !important; font-size: 14px !important; line-height: 14px !important; } .lt-lg\:icon-size-14 svg { width: 14px !important; height: 14px !important; } .lt-lg\:icon-size-16 { width: 16px !important; height: 16px !important; min-width: 16px !important; min-height: 16px !important; font-size: 16px !important; line-height: 16px !important; } .lt-lg\:icon-size-16 svg { width: 16px !important; height: 16px !important; } .lt-lg\:icon-size-18 { width: 18px !important; height: 18px !important; min-width: 18px !important; min-height: 18px !important; font-size: 18px !important; line-height: 18px !important; } .lt-lg\:icon-size-18 svg { width: 18px !important; height: 18px !important; } .lt-lg\:icon-size-20 { width: 20px !important; height: 20px !important; min-width: 20px !important; min-height: 20px !important; font-size: 20px !important; line-height: 20px !important; } .lt-lg\:icon-size-20 svg { width: 20px !important; height: 20px !important; } .lt-lg\:icon-size-24 { width: 24px !important; height: 24px !important; min-width: 24px !important; min-height: 24px !important; font-size: 24px !important; line-height: 24px !important; } .lt-lg\:icon-size-24 svg { width: 24px !important; height: 24px !important; } .lt-lg\:icon-size-32 { width: 32px !important; height: 32px !important; min-width: 32px !important; min-height: 32px !important; font-size: 32px !important; line-height: 32px !important; } .lt-lg\:icon-size-32 svg { width: 32px !important; height: 32px !important; } .lt-lg\:icon-size-40 { width: 40px !important; height: 40px !important; min-width: 40px !important; min-height: 40px !important; font-size: 40px !important; line-height: 40px !important; } .lt-lg\:icon-size-40 svg { width: 40px !important; height: 40px !important; } .lt-lg\:icon-size-48 { width: 48px !important; height: 48px !important; min-width: 48px !important; min-height: 48px !important; font-size: 48px !important; line-height: 48px !important; } .lt-lg\:icon-size-48 svg { width: 48px !important; height: 48px !important; } .lt-lg\:icon-size-56 { width: 56px !important; height: 56px !important; min-width: 56px !important; min-height: 56px !important; font-size: 56px !important; line-height: 56px !important; } .lt-lg\:icon-size-56 svg { width: 56px !important; height: 56px !important; } .lt-lg\:icon-size-64 { width: 64px !important; height: 64px !important; min-width: 64px !important; min-height: 64px !important; font-size: 64px !important; line-height: 64px !important; } .lt-lg\:icon-size-64 svg { width: 64px !important; height: 64px !important; } .lt-lg\:icon-size-72 { width: 72px !important; height: 72px !important; min-width: 72px !important; min-height: 72px !important; font-size: 72px !important; line-height: 72px !important; } .lt-lg\:icon-size-72 svg { width: 72px !important; height: 72px !important; } .lt-lg\:icon-size-80 { width: 80px !important; height: 80px !important; min-width: 80px !important; min-height: 80px !important; font-size: 80px !important; line-height: 80px !important; } .lt-lg\:icon-size-80 svg { width: 80px !important; height: 80px !important; } .lt-lg\:icon-size-88 { width: 88px !important; height: 88px !important; min-width: 88px !important; min-height: 88px !important; font-size: 88px !important; line-height: 88px !important; } .lt-lg\:icon-size-88 svg { width: 88px !important; height: 88px !important; } .lt-lg\:icon-size-96 { width: 96px !important; height: 96px !important; min-width: 96px !important; min-height: 96px !important; font-size: 96px !important; line-height: 96px !important; } .lt-lg\:icon-size-96 svg { width: 96px !important; height: 96px !important; } } @media (max-width: 1439px) { .lt-xl\:space-y-0 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0px * var(--space-y-reverse)) !important; } .lt-xl\:space-x-0 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0px * var(--space-x-reverse)) !important; margin-left: calc(0px * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.25rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.25rem * var(--space-x-reverse)) !important; margin-left: calc(0.25rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.5rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.5rem * var(--space-x-reverse)) !important; margin-left: calc(0.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.75rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.75rem * var(--space-x-reverse)) !important; margin-left: calc(0.75rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1rem * var(--space-x-reverse)) !important; margin-left: calc(1rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.25rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.25rem * var(--space-x-reverse)) !important; margin-left: calc(1.25rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.5rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.5rem * var(--space-x-reverse)) !important; margin-left: calc(1.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2rem * var(--space-x-reverse)) !important; margin-left: calc(2rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2.5rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2.5rem * var(--space-x-reverse)) !important; margin-left: calc(2.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3rem * var(--space-x-reverse)) !important; margin-left: calc(3rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3.5rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3.5rem * var(--space-x-reverse)) !important; margin-left: calc(3.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4rem * var(--space-x-reverse)) !important; margin-left: calc(4rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4.5rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4.5rem * var(--space-x-reverse)) !important; margin-left: calc(4.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5rem * var(--space-x-reverse)) !important; margin-left: calc(5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5.5rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5.5rem * var(--space-x-reverse)) !important; margin-left: calc(5.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6rem * var(--space-x-reverse)) !important; margin-left: calc(6rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6.5rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6.5rem * var(--space-x-reverse)) !important; margin-left: calc(6.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7rem * var(--space-x-reverse)) !important; margin-left: calc(7rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7.5rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7.5rem * var(--space-x-reverse)) !important; margin-left: calc(7.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(8rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(8rem * var(--space-x-reverse)) !important; margin-left: calc(8rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(9rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(9rem * var(--space-x-reverse)) !important; margin-left: calc(9rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(10rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(10rem * var(--space-x-reverse)) !important; margin-left: calc(10rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(12rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(12rem * var(--space-x-reverse)) !important; margin-left: calc(12rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(14rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(14rem * var(--space-x-reverse)) !important; margin-left: calc(14rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(16rem * var(--space-y-reverse)) !important; } .lt-xl\:space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(16rem * var(--space-x-reverse)) !important; margin-left: calc(16rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1px * var(--space-y-reverse)) !important; } .lt-xl\:space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1px * var(--space-x-reverse)) !important; margin-left: calc(1px * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2px * var(--space-y-reverse)) !important; } .lt-xl\:space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2px * var(--space-x-reverse)) !important; margin-left: calc(2px * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.25rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.25rem * var(--space-x-reverse)) !important; margin-left: calc(-0.25rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.5rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.5rem * var(--space-x-reverse)) !important; margin-left: calc(-0.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.75rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.75rem * var(--space-x-reverse)) !important; margin-left: calc(-0.75rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1rem * var(--space-x-reverse)) !important; margin-left: calc(-1rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.25rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.25rem * var(--space-x-reverse)) !important; margin-left: calc(-1.25rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.5rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.5rem * var(--space-x-reverse)) !important; margin-left: calc(-1.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2rem * var(--space-x-reverse)) !important; margin-left: calc(-2rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2.5rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2.5rem * var(--space-x-reverse)) !important; margin-left: calc(-2.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3rem * var(--space-x-reverse)) !important; margin-left: calc(-3rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3.5rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3.5rem * var(--space-x-reverse)) !important; margin-left: calc(-3.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4rem * var(--space-x-reverse)) !important; margin-left: calc(-4rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4.5rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4.5rem * var(--space-x-reverse)) !important; margin-left: calc(-4.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5rem * var(--space-x-reverse)) !important; margin-left: calc(-5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5.5rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5.5rem * var(--space-x-reverse)) !important; margin-left: calc(-5.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6rem * var(--space-x-reverse)) !important; margin-left: calc(-6rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6.5rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6.5rem * var(--space-x-reverse)) !important; margin-left: calc(-6.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7rem * var(--space-x-reverse)) !important; margin-left: calc(-7rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7.5rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7.5rem * var(--space-x-reverse)) !important; margin-left: calc(-7.5rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-8rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-8rem * var(--space-x-reverse)) !important; margin-left: calc(-8rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-9rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-9rem * var(--space-x-reverse)) !important; margin-left: calc(-9rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-10rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-10rem * var(--space-x-reverse)) !important; margin-left: calc(-10rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-12rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-12rem * var(--space-x-reverse)) !important; margin-left: calc(-12rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-14rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-14rem * var(--space-x-reverse)) !important; margin-left: calc(-14rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-16rem * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-16rem * var(--space-x-reverse)) !important; margin-left: calc(-16rem * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1px * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1px * var(--space-x-reverse)) !important; margin-left: calc(-1px * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:-space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2px * var(--space-y-reverse)) !important; } .lt-xl\:-space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2px * var(--space-x-reverse)) !important; margin-left: calc(-2px * calc(1 - var(--space-x-reverse))) !important; } .lt-xl\:space-y-reverse > :not(template) ~ :not(template) { --space-y-reverse: 1 !important; } .lt-xl\:space-x-reverse > :not(template) ~ :not(template) { --space-x-reverse: 1 !important; } .lt-xl\:divide-y-0 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(0px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(0px * var(--divide-y-reverse)) !important; } .lt-xl\:divide-x-0 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(0px * var(--divide-x-reverse)) !important; border-left-width: calc(0px * calc(1 - var(--divide-x-reverse))) !important; } .lt-xl\:divide-y-2 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(2px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(2px * var(--divide-y-reverse)) !important; } .lt-xl\:divide-x-2 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(2px * var(--divide-x-reverse)) !important; border-left-width: calc(2px * calc(1 - var(--divide-x-reverse))) !important; } .lt-xl\:divide-y-4 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(4px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(4px * var(--divide-y-reverse)) !important; } .lt-xl\:divide-x-4 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(4px * var(--divide-x-reverse)) !important; border-left-width: calc(4px * calc(1 - var(--divide-x-reverse))) !important; } .lt-xl\:divide-y-8 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(8px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(8px * var(--divide-y-reverse)) !important; } .lt-xl\:divide-x-8 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(8px * var(--divide-x-reverse)) !important; border-left-width: calc(8px * calc(1 - var(--divide-x-reverse))) !important; } .lt-xl\:divide-y > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(1px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(1px * var(--divide-y-reverse)) !important; } .lt-xl\:divide-x > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(1px * var(--divide-x-reverse)) !important; border-left-width: calc(1px * calc(1 - var(--divide-x-reverse))) !important; } .lt-xl\:divide-y-reverse > :not(template) ~ :not(template) { --divide-y-reverse: 1 !important; } .lt-xl\:divide-x-reverse > :not(template) ~ :not(template) { --divide-x-reverse: 1 !important; } .lt-xl\:divide-current > :not(template) ~ :not(template) { border-color: currentColor !important; } .lt-xl\:divide-transparent > :not(template) ~ :not(template) { border-color: transparent !important; } .lt-xl\:divide-white > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFFFFF !important; border-color: rgba(255, 255, 255, var(--divide-opacity)) !important; } .lt-xl\:divide-black > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #000000 !important; border-color: rgba(0, 0, 0, var(--divide-opacity)) !important; } .lt-xl\:divide-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F9FAFB !important; border-color: rgba(249, 250, 251, var(--divide-opacity)) !important; } .lt-xl\:divide-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F4F5F7 !important; border-color: rgba(244, 245, 247, var(--divide-opacity)) !important; } .lt-xl\:divide-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5E7EB !important; border-color: rgba(229, 231, 235, var(--divide-opacity)) !important; } .lt-xl\:divide-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D2D6DC !important; border-color: rgba(210, 214, 220, var(--divide-opacity)) !important; } .lt-xl\:divide-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9FA6B2 !important; border-color: rgba(159, 166, 178, var(--divide-opacity)) !important; } .lt-xl\:divide-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .lt-xl\:divide-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4B5563 !important; border-color: rgba(75, 85, 99, var(--divide-opacity)) !important; } .lt-xl\:divide-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #374151 !important; border-color: rgba(55, 65, 81, var(--divide-opacity)) !important; } .lt-xl\:divide-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #252F3F !important; border-color: rgba(37, 47, 63, var(--divide-opacity)) !important; } .lt-xl\:divide-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #161E2E !important; border-color: rgba(22, 30, 46, var(--divide-opacity)) !important; } .lt-xl\:divide-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .lt-xl\:divide-cool-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBFDFE !important; border-color: rgba(251, 253, 254, var(--divide-opacity)) !important; } .lt-xl\:divide-cool-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F1F5F9 !important; border-color: rgba(241, 245, 249, var(--divide-opacity)) !important; } .lt-xl\:divide-cool-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E2E8F0 !important; border-color: rgba(226, 232, 240, var(--divide-opacity)) !important; } .lt-xl\:divide-cool-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CFD8E3 !important; border-color: rgba(207, 216, 227, var(--divide-opacity)) !important; } .lt-xl\:divide-cool-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #97A6BA !important; border-color: rgba(151, 166, 186, var(--divide-opacity)) !important; } .lt-xl\:divide-cool-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .lt-xl\:divide-cool-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #475569 !important; border-color: rgba(71, 85, 105, var(--divide-opacity)) !important; } .lt-xl\:divide-cool-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #364152 !important; border-color: rgba(54, 65, 82, var(--divide-opacity)) !important; } .lt-xl\:divide-cool-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #27303F !important; border-color: rgba(39, 48, 63, var(--divide-opacity)) !important; } .lt-xl\:divide-cool-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A202E !important; border-color: rgba(26, 32, 46, var(--divide-opacity)) !important; } .lt-xl\:divide-cool-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .lt-xl\:divide-red-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F2 !important; border-color: rgba(253, 242, 242, var(--divide-opacity)) !important; } .lt-xl\:divide-red-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDE8E8 !important; border-color: rgba(253, 232, 232, var(--divide-opacity)) !important; } .lt-xl\:divide-red-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBD5D5 !important; border-color: rgba(251, 213, 213, var(--divide-opacity)) !important; } .lt-xl\:divide-red-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4B4 !important; border-color: rgba(248, 180, 180, var(--divide-opacity)) !important; } .lt-xl\:divide-red-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F98080 !important; border-color: rgba(249, 128, 128, var(--divide-opacity)) !important; } .lt-xl\:divide-red-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .lt-xl\:divide-red-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E02424 !important; border-color: rgba(224, 36, 36, var(--divide-opacity)) !important; } .lt-xl\:divide-red-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C81E1E !important; border-color: rgba(200, 30, 30, var(--divide-opacity)) !important; } .lt-xl\:divide-red-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9B1C1C !important; border-color: rgba(155, 28, 28, var(--divide-opacity)) !important; } .lt-xl\:divide-red-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .lt-xl\:divide-red > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .lt-xl\:divide-orange-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFF8F1 !important; border-color: rgba(255, 248, 241, var(--divide-opacity)) !important; } .lt-xl\:divide-orange-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FEECDC !important; border-color: rgba(254, 236, 220, var(--divide-opacity)) !important; } .lt-xl\:divide-orange-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCD9BD !important; border-color: rgba(252, 217, 189, var(--divide-opacity)) !important; } .lt-xl\:divide-orange-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDBA8C !important; border-color: rgba(253, 186, 140, var(--divide-opacity)) !important; } .lt-xl\:divide-orange-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF8A4C !important; border-color: rgba(255, 138, 76, var(--divide-opacity)) !important; } .lt-xl\:divide-orange-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .lt-xl\:divide-orange-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D03801 !important; border-color: rgba(208, 56, 1, var(--divide-opacity)) !important; } .lt-xl\:divide-orange-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B43403 !important; border-color: rgba(180, 52, 3, var(--divide-opacity)) !important; } .lt-xl\:divide-orange-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8A2C0D !important; border-color: rgba(138, 44, 13, var(--divide-opacity)) !important; } .lt-xl\:divide-orange-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .lt-xl\:divide-orange > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .lt-xl\:divide-yellow-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDFDEA !important; border-color: rgba(253, 253, 234, var(--divide-opacity)) !important; } .lt-xl\:divide-yellow-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF6B2 !important; border-color: rgba(253, 246, 178, var(--divide-opacity)) !important; } .lt-xl\:divide-yellow-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE96A !important; border-color: rgba(252, 233, 106, var(--divide-opacity)) !important; } .lt-xl\:divide-yellow-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FACA15 !important; border-color: rgba(250, 202, 21, var(--divide-opacity)) !important; } .lt-xl\:divide-yellow-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E3A008 !important; border-color: rgba(227, 160, 8, var(--divide-opacity)) !important; } .lt-xl\:divide-yellow-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .lt-xl\:divide-yellow-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9F580A !important; border-color: rgba(159, 88, 10, var(--divide-opacity)) !important; } .lt-xl\:divide-yellow-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8E4B10 !important; border-color: rgba(142, 75, 16, var(--divide-opacity)) !important; } .lt-xl\:divide-yellow-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #723B13 !important; border-color: rgba(114, 59, 19, var(--divide-opacity)) !important; } .lt-xl\:divide-yellow-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #633112 !important; border-color: rgba(99, 49, 18, var(--divide-opacity)) !important; } .lt-xl\:divide-yellow > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .lt-xl\:divide-green-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F3FAF7 !important; border-color: rgba(243, 250, 247, var(--divide-opacity)) !important; } .lt-xl\:divide-green-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DEF7EC !important; border-color: rgba(222, 247, 236, var(--divide-opacity)) !important; } .lt-xl\:divide-green-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BCF0DA !important; border-color: rgba(188, 240, 218, var(--divide-opacity)) !important; } .lt-xl\:divide-green-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #84E1BC !important; border-color: rgba(132, 225, 188, var(--divide-opacity)) !important; } .lt-xl\:divide-green-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #31C48D !important; border-color: rgba(49, 196, 141, var(--divide-opacity)) !important; } .lt-xl\:divide-green-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .lt-xl\:divide-green-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #057A55 !important; border-color: rgba(5, 122, 85, var(--divide-opacity)) !important; } .lt-xl\:divide-green-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #046C4E !important; border-color: rgba(4, 108, 78, var(--divide-opacity)) !important; } .lt-xl\:divide-green-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #03543F !important; border-color: rgba(3, 84, 63, var(--divide-opacity)) !important; } .lt-xl\:divide-green-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014737 !important; border-color: rgba(1, 71, 55, var(--divide-opacity)) !important; } .lt-xl\:divide-green > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .lt-xl\:divide-teal-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDFAFA !important; border-color: rgba(237, 250, 250, var(--divide-opacity)) !important; } .lt-xl\:divide-teal-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D5F5F6 !important; border-color: rgba(213, 245, 246, var(--divide-opacity)) !important; } .lt-xl\:divide-teal-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AFECEF !important; border-color: rgba(175, 236, 239, var(--divide-opacity)) !important; } .lt-xl\:divide-teal-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7EDCE2 !important; border-color: rgba(126, 220, 226, var(--divide-opacity)) !important; } .lt-xl\:divide-teal-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #16BDCA !important; border-color: rgba(22, 189, 202, var(--divide-opacity)) !important; } .lt-xl\:divide-teal-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .lt-xl\:divide-teal-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #047481 !important; border-color: rgba(4, 116, 129, var(--divide-opacity)) !important; } .lt-xl\:divide-teal-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #036672 !important; border-color: rgba(3, 102, 114, var(--divide-opacity)) !important; } .lt-xl\:divide-teal-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #05505C !important; border-color: rgba(5, 80, 92, var(--divide-opacity)) !important; } .lt-xl\:divide-teal-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014451 !important; border-color: rgba(1, 68, 81, var(--divide-opacity)) !important; } .lt-xl\:divide-teal > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .lt-xl\:divide-blue-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EBF5FF !important; border-color: rgba(235, 245, 255, var(--divide-opacity)) !important; } .lt-xl\:divide-blue-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E1EFFE !important; border-color: rgba(225, 239, 254, var(--divide-opacity)) !important; } .lt-xl\:divide-blue-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C3DDFD !important; border-color: rgba(195, 221, 253, var(--divide-opacity)) !important; } .lt-xl\:divide-blue-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #A4CAFE !important; border-color: rgba(164, 202, 254, var(--divide-opacity)) !important; } .lt-xl\:divide-blue-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #76A9FA !important; border-color: rgba(118, 169, 250, var(--divide-opacity)) !important; } .lt-xl\:divide-blue-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .lt-xl\:divide-blue-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1C64F2 !important; border-color: rgba(28, 100, 242, var(--divide-opacity)) !important; } .lt-xl\:divide-blue-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A56DB !important; border-color: rgba(26, 86, 219, var(--divide-opacity)) !important; } .lt-xl\:divide-blue-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1E429F !important; border-color: rgba(30, 66, 159, var(--divide-opacity)) !important; } .lt-xl\:divide-blue-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #233876 !important; border-color: rgba(35, 56, 118, var(--divide-opacity)) !important; } .lt-xl\:divide-blue > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .lt-xl\:divide-indigo-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F0F5FF !important; border-color: rgba(240, 245, 255, var(--divide-opacity)) !important; } .lt-xl\:divide-indigo-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5EDFF !important; border-color: rgba(229, 237, 255, var(--divide-opacity)) !important; } .lt-xl\:divide-indigo-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CDDBFE !important; border-color: rgba(205, 219, 254, var(--divide-opacity)) !important; } .lt-xl\:divide-indigo-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B4C6FC !important; border-color: rgba(180, 198, 252, var(--divide-opacity)) !important; } .lt-xl\:divide-indigo-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8DA2FB !important; border-color: rgba(141, 162, 251, var(--divide-opacity)) !important; } .lt-xl\:divide-indigo-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .lt-xl\:divide-indigo-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5850EC !important; border-color: rgba(88, 80, 236, var(--divide-opacity)) !important; } .lt-xl\:divide-indigo-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5145CD !important; border-color: rgba(81, 69, 205, var(--divide-opacity)) !important; } .lt-xl\:divide-indigo-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #42389D !important; border-color: rgba(66, 56, 157, var(--divide-opacity)) !important; } .lt-xl\:divide-indigo-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #362F78 !important; border-color: rgba(54, 47, 120, var(--divide-opacity)) !important; } .lt-xl\:divide-indigo > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .lt-xl\:divide-purple-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F6F5FF !important; border-color: rgba(246, 245, 255, var(--divide-opacity)) !important; } .lt-xl\:divide-purple-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDEBFE !important; border-color: rgba(237, 235, 254, var(--divide-opacity)) !important; } .lt-xl\:divide-purple-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DCD7FE !important; border-color: rgba(220, 215, 254, var(--divide-opacity)) !important; } .lt-xl\:divide-purple-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CABFFD !important; border-color: rgba(202, 191, 253, var(--divide-opacity)) !important; } .lt-xl\:divide-purple-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AC94FA !important; border-color: rgba(172, 148, 250, var(--divide-opacity)) !important; } .lt-xl\:divide-purple-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .lt-xl\:divide-purple-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7E3AF2 !important; border-color: rgba(126, 58, 242, var(--divide-opacity)) !important; } .lt-xl\:divide-purple-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6C2BD9 !important; border-color: rgba(108, 43, 217, var(--divide-opacity)) !important; } .lt-xl\:divide-purple-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5521B5 !important; border-color: rgba(85, 33, 181, var(--divide-opacity)) !important; } .lt-xl\:divide-purple-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4A1D96 !important; border-color: rgba(74, 29, 150, var(--divide-opacity)) !important; } .lt-xl\:divide-purple > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .lt-xl\:divide-pink-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F8 !important; border-color: rgba(253, 242, 248, var(--divide-opacity)) !important; } .lt-xl\:divide-pink-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE8F3 !important; border-color: rgba(252, 232, 243, var(--divide-opacity)) !important; } .lt-xl\:divide-pink-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FAD1E8 !important; border-color: rgba(250, 209, 232, var(--divide-opacity)) !important; } .lt-xl\:divide-pink-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4D9 !important; border-color: rgba(248, 180, 217, var(--divide-opacity)) !important; } .lt-xl\:divide-pink-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F17EB8 !important; border-color: rgba(241, 126, 184, var(--divide-opacity)) !important; } .lt-xl\:divide-pink-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .lt-xl\:divide-pink-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D61F69 !important; border-color: rgba(214, 31, 105, var(--divide-opacity)) !important; } .lt-xl\:divide-pink-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BF125D !important; border-color: rgba(191, 18, 93, var(--divide-opacity)) !important; } .lt-xl\:divide-pink-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #99154B !important; border-color: rgba(153, 21, 75, var(--divide-opacity)) !important; } .lt-xl\:divide-pink-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #751A3D !important; border-color: rgba(117, 26, 61, var(--divide-opacity)) !important; } .lt-xl\:divide-pink > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .lt-xl\:divide-opacity-0 > :not(template) ~ :not(template) { --divide-opacity: 0 !important; } .lt-xl\:divide-opacity-12 > :not(template) ~ :not(template) { --divide-opacity: 0.12 !important; } .lt-xl\:divide-opacity-25 > :not(template) ~ :not(template) { --divide-opacity: 0.25 !important; } .lt-xl\:divide-opacity-38 > :not(template) ~ :not(template) { --divide-opacity: 0.38 !important; } .lt-xl\:divide-opacity-50 > :not(template) ~ :not(template) { --divide-opacity: 0.5 !important; } .lt-xl\:divide-opacity-54 > :not(template) ~ :not(template) { --divide-opacity: 0.54 !important; } .lt-xl\:divide-opacity-70 > :not(template) ~ :not(template) { --divide-opacity: 0.70 !important; } .lt-xl\:divide-opacity-75 > :not(template) ~ :not(template) { --divide-opacity: 0.75 !important; } .lt-xl\:divide-opacity-84 > :not(template) ~ :not(template) { --divide-opacity: 0.84 !important; } .lt-xl\:divide-opacity-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; } .lt-xl\:sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .lt-xl\:not-sr-only { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .lt-xl\:focus\:sr-only:focus { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .lt-xl\:focus\:not-sr-only:focus { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .lt-xl\:appearance-none { -webkit-appearance: none !important; -moz-appearance: none !important; appearance: none !important; } .lt-xl\:bg-fixed { background-attachment: fixed !important; } .lt-xl\:bg-local { background-attachment: local !important; } .lt-xl\:bg-scroll { background-attachment: scroll !important; } .lt-xl\:bg-opacity-0 { --bg-opacity: 0 !important; } .lt-xl\:bg-opacity-12 { --bg-opacity: 0.12 !important; } .lt-xl\:bg-opacity-25 { --bg-opacity: 0.25 !important; } .lt-xl\:bg-opacity-38 { --bg-opacity: 0.38 !important; } .lt-xl\:bg-opacity-50 { --bg-opacity: 0.5 !important; } .lt-xl\:bg-opacity-54 { --bg-opacity: 0.54 !important; } .lt-xl\:bg-opacity-70 { --bg-opacity: 0.70 !important; } .lt-xl\:bg-opacity-75 { --bg-opacity: 0.75 !important; } .lt-xl\:bg-opacity-84 { --bg-opacity: 0.84 !important; } .lt-xl\:bg-opacity-100 { --bg-opacity: 1 !important; } .lt-xl\:hover\:bg-opacity-0:hover { --bg-opacity: 0 !important; } .lt-xl\:hover\:bg-opacity-12:hover { --bg-opacity: 0.12 !important; } .lt-xl\:hover\:bg-opacity-25:hover { --bg-opacity: 0.25 !important; } .lt-xl\:hover\:bg-opacity-38:hover { --bg-opacity: 0.38 !important; } .lt-xl\:hover\:bg-opacity-50:hover { --bg-opacity: 0.5 !important; } .lt-xl\:hover\:bg-opacity-54:hover { --bg-opacity: 0.54 !important; } .lt-xl\:hover\:bg-opacity-70:hover { --bg-opacity: 0.70 !important; } .lt-xl\:hover\:bg-opacity-75:hover { --bg-opacity: 0.75 !important; } .lt-xl\:hover\:bg-opacity-84:hover { --bg-opacity: 0.84 !important; } .lt-xl\:hover\:bg-opacity-100:hover { --bg-opacity: 1 !important; } .lt-xl\:focus\:bg-opacity-0:focus { --bg-opacity: 0 !important; } .lt-xl\:focus\:bg-opacity-12:focus { --bg-opacity: 0.12 !important; } .lt-xl\:focus\:bg-opacity-25:focus { --bg-opacity: 0.25 !important; } .lt-xl\:focus\:bg-opacity-38:focus { --bg-opacity: 0.38 !important; } .lt-xl\:focus\:bg-opacity-50:focus { --bg-opacity: 0.5 !important; } .lt-xl\:focus\:bg-opacity-54:focus { --bg-opacity: 0.54 !important; } .lt-xl\:focus\:bg-opacity-70:focus { --bg-opacity: 0.70 !important; } .lt-xl\:focus\:bg-opacity-75:focus { --bg-opacity: 0.75 !important; } .lt-xl\:focus\:bg-opacity-84:focus { --bg-opacity: 0.84 !important; } .lt-xl\:focus\:bg-opacity-100:focus { --bg-opacity: 1 !important; } .lt-xl\:bg-bottom { background-position: bottom !important; } .lt-xl\:bg-center { background-position: center !important; } .lt-xl\:bg-left { background-position: left !important; } .lt-xl\:bg-left-bottom { background-position: left bottom !important; } .lt-xl\:bg-left-top { background-position: left top !important; } .lt-xl\:bg-right { background-position: right !important; } .lt-xl\:bg-right-bottom { background-position: right bottom !important; } .lt-xl\:bg-right-top { background-position: right top !important; } .lt-xl\:bg-top { background-position: top !important; } .lt-xl\:bg-repeat { background-repeat: repeat !important; } .lt-xl\:bg-no-repeat { background-repeat: no-repeat !important; } .lt-xl\:bg-repeat-x { background-repeat: repeat-x !important; } .lt-xl\:bg-repeat-y { background-repeat: repeat-y !important; } .lt-xl\:bg-repeat-round { background-repeat: round !important; } .lt-xl\:bg-repeat-space { background-repeat: space !important; } .lt-xl\:bg-auto { background-size: auto !important; } .lt-xl\:bg-cover { background-size: cover !important; } .lt-xl\:bg-contain { background-size: contain !important; } .lt-xl\:border-collapse { border-collapse: collapse !important; } .lt-xl\:border-separate { border-collapse: separate !important; } .lt-xl\:border-opacity-0 { --border-opacity: 0 !important; } .lt-xl\:border-opacity-12 { --border-opacity: 0.12 !important; } .lt-xl\:border-opacity-25 { --border-opacity: 0.25 !important; } .lt-xl\:border-opacity-38 { --border-opacity: 0.38 !important; } .lt-xl\:border-opacity-50 { --border-opacity: 0.5 !important; } .lt-xl\:border-opacity-54 { --border-opacity: 0.54 !important; } .lt-xl\:border-opacity-70 { --border-opacity: 0.70 !important; } .lt-xl\:border-opacity-75 { --border-opacity: 0.75 !important; } .lt-xl\:border-opacity-84 { --border-opacity: 0.84 !important; } .lt-xl\:border-opacity-100 { --border-opacity: 1 !important; } .lt-xl\:hover\:border-opacity-0:hover { --border-opacity: 0 !important; } .lt-xl\:hover\:border-opacity-12:hover { --border-opacity: 0.12 !important; } .lt-xl\:hover\:border-opacity-25:hover { --border-opacity: 0.25 !important; } .lt-xl\:hover\:border-opacity-38:hover { --border-opacity: 0.38 !important; } .lt-xl\:hover\:border-opacity-50:hover { --border-opacity: 0.5 !important; } .lt-xl\:hover\:border-opacity-54:hover { --border-opacity: 0.54 !important; } .lt-xl\:hover\:border-opacity-70:hover { --border-opacity: 0.70 !important; } .lt-xl\:hover\:border-opacity-75:hover { --border-opacity: 0.75 !important; } .lt-xl\:hover\:border-opacity-84:hover { --border-opacity: 0.84 !important; } .lt-xl\:hover\:border-opacity-100:hover { --border-opacity: 1 !important; } .lt-xl\:focus\:border-opacity-0:focus { --border-opacity: 0 !important; } .lt-xl\:focus\:border-opacity-12:focus { --border-opacity: 0.12 !important; } .lt-xl\:focus\:border-opacity-25:focus { --border-opacity: 0.25 !important; } .lt-xl\:focus\:border-opacity-38:focus { --border-opacity: 0.38 !important; } .lt-xl\:focus\:border-opacity-50:focus { --border-opacity: 0.5 !important; } .lt-xl\:focus\:border-opacity-54:focus { --border-opacity: 0.54 !important; } .lt-xl\:focus\:border-opacity-70:focus { --border-opacity: 0.70 !important; } .lt-xl\:focus\:border-opacity-75:focus { --border-opacity: 0.75 !important; } .lt-xl\:focus\:border-opacity-84:focus { --border-opacity: 0.84 !important; } .lt-xl\:focus\:border-opacity-100:focus { --border-opacity: 1 !important; } .lt-xl\:rounded-none { border-radius: 0 !important; } .lt-xl\:rounded-sm { border-radius: 0.125rem !important; } .lt-xl\:rounded { border-radius: 0.25rem !important; } .lt-xl\:rounded-md { border-radius: 0.375rem !important; } .lt-xl\:rounded-lg { border-radius: 0.5rem !important; } .lt-xl\:rounded-full { border-radius: 9999px !important; } .lt-xl\:rounded-t-none { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } .lt-xl\:rounded-r-none { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } .lt-xl\:rounded-b-none { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } .lt-xl\:rounded-l-none { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; } .lt-xl\:rounded-t-sm { border-top-left-radius: 0.125rem !important; border-top-right-radius: 0.125rem !important; } .lt-xl\:rounded-r-sm { border-top-right-radius: 0.125rem !important; border-bottom-right-radius: 0.125rem !important; } .lt-xl\:rounded-b-sm { border-bottom-right-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .lt-xl\:rounded-l-sm { border-top-left-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .lt-xl\:rounded-t { border-top-left-radius: 0.25rem !important; border-top-right-radius: 0.25rem !important; } .lt-xl\:rounded-r { border-top-right-radius: 0.25rem !important; border-bottom-right-radius: 0.25rem !important; } .lt-xl\:rounded-b { border-bottom-right-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .lt-xl\:rounded-l { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .lt-xl\:rounded-t-md { border-top-left-radius: 0.375rem !important; border-top-right-radius: 0.375rem !important; } .lt-xl\:rounded-r-md { border-top-right-radius: 0.375rem !important; border-bottom-right-radius: 0.375rem !important; } .lt-xl\:rounded-b-md { border-bottom-right-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .lt-xl\:rounded-l-md { border-top-left-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .lt-xl\:rounded-t-lg { border-top-left-radius: 0.5rem !important; border-top-right-radius: 0.5rem !important; } .lt-xl\:rounded-r-lg { border-top-right-radius: 0.5rem !important; border-bottom-right-radius: 0.5rem !important; } .lt-xl\:rounded-b-lg { border-bottom-right-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .lt-xl\:rounded-l-lg { border-top-left-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .lt-xl\:rounded-t-full { border-top-left-radius: 9999px !important; border-top-right-radius: 9999px !important; } .lt-xl\:rounded-r-full { border-top-right-radius: 9999px !important; border-bottom-right-radius: 9999px !important; } .lt-xl\:rounded-b-full { border-bottom-right-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .lt-xl\:rounded-l-full { border-top-left-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .lt-xl\:rounded-tl-none { border-top-left-radius: 0 !important; } .lt-xl\:rounded-tr-none { border-top-right-radius: 0 !important; } .lt-xl\:rounded-br-none { border-bottom-right-radius: 0 !important; } .lt-xl\:rounded-bl-none { border-bottom-left-radius: 0 !important; } .lt-xl\:rounded-tl-sm { border-top-left-radius: 0.125rem !important; } .lt-xl\:rounded-tr-sm { border-top-right-radius: 0.125rem !important; } .lt-xl\:rounded-br-sm { border-bottom-right-radius: 0.125rem !important; } .lt-xl\:rounded-bl-sm { border-bottom-left-radius: 0.125rem !important; } .lt-xl\:rounded-tl { border-top-left-radius: 0.25rem !important; } .lt-xl\:rounded-tr { border-top-right-radius: 0.25rem !important; } .lt-xl\:rounded-br { border-bottom-right-radius: 0.25rem !important; } .lt-xl\:rounded-bl { border-bottom-left-radius: 0.25rem !important; } .lt-xl\:rounded-tl-md { border-top-left-radius: 0.375rem !important; } .lt-xl\:rounded-tr-md { border-top-right-radius: 0.375rem !important; } .lt-xl\:rounded-br-md { border-bottom-right-radius: 0.375rem !important; } .lt-xl\:rounded-bl-md { border-bottom-left-radius: 0.375rem !important; } .lt-xl\:rounded-tl-lg { border-top-left-radius: 0.5rem !important; } .lt-xl\:rounded-tr-lg { border-top-right-radius: 0.5rem !important; } .lt-xl\:rounded-br-lg { border-bottom-right-radius: 0.5rem !important; } .lt-xl\:rounded-bl-lg { border-bottom-left-radius: 0.5rem !important; } .lt-xl\:rounded-tl-full { border-top-left-radius: 9999px !important; } .lt-xl\:rounded-tr-full { border-top-right-radius: 9999px !important; } .lt-xl\:rounded-br-full { border-bottom-right-radius: 9999px !important; } .lt-xl\:rounded-bl-full { border-bottom-left-radius: 9999px !important; } .lt-xl\:border-solid { border-style: solid !important; } .lt-xl\:border-dashed { border-style: dashed !important; } .lt-xl\:border-dotted { border-style: dotted !important; } .lt-xl\:border-double { border-style: double !important; } .lt-xl\:border-none { border-style: none !important; } .lt-xl\:border-0 { border-width: 0 !important; } .lt-xl\:border-2 { border-width: 2px !important; } .lt-xl\:border-4 { border-width: 4px !important; } .lt-xl\:border-8 { border-width: 8px !important; } .lt-xl\:border { border-width: 1px !important; } .lt-xl\:border-t-0 { border-top-width: 0 !important; } .lt-xl\:border-r-0 { border-right-width: 0 !important; } .lt-xl\:border-b-0 { border-bottom-width: 0 !important; } .lt-xl\:border-l-0 { border-left-width: 0 !important; } .lt-xl\:border-t-2 { border-top-width: 2px !important; } .lt-xl\:border-r-2 { border-right-width: 2px !important; } .lt-xl\:border-b-2 { border-bottom-width: 2px !important; } .lt-xl\:border-l-2 { border-left-width: 2px !important; } .lt-xl\:border-t-4 { border-top-width: 4px !important; } .lt-xl\:border-r-4 { border-right-width: 4px !important; } .lt-xl\:border-b-4 { border-bottom-width: 4px !important; } .lt-xl\:border-l-4 { border-left-width: 4px !important; } .lt-xl\:border-t-8 { border-top-width: 8px !important; } .lt-xl\:border-r-8 { border-right-width: 8px !important; } .lt-xl\:border-b-8 { border-bottom-width: 8px !important; } .lt-xl\:border-l-8 { border-left-width: 8px !important; } .lt-xl\:border-t { border-top-width: 1px !important; } .lt-xl\:border-r { border-right-width: 1px !important; } .lt-xl\:border-b { border-bottom-width: 1px !important; } .lt-xl\:border-l { border-left-width: 1px !important; } .lt-xl\:first\:border-0:first-child { border-width: 0 !important; } .lt-xl\:first\:border-2:first-child { border-width: 2px !important; } .lt-xl\:first\:border-4:first-child { border-width: 4px !important; } .lt-xl\:first\:border-8:first-child { border-width: 8px !important; } .lt-xl\:first\:border:first-child { border-width: 1px !important; } .lt-xl\:first\:border-t-0:first-child { border-top-width: 0 !important; } .lt-xl\:first\:border-r-0:first-child { border-right-width: 0 !important; } .lt-xl\:first\:border-b-0:first-child { border-bottom-width: 0 !important; } .lt-xl\:first\:border-l-0:first-child { border-left-width: 0 !important; } .lt-xl\:first\:border-t-2:first-child { border-top-width: 2px !important; } .lt-xl\:first\:border-r-2:first-child { border-right-width: 2px !important; } .lt-xl\:first\:border-b-2:first-child { border-bottom-width: 2px !important; } .lt-xl\:first\:border-l-2:first-child { border-left-width: 2px !important; } .lt-xl\:first\:border-t-4:first-child { border-top-width: 4px !important; } .lt-xl\:first\:border-r-4:first-child { border-right-width: 4px !important; } .lt-xl\:first\:border-b-4:first-child { border-bottom-width: 4px !important; } .lt-xl\:first\:border-l-4:first-child { border-left-width: 4px !important; } .lt-xl\:first\:border-t-8:first-child { border-top-width: 8px !important; } .lt-xl\:first\:border-r-8:first-child { border-right-width: 8px !important; } .lt-xl\:first\:border-b-8:first-child { border-bottom-width: 8px !important; } .lt-xl\:first\:border-l-8:first-child { border-left-width: 8px !important; } .lt-xl\:first\:border-t:first-child { border-top-width: 1px !important; } .lt-xl\:first\:border-r:first-child { border-right-width: 1px !important; } .lt-xl\:first\:border-b:first-child { border-bottom-width: 1px !important; } .lt-xl\:first\:border-l:first-child { border-left-width: 1px !important; } .lt-xl\:last\:border-0:last-child { border-width: 0 !important; } .lt-xl\:last\:border-2:last-child { border-width: 2px !important; } .lt-xl\:last\:border-4:last-child { border-width: 4px !important; } .lt-xl\:last\:border-8:last-child { border-width: 8px !important; } .lt-xl\:last\:border:last-child { border-width: 1px !important; } .lt-xl\:last\:border-t-0:last-child { border-top-width: 0 !important; } .lt-xl\:last\:border-r-0:last-child { border-right-width: 0 !important; } .lt-xl\:last\:border-b-0:last-child { border-bottom-width: 0 !important; } .lt-xl\:last\:border-l-0:last-child { border-left-width: 0 !important; } .lt-xl\:last\:border-t-2:last-child { border-top-width: 2px !important; } .lt-xl\:last\:border-r-2:last-child { border-right-width: 2px !important; } .lt-xl\:last\:border-b-2:last-child { border-bottom-width: 2px !important; } .lt-xl\:last\:border-l-2:last-child { border-left-width: 2px !important; } .lt-xl\:last\:border-t-4:last-child { border-top-width: 4px !important; } .lt-xl\:last\:border-r-4:last-child { border-right-width: 4px !important; } .lt-xl\:last\:border-b-4:last-child { border-bottom-width: 4px !important; } .lt-xl\:last\:border-l-4:last-child { border-left-width: 4px !important; } .lt-xl\:last\:border-t-8:last-child { border-top-width: 8px !important; } .lt-xl\:last\:border-r-8:last-child { border-right-width: 8px !important; } .lt-xl\:last\:border-b-8:last-child { border-bottom-width: 8px !important; } .lt-xl\:last\:border-l-8:last-child { border-left-width: 8px !important; } .lt-xl\:last\:border-t:last-child { border-top-width: 1px !important; } .lt-xl\:last\:border-r:last-child { border-right-width: 1px !important; } .lt-xl\:last\:border-b:last-child { border-bottom-width: 1px !important; } .lt-xl\:last\:border-l:last-child { border-left-width: 1px !important; } .lt-xl\:box-border { box-sizing: border-box !important; } .lt-xl\:box-content { box-sizing: content-box !important; } .lt-xl\:block { display: block !important; } .lt-xl\:inline-block { display: inline-block !important; } .lt-xl\:inline { display: inline !important; } .lt-xl\:flex { display: flex !important; } .lt-xl\:inline-flex { display: inline-flex !important; } .lt-xl\:table { display: table !important; } .lt-xl\:table-caption { display: table-caption !important; } .lt-xl\:table-cell { display: table-cell !important; } .lt-xl\:table-column { display: table-column !important; } .lt-xl\:table-column-group { display: table-column-group !important; } .lt-xl\:table-footer-group { display: table-footer-group !important; } .lt-xl\:table-header-group { display: table-header-group !important; } .lt-xl\:table-row-group { display: table-row-group !important; } .lt-xl\:table-row { display: table-row !important; } .lt-xl\:flow-root { display: flow-root !important; } .lt-xl\:grid { display: grid !important; } .lt-xl\:inline-grid { display: inline-grid !important; } .lt-xl\:hidden { display: none !important; } .lt-xl\:flex-row { flex-direction: row !important; } .lt-xl\:flex-row-reverse { flex-direction: row-reverse !important; } .lt-xl\:flex-col { flex-direction: column !important; } .lt-xl\:flex-col-reverse { flex-direction: column-reverse !important; } .lt-xl\:flex-wrap { flex-wrap: wrap !important; } .lt-xl\:flex-wrap-reverse { flex-wrap: wrap-reverse !important; } .lt-xl\:flex-no-wrap { flex-wrap: nowrap !important; } .lt-xl\:items-start { align-items: flex-start !important; } .lt-xl\:items-end { align-items: flex-end !important; } .lt-xl\:items-center { align-items: center !important; } .lt-xl\:items-baseline { align-items: baseline !important; } .lt-xl\:items-stretch { align-items: stretch !important; } .lt-xl\:self-auto { align-self: auto !important; } .lt-xl\:self-start { align-self: flex-start !important; } .lt-xl\:self-end { align-self: flex-end !important; } .lt-xl\:self-center { align-self: center !important; } .lt-xl\:self-stretch { align-self: stretch !important; } .lt-xl\:justify-start { justify-content: flex-start !important; } .lt-xl\:justify-end { justify-content: flex-end !important; } .lt-xl\:justify-center { justify-content: center !important; } .lt-xl\:justify-between { justify-content: space-between !important; } .lt-xl\:justify-around { justify-content: space-around !important; } .lt-xl\:justify-evenly { justify-content: space-evenly !important; } .lt-xl\:content-center { align-content: center !important; } .lt-xl\:content-start { align-content: flex-start !important; } .lt-xl\:content-end { align-content: flex-end !important; } .lt-xl\:content-between { align-content: space-between !important; } .lt-xl\:content-around { align-content: space-around !important; } .lt-xl\:flex-0 { flex: 0 0 auto !important; } .lt-xl\:flex-1 { flex: 1 1 0% !important; } .lt-xl\:flex-auto { flex: 1 1 auto !important; } .lt-xl\:flex-initial { flex: 0 1 auto !important; } .lt-xl\:flex-none { flex: none !important; } .lt-xl\:flex-grow-0 { flex-grow: 0 !important; } .lt-xl\:flex-grow { flex-grow: 1 !important; } .lt-xl\:flex-shrink-0 { flex-shrink: 0 !important; } .lt-xl\:flex-shrink { flex-shrink: 1 !important; } .lt-xl\:order-1 { order: 1 !important; } .lt-xl\:order-2 { order: 2 !important; } .lt-xl\:order-3 { order: 3 !important; } .lt-xl\:order-4 { order: 4 !important; } .lt-xl\:order-5 { order: 5 !important; } .lt-xl\:order-6 { order: 6 !important; } .lt-xl\:order-7 { order: 7 !important; } .lt-xl\:order-8 { order: 8 !important; } .lt-xl\:order-9 { order: 9 !important; } .lt-xl\:order-10 { order: 10 !important; } .lt-xl\:order-11 { order: 11 !important; } .lt-xl\:order-12 { order: 12 !important; } .lt-xl\:order-first { order: -9999 !important; } .lt-xl\:order-last { order: 9999 !important; } .lt-xl\:order-none { order: 0 !important; } .lt-xl\:font-hairline { font-weight: 100 !important; } .lt-xl\:font-thin { font-weight: 200 !important; } .lt-xl\:font-light { font-weight: 300 !important; } .lt-xl\:font-normal { font-weight: 400 !important; } .lt-xl\:font-medium { font-weight: 500 !important; } .lt-xl\:font-semibold { font-weight: 600 !important; } .lt-xl\:font-bold { font-weight: 700 !important; } .lt-xl\:font-extrabold { font-weight: 800 !important; } .lt-xl\:font-black { font-weight: 900 !important; } .lt-xl\:h-0 { height: 0 !important; } .lt-xl\:h-1 { height: 0.25rem !important; } .lt-xl\:h-2 { height: 0.5rem !important; } .lt-xl\:h-3 { height: 0.75rem !important; } .lt-xl\:h-4 { height: 1rem !important; } .lt-xl\:h-5 { height: 1.25rem !important; } .lt-xl\:h-6 { height: 1.5rem !important; } .lt-xl\:h-8 { height: 2rem !important; } .lt-xl\:h-10 { height: 2.5rem !important; } .lt-xl\:h-12 { height: 3rem !important; } .lt-xl\:h-14 { height: 3.5rem !important; } .lt-xl\:h-16 { height: 4rem !important; } .lt-xl\:h-18 { height: 4.5rem !important; } .lt-xl\:h-20 { height: 5rem !important; } .lt-xl\:h-22 { height: 5.5rem !important; } .lt-xl\:h-24 { height: 6rem !important; } .lt-xl\:h-26 { height: 6.5rem !important; } .lt-xl\:h-28 { height: 7rem !important; } .lt-xl\:h-30 { height: 7.5rem !important; } .lt-xl\:h-32 { height: 8rem !important; } .lt-xl\:h-36 { height: 9rem !important; } .lt-xl\:h-40 { height: 10rem !important; } .lt-xl\:h-48 { height: 12rem !important; } .lt-xl\:h-50 { height: 12.5rem !important; } .lt-xl\:h-56 { height: 14rem !important; } .lt-xl\:h-60 { height: 15rem !important; } .lt-xl\:h-64 { height: 16rem !important; } .lt-xl\:h-80 { height: 20rem !important; } .lt-xl\:h-90 { height: 24rem !important; } .lt-xl\:h-100 { height: 25rem !important; } .lt-xl\:h-120 { height: 30rem !important; } .lt-xl\:h-128 { height: 32rem !important; } .lt-xl\:h-140 { height: 35rem !important; } .lt-xl\:h-160 { height: 40rem !important; } .lt-xl\:h-180 { height: 45rem !important; } .lt-xl\:h-192 { height: 48rem !important; } .lt-xl\:h-200 { height: 50rem !important; } .lt-xl\:h-240 { height: 60rem !important; } .lt-xl\:h-256 { height: 64rem !important; } .lt-xl\:h-280 { height: 70rem !important; } .lt-xl\:h-320 { height: 80rem !important; } .lt-xl\:h-360 { height: 90rem !important; } .lt-xl\:h-400 { height: 100rem !important; } .lt-xl\:h-480 { height: 120rem !important; } .lt-xl\:h-auto { height: auto !important; } .lt-xl\:h-px { height: 1px !important; } .lt-xl\:h-2px { height: 2px !important; } .lt-xl\:h-full { height: 100% !important; } .lt-xl\:h-screen { height: 100vh !important; } .lt-xl\:h-1\/2 { height: 50% !important; } .lt-xl\:h-1\/3 { height: 33.33333% !important; } .lt-xl\:h-2\/3 { height: 66.66667% !important; } .lt-xl\:h-1\/4 { height: 25% !important; } .lt-xl\:h-2\/4 { height: 50% !important; } .lt-xl\:h-3\/4 { height: 75% !important; } .lt-xl\:h-1\/5 { height: 20% !important; } .lt-xl\:h-2\/5 { height: 40% !important; } .lt-xl\:h-3\/5 { height: 60% !important; } .lt-xl\:h-4\/5 { height: 80% !important; } .lt-xl\:h-1\/12 { height: 8.33333% !important; } .lt-xl\:h-2\/12 { height: 16.66667% !important; } .lt-xl\:h-3\/12 { height: 25% !important; } .lt-xl\:h-4\/12 { height: 33.33333% !important; } .lt-xl\:h-5\/12 { height: 41.66667% !important; } .lt-xl\:h-6\/12 { height: 50% !important; } .lt-xl\:h-7\/12 { height: 58.33333% !important; } .lt-xl\:h-8\/12 { height: 66.66667% !important; } .lt-xl\:h-9\/12 { height: 75% !important; } .lt-xl\:h-10\/12 { height: 83.33333% !important; } .lt-xl\:h-11\/12 { height: 91.66667% !important; } .lt-xl\:text-xs { font-size: 0.625rem !important; } .lt-xl\:text-sm { font-size: 0.75rem !important; } .lt-xl\:text-md { font-size: 0.8125rem !important; } .lt-xl\:text-base { font-size: 0.875rem !important; } .lt-xl\:text-lg { font-size: 1rem !important; } .lt-xl\:text-xl { font-size: 1.125rem !important; } .lt-xl\:text-2xl { font-size: 1.25rem !important; } .lt-xl\:text-3xl { font-size: 1.5rem !important; } .lt-xl\:text-4xl { font-size: 2rem !important; } .lt-xl\:text-5xl { font-size: 2.25rem !important; } .lt-xl\:text-6xl { font-size: 2.5rem !important; } .lt-xl\:text-7xl { font-size: 3rem !important; } .lt-xl\:text-8xl { font-size: 4rem !important; } .lt-xl\:text-9xl { font-size: 6rem !important; } .lt-xl\:text-10xl { font-size: 8rem !important; } .lt-xl\:leading-3 { line-height: .75rem !important; } .lt-xl\:leading-4 { line-height: 1rem !important; } .lt-xl\:leading-5 { line-height: 1.25rem !important; } .lt-xl\:leading-6 { line-height: 1.5rem !important; } .lt-xl\:leading-7 { line-height: 1.75rem !important; } .lt-xl\:leading-8 { line-height: 2rem !important; } .lt-xl\:leading-9 { line-height: 2.25rem !important; } .lt-xl\:leading-10 { line-height: 2.5rem !important; } .lt-xl\:leading-none { line-height: 1 !important; } .lt-xl\:leading-tight { line-height: 1.25 !important; } .lt-xl\:leading-snug { line-height: 1.375 !important; } .lt-xl\:leading-normal { line-height: 1.5 !important; } .lt-xl\:leading-relaxed { line-height: 1.625 !important; } .lt-xl\:leading-loose { line-height: 2 !important; } .lt-xl\:list-inside { list-style-position: inside !important; } .lt-xl\:list-outside { list-style-position: outside !important; } .lt-xl\:list-none { list-style-type: none !important; } .lt-xl\:list-disc { list-style-type: disc !important; } .lt-xl\:list-decimal { list-style-type: decimal !important; } .lt-xl\:m-0 { margin: 0 !important; } .lt-xl\:m-1 { margin: 0.25rem !important; } .lt-xl\:m-2 { margin: 0.5rem !important; } .lt-xl\:m-3 { margin: 0.75rem !important; } .lt-xl\:m-4 { margin: 1rem !important; } .lt-xl\:m-5 { margin: 1.25rem !important; } .lt-xl\:m-6 { margin: 1.5rem !important; } .lt-xl\:m-8 { margin: 2rem !important; } .lt-xl\:m-10 { margin: 2.5rem !important; } .lt-xl\:m-12 { margin: 3rem !important; } .lt-xl\:m-14 { margin: 3.5rem !important; } .lt-xl\:m-16 { margin: 4rem !important; } .lt-xl\:m-18 { margin: 4.5rem !important; } .lt-xl\:m-20 { margin: 5rem !important; } .lt-xl\:m-22 { margin: 5.5rem !important; } .lt-xl\:m-24 { margin: 6rem !important; } .lt-xl\:m-26 { margin: 6.5rem !important; } .lt-xl\:m-28 { margin: 7rem !important; } .lt-xl\:m-30 { margin: 7.5rem !important; } .lt-xl\:m-32 { margin: 8rem !important; } .lt-xl\:m-36 { margin: 9rem !important; } .lt-xl\:m-40 { margin: 10rem !important; } .lt-xl\:m-48 { margin: 12rem !important; } .lt-xl\:m-56 { margin: 14rem !important; } .lt-xl\:m-64 { margin: 16rem !important; } .lt-xl\:m-auto { margin: auto !important; } .lt-xl\:m-px { margin: 1px !important; } .lt-xl\:m-2px { margin: 2px !important; } .lt-xl\:-m-1 { margin: -0.25rem !important; } .lt-xl\:-m-2 { margin: -0.5rem !important; } .lt-xl\:-m-3 { margin: -0.75rem !important; } .lt-xl\:-m-4 { margin: -1rem !important; } .lt-xl\:-m-5 { margin: -1.25rem !important; } .lt-xl\:-m-6 { margin: -1.5rem !important; } .lt-xl\:-m-8 { margin: -2rem !important; } .lt-xl\:-m-10 { margin: -2.5rem !important; } .lt-xl\:-m-12 { margin: -3rem !important; } .lt-xl\:-m-14 { margin: -3.5rem !important; } .lt-xl\:-m-16 { margin: -4rem !important; } .lt-xl\:-m-18 { margin: -4.5rem !important; } .lt-xl\:-m-20 { margin: -5rem !important; } .lt-xl\:-m-22 { margin: -5.5rem !important; } .lt-xl\:-m-24 { margin: -6rem !important; } .lt-xl\:-m-26 { margin: -6.5rem !important; } .lt-xl\:-m-28 { margin: -7rem !important; } .lt-xl\:-m-30 { margin: -7.5rem !important; } .lt-xl\:-m-32 { margin: -8rem !important; } .lt-xl\:-m-36 { margin: -9rem !important; } .lt-xl\:-m-40 { margin: -10rem !important; } .lt-xl\:-m-48 { margin: -12rem !important; } .lt-xl\:-m-56 { margin: -14rem !important; } .lt-xl\:-m-64 { margin: -16rem !important; } .lt-xl\:-m-px { margin: -1px !important; } .lt-xl\:-m-2px { margin: -2px !important; } .lt-xl\:my-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .lt-xl\:mx-0 { margin-left: 0 !important; margin-right: 0 !important; } .lt-xl\:my-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .lt-xl\:mx-1 { margin-left: 0.25rem !important; margin-right: 0.25rem !important; } .lt-xl\:my-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .lt-xl\:mx-2 { margin-left: 0.5rem !important; margin-right: 0.5rem !important; } .lt-xl\:my-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .lt-xl\:mx-3 { margin-left: 0.75rem !important; margin-right: 0.75rem !important; } .lt-xl\:my-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .lt-xl\:mx-4 { margin-left: 1rem !important; margin-right: 1rem !important; } .lt-xl\:my-5 { margin-top: 1.25rem !important; margin-bottom: 1.25rem !important; } .lt-xl\:mx-5 { margin-left: 1.25rem !important; margin-right: 1.25rem !important; } .lt-xl\:my-6 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .lt-xl\:mx-6 { margin-left: 1.5rem !important; margin-right: 1.5rem !important; } .lt-xl\:my-8 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .lt-xl\:mx-8 { margin-left: 2rem !important; margin-right: 2rem !important; } .lt-xl\:my-10 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .lt-xl\:mx-10 { margin-left: 2.5rem !important; margin-right: 2.5rem !important; } .lt-xl\:my-12 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .lt-xl\:mx-12 { margin-left: 3rem !important; margin-right: 3rem !important; } .lt-xl\:my-14 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .lt-xl\:mx-14 { margin-left: 3.5rem !important; margin-right: 3.5rem !important; } .lt-xl\:my-16 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .lt-xl\:mx-16 { margin-left: 4rem !important; margin-right: 4rem !important; } .lt-xl\:my-18 { margin-top: 4.5rem !important; margin-bottom: 4.5rem !important; } .lt-xl\:mx-18 { margin-left: 4.5rem !important; margin-right: 4.5rem !important; } .lt-xl\:my-20 { margin-top: 5rem !important; margin-bottom: 5rem !important; } .lt-xl\:mx-20 { margin-left: 5rem !important; margin-right: 5rem !important; } .lt-xl\:my-22 { margin-top: 5.5rem !important; margin-bottom: 5.5rem !important; } .lt-xl\:mx-22 { margin-left: 5.5rem !important; margin-right: 5.5rem !important; } .lt-xl\:my-24 { margin-top: 6rem !important; margin-bottom: 6rem !important; } .lt-xl\:mx-24 { margin-left: 6rem !important; margin-right: 6rem !important; } .lt-xl\:my-26 { margin-top: 6.5rem !important; margin-bottom: 6.5rem !important; } .lt-xl\:mx-26 { margin-left: 6.5rem !important; margin-right: 6.5rem !important; } .lt-xl\:my-28 { margin-top: 7rem !important; margin-bottom: 7rem !important; } .lt-xl\:mx-28 { margin-left: 7rem !important; margin-right: 7rem !important; } .lt-xl\:my-30 { margin-top: 7.5rem !important; margin-bottom: 7.5rem !important; } .lt-xl\:mx-30 { margin-left: 7.5rem !important; margin-right: 7.5rem !important; } .lt-xl\:my-32 { margin-top: 8rem !important; margin-bottom: 8rem !important; } .lt-xl\:mx-32 { margin-left: 8rem !important; margin-right: 8rem !important; } .lt-xl\:my-36 { margin-top: 9rem !important; margin-bottom: 9rem !important; } .lt-xl\:mx-36 { margin-left: 9rem !important; margin-right: 9rem !important; } .lt-xl\:my-40 { margin-top: 10rem !important; margin-bottom: 10rem !important; } .lt-xl\:mx-40 { margin-left: 10rem !important; margin-right: 10rem !important; } .lt-xl\:my-48 { margin-top: 12rem !important; margin-bottom: 12rem !important; } .lt-xl\:mx-48 { margin-left: 12rem !important; margin-right: 12rem !important; } .lt-xl\:my-56 { margin-top: 14rem !important; margin-bottom: 14rem !important; } .lt-xl\:mx-56 { margin-left: 14rem !important; margin-right: 14rem !important; } .lt-xl\:my-64 { margin-top: 16rem !important; margin-bottom: 16rem !important; } .lt-xl\:mx-64 { margin-left: 16rem !important; margin-right: 16rem !important; } .lt-xl\:my-auto { margin-top: auto !important; margin-bottom: auto !important; } .lt-xl\:mx-auto { margin-left: auto !important; margin-right: auto !important; } .lt-xl\:my-px { margin-top: 1px !important; margin-bottom: 1px !important; } .lt-xl\:mx-px { margin-left: 1px !important; margin-right: 1px !important; } .lt-xl\:my-2px { margin-top: 2px !important; margin-bottom: 2px !important; } .lt-xl\:mx-2px { margin-left: 2px !important; margin-right: 2px !important; } .lt-xl\:-my-1 { margin-top: -0.25rem !important; margin-bottom: -0.25rem !important; } .lt-xl\:-mx-1 { margin-left: -0.25rem !important; margin-right: -0.25rem !important; } .lt-xl\:-my-2 { margin-top: -0.5rem !important; margin-bottom: -0.5rem !important; } .lt-xl\:-mx-2 { margin-left: -0.5rem !important; margin-right: -0.5rem !important; } .lt-xl\:-my-3 { margin-top: -0.75rem !important; margin-bottom: -0.75rem !important; } .lt-xl\:-mx-3 { margin-left: -0.75rem !important; margin-right: -0.75rem !important; } .lt-xl\:-my-4 { margin-top: -1rem !important; margin-bottom: -1rem !important; } .lt-xl\:-mx-4 { margin-left: -1rem !important; margin-right: -1rem !important; } .lt-xl\:-my-5 { margin-top: -1.25rem !important; margin-bottom: -1.25rem !important; } .lt-xl\:-mx-5 { margin-left: -1.25rem !important; margin-right: -1.25rem !important; } .lt-xl\:-my-6 { margin-top: -1.5rem !important; margin-bottom: -1.5rem !important; } .lt-xl\:-mx-6 { margin-left: -1.5rem !important; margin-right: -1.5rem !important; } .lt-xl\:-my-8 { margin-top: -2rem !important; margin-bottom: -2rem !important; } .lt-xl\:-mx-8 { margin-left: -2rem !important; margin-right: -2rem !important; } .lt-xl\:-my-10 { margin-top: -2.5rem !important; margin-bottom: -2.5rem !important; } .lt-xl\:-mx-10 { margin-left: -2.5rem !important; margin-right: -2.5rem !important; } .lt-xl\:-my-12 { margin-top: -3rem !important; margin-bottom: -3rem !important; } .lt-xl\:-mx-12 { margin-left: -3rem !important; margin-right: -3rem !important; } .lt-xl\:-my-14 { margin-top: -3.5rem !important; margin-bottom: -3.5rem !important; } .lt-xl\:-mx-14 { margin-left: -3.5rem !important; margin-right: -3.5rem !important; } .lt-xl\:-my-16 { margin-top: -4rem !important; margin-bottom: -4rem !important; } .lt-xl\:-mx-16 { margin-left: -4rem !important; margin-right: -4rem !important; } .lt-xl\:-my-18 { margin-top: -4.5rem !important; margin-bottom: -4.5rem !important; } .lt-xl\:-mx-18 { margin-left: -4.5rem !important; margin-right: -4.5rem !important; } .lt-xl\:-my-20 { margin-top: -5rem !important; margin-bottom: -5rem !important; } .lt-xl\:-mx-20 { margin-left: -5rem !important; margin-right: -5rem !important; } .lt-xl\:-my-22 { margin-top: -5.5rem !important; margin-bottom: -5.5rem !important; } .lt-xl\:-mx-22 { margin-left: -5.5rem !important; margin-right: -5.5rem !important; } .lt-xl\:-my-24 { margin-top: -6rem !important; margin-bottom: -6rem !important; } .lt-xl\:-mx-24 { margin-left: -6rem !important; margin-right: -6rem !important; } .lt-xl\:-my-26 { margin-top: -6.5rem !important; margin-bottom: -6.5rem !important; } .lt-xl\:-mx-26 { margin-left: -6.5rem !important; margin-right: -6.5rem !important; } .lt-xl\:-my-28 { margin-top: -7rem !important; margin-bottom: -7rem !important; } .lt-xl\:-mx-28 { margin-left: -7rem !important; margin-right: -7rem !important; } .lt-xl\:-my-30 { margin-top: -7.5rem !important; margin-bottom: -7.5rem !important; } .lt-xl\:-mx-30 { margin-left: -7.5rem !important; margin-right: -7.5rem !important; } .lt-xl\:-my-32 { margin-top: -8rem !important; margin-bottom: -8rem !important; } .lt-xl\:-mx-32 { margin-left: -8rem !important; margin-right: -8rem !important; } .lt-xl\:-my-36 { margin-top: -9rem !important; margin-bottom: -9rem !important; } .lt-xl\:-mx-36 { margin-left: -9rem !important; margin-right: -9rem !important; } .lt-xl\:-my-40 { margin-top: -10rem !important; margin-bottom: -10rem !important; } .lt-xl\:-mx-40 { margin-left: -10rem !important; margin-right: -10rem !important; } .lt-xl\:-my-48 { margin-top: -12rem !important; margin-bottom: -12rem !important; } .lt-xl\:-mx-48 { margin-left: -12rem !important; margin-right: -12rem !important; } .lt-xl\:-my-56 { margin-top: -14rem !important; margin-bottom: -14rem !important; } .lt-xl\:-mx-56 { margin-left: -14rem !important; margin-right: -14rem !important; } .lt-xl\:-my-64 { margin-top: -16rem !important; margin-bottom: -16rem !important; } .lt-xl\:-mx-64 { margin-left: -16rem !important; margin-right: -16rem !important; } .lt-xl\:-my-px { margin-top: -1px !important; margin-bottom: -1px !important; } .lt-xl\:-mx-px { margin-left: -1px !important; margin-right: -1px !important; } .lt-xl\:-my-2px { margin-top: -2px !important; margin-bottom: -2px !important; } .lt-xl\:-mx-2px { margin-left: -2px !important; margin-right: -2px !important; } .lt-xl\:mt-0 { margin-top: 0 !important; } .lt-xl\:mr-0 { margin-right: 0 !important; } .lt-xl\:mb-0 { margin-bottom: 0 !important; } .lt-xl\:ml-0 { margin-left: 0 !important; } .lt-xl\:mt-1 { margin-top: 0.25rem !important; } .lt-xl\:mr-1 { margin-right: 0.25rem !important; } .lt-xl\:mb-1 { margin-bottom: 0.25rem !important; } .lt-xl\:ml-1 { margin-left: 0.25rem !important; } .lt-xl\:mt-2 { margin-top: 0.5rem !important; } .lt-xl\:mr-2 { margin-right: 0.5rem !important; } .lt-xl\:mb-2 { margin-bottom: 0.5rem !important; } .lt-xl\:ml-2 { margin-left: 0.5rem !important; } .lt-xl\:mt-3 { margin-top: 0.75rem !important; } .lt-xl\:mr-3 { margin-right: 0.75rem !important; } .lt-xl\:mb-3 { margin-bottom: 0.75rem !important; } .lt-xl\:ml-3 { margin-left: 0.75rem !important; } .lt-xl\:mt-4 { margin-top: 1rem !important; } .lt-xl\:mr-4 { margin-right: 1rem !important; } .lt-xl\:mb-4 { margin-bottom: 1rem !important; } .lt-xl\:ml-4 { margin-left: 1rem !important; } .lt-xl\:mt-5 { margin-top: 1.25rem !important; } .lt-xl\:mr-5 { margin-right: 1.25rem !important; } .lt-xl\:mb-5 { margin-bottom: 1.25rem !important; } .lt-xl\:ml-5 { margin-left: 1.25rem !important; } .lt-xl\:mt-6 { margin-top: 1.5rem !important; } .lt-xl\:mr-6 { margin-right: 1.5rem !important; } .lt-xl\:mb-6 { margin-bottom: 1.5rem !important; } .lt-xl\:ml-6 { margin-left: 1.5rem !important; } .lt-xl\:mt-8 { margin-top: 2rem !important; } .lt-xl\:mr-8 { margin-right: 2rem !important; } .lt-xl\:mb-8 { margin-bottom: 2rem !important; } .lt-xl\:ml-8 { margin-left: 2rem !important; } .lt-xl\:mt-10 { margin-top: 2.5rem !important; } .lt-xl\:mr-10 { margin-right: 2.5rem !important; } .lt-xl\:mb-10 { margin-bottom: 2.5rem !important; } .lt-xl\:ml-10 { margin-left: 2.5rem !important; } .lt-xl\:mt-12 { margin-top: 3rem !important; } .lt-xl\:mr-12 { margin-right: 3rem !important; } .lt-xl\:mb-12 { margin-bottom: 3rem !important; } .lt-xl\:ml-12 { margin-left: 3rem !important; } .lt-xl\:mt-14 { margin-top: 3.5rem !important; } .lt-xl\:mr-14 { margin-right: 3.5rem !important; } .lt-xl\:mb-14 { margin-bottom: 3.5rem !important; } .lt-xl\:ml-14 { margin-left: 3.5rem !important; } .lt-xl\:mt-16 { margin-top: 4rem !important; } .lt-xl\:mr-16 { margin-right: 4rem !important; } .lt-xl\:mb-16 { margin-bottom: 4rem !important; } .lt-xl\:ml-16 { margin-left: 4rem !important; } .lt-xl\:mt-18 { margin-top: 4.5rem !important; } .lt-xl\:mr-18 { margin-right: 4.5rem !important; } .lt-xl\:mb-18 { margin-bottom: 4.5rem !important; } .lt-xl\:ml-18 { margin-left: 4.5rem !important; } .lt-xl\:mt-20 { margin-top: 5rem !important; } .lt-xl\:mr-20 { margin-right: 5rem !important; } .lt-xl\:mb-20 { margin-bottom: 5rem !important; } .lt-xl\:ml-20 { margin-left: 5rem !important; } .lt-xl\:mt-22 { margin-top: 5.5rem !important; } .lt-xl\:mr-22 { margin-right: 5.5rem !important; } .lt-xl\:mb-22 { margin-bottom: 5.5rem !important; } .lt-xl\:ml-22 { margin-left: 5.5rem !important; } .lt-xl\:mt-24 { margin-top: 6rem !important; } .lt-xl\:mr-24 { margin-right: 6rem !important; } .lt-xl\:mb-24 { margin-bottom: 6rem !important; } .lt-xl\:ml-24 { margin-left: 6rem !important; } .lt-xl\:mt-26 { margin-top: 6.5rem !important; } .lt-xl\:mr-26 { margin-right: 6.5rem !important; } .lt-xl\:mb-26 { margin-bottom: 6.5rem !important; } .lt-xl\:ml-26 { margin-left: 6.5rem !important; } .lt-xl\:mt-28 { margin-top: 7rem !important; } .lt-xl\:mr-28 { margin-right: 7rem !important; } .lt-xl\:mb-28 { margin-bottom: 7rem !important; } .lt-xl\:ml-28 { margin-left: 7rem !important; } .lt-xl\:mt-30 { margin-top: 7.5rem !important; } .lt-xl\:mr-30 { margin-right: 7.5rem !important; } .lt-xl\:mb-30 { margin-bottom: 7.5rem !important; } .lt-xl\:ml-30 { margin-left: 7.5rem !important; } .lt-xl\:mt-32 { margin-top: 8rem !important; } .lt-xl\:mr-32 { margin-right: 8rem !important; } .lt-xl\:mb-32 { margin-bottom: 8rem !important; } .lt-xl\:ml-32 { margin-left: 8rem !important; } .lt-xl\:mt-36 { margin-top: 9rem !important; } .lt-xl\:mr-36 { margin-right: 9rem !important; } .lt-xl\:mb-36 { margin-bottom: 9rem !important; } .lt-xl\:ml-36 { margin-left: 9rem !important; } .lt-xl\:mt-40 { margin-top: 10rem !important; } .lt-xl\:mr-40 { margin-right: 10rem !important; } .lt-xl\:mb-40 { margin-bottom: 10rem !important; } .lt-xl\:ml-40 { margin-left: 10rem !important; } .lt-xl\:mt-48 { margin-top: 12rem !important; } .lt-xl\:mr-48 { margin-right: 12rem !important; } .lt-xl\:mb-48 { margin-bottom: 12rem !important; } .lt-xl\:ml-48 { margin-left: 12rem !important; } .lt-xl\:mt-56 { margin-top: 14rem !important; } .lt-xl\:mr-56 { margin-right: 14rem !important; } .lt-xl\:mb-56 { margin-bottom: 14rem !important; } .lt-xl\:ml-56 { margin-left: 14rem !important; } .lt-xl\:mt-64 { margin-top: 16rem !important; } .lt-xl\:mr-64 { margin-right: 16rem !important; } .lt-xl\:mb-64 { margin-bottom: 16rem !important; } .lt-xl\:ml-64 { margin-left: 16rem !important; } .lt-xl\:mt-auto { margin-top: auto !important; } .lt-xl\:mr-auto { margin-right: auto !important; } .lt-xl\:mb-auto { margin-bottom: auto !important; } .lt-xl\:ml-auto { margin-left: auto !important; } .lt-xl\:mt-px { margin-top: 1px !important; } .lt-xl\:mr-px { margin-right: 1px !important; } .lt-xl\:mb-px { margin-bottom: 1px !important; } .lt-xl\:ml-px { margin-left: 1px !important; } .lt-xl\:mt-2px { margin-top: 2px !important; } .lt-xl\:mr-2px { margin-right: 2px !important; } .lt-xl\:mb-2px { margin-bottom: 2px !important; } .lt-xl\:ml-2px { margin-left: 2px !important; } .lt-xl\:-mt-1 { margin-top: -0.25rem !important; } .lt-xl\:-mr-1 { margin-right: -0.25rem !important; } .lt-xl\:-mb-1 { margin-bottom: -0.25rem !important; } .lt-xl\:-ml-1 { margin-left: -0.25rem !important; } .lt-xl\:-mt-2 { margin-top: -0.5rem !important; } .lt-xl\:-mr-2 { margin-right: -0.5rem !important; } .lt-xl\:-mb-2 { margin-bottom: -0.5rem !important; } .lt-xl\:-ml-2 { margin-left: -0.5rem !important; } .lt-xl\:-mt-3 { margin-top: -0.75rem !important; } .lt-xl\:-mr-3 { margin-right: -0.75rem !important; } .lt-xl\:-mb-3 { margin-bottom: -0.75rem !important; } .lt-xl\:-ml-3 { margin-left: -0.75rem !important; } .lt-xl\:-mt-4 { margin-top: -1rem !important; } .lt-xl\:-mr-4 { margin-right: -1rem !important; } .lt-xl\:-mb-4 { margin-bottom: -1rem !important; } .lt-xl\:-ml-4 { margin-left: -1rem !important; } .lt-xl\:-mt-5 { margin-top: -1.25rem !important; } .lt-xl\:-mr-5 { margin-right: -1.25rem !important; } .lt-xl\:-mb-5 { margin-bottom: -1.25rem !important; } .lt-xl\:-ml-5 { margin-left: -1.25rem !important; } .lt-xl\:-mt-6 { margin-top: -1.5rem !important; } .lt-xl\:-mr-6 { margin-right: -1.5rem !important; } .lt-xl\:-mb-6 { margin-bottom: -1.5rem !important; } .lt-xl\:-ml-6 { margin-left: -1.5rem !important; } .lt-xl\:-mt-8 { margin-top: -2rem !important; } .lt-xl\:-mr-8 { margin-right: -2rem !important; } .lt-xl\:-mb-8 { margin-bottom: -2rem !important; } .lt-xl\:-ml-8 { margin-left: -2rem !important; } .lt-xl\:-mt-10 { margin-top: -2.5rem !important; } .lt-xl\:-mr-10 { margin-right: -2.5rem !important; } .lt-xl\:-mb-10 { margin-bottom: -2.5rem !important; } .lt-xl\:-ml-10 { margin-left: -2.5rem !important; } .lt-xl\:-mt-12 { margin-top: -3rem !important; } .lt-xl\:-mr-12 { margin-right: -3rem !important; } .lt-xl\:-mb-12 { margin-bottom: -3rem !important; } .lt-xl\:-ml-12 { margin-left: -3rem !important; } .lt-xl\:-mt-14 { margin-top: -3.5rem !important; } .lt-xl\:-mr-14 { margin-right: -3.5rem !important; } .lt-xl\:-mb-14 { margin-bottom: -3.5rem !important; } .lt-xl\:-ml-14 { margin-left: -3.5rem !important; } .lt-xl\:-mt-16 { margin-top: -4rem !important; } .lt-xl\:-mr-16 { margin-right: -4rem !important; } .lt-xl\:-mb-16 { margin-bottom: -4rem !important; } .lt-xl\:-ml-16 { margin-left: -4rem !important; } .lt-xl\:-mt-18 { margin-top: -4.5rem !important; } .lt-xl\:-mr-18 { margin-right: -4.5rem !important; } .lt-xl\:-mb-18 { margin-bottom: -4.5rem !important; } .lt-xl\:-ml-18 { margin-left: -4.5rem !important; } .lt-xl\:-mt-20 { margin-top: -5rem !important; } .lt-xl\:-mr-20 { margin-right: -5rem !important; } .lt-xl\:-mb-20 { margin-bottom: -5rem !important; } .lt-xl\:-ml-20 { margin-left: -5rem !important; } .lt-xl\:-mt-22 { margin-top: -5.5rem !important; } .lt-xl\:-mr-22 { margin-right: -5.5rem !important; } .lt-xl\:-mb-22 { margin-bottom: -5.5rem !important; } .lt-xl\:-ml-22 { margin-left: -5.5rem !important; } .lt-xl\:-mt-24 { margin-top: -6rem !important; } .lt-xl\:-mr-24 { margin-right: -6rem !important; } .lt-xl\:-mb-24 { margin-bottom: -6rem !important; } .lt-xl\:-ml-24 { margin-left: -6rem !important; } .lt-xl\:-mt-26 { margin-top: -6.5rem !important; } .lt-xl\:-mr-26 { margin-right: -6.5rem !important; } .lt-xl\:-mb-26 { margin-bottom: -6.5rem !important; } .lt-xl\:-ml-26 { margin-left: -6.5rem !important; } .lt-xl\:-mt-28 { margin-top: -7rem !important; } .lt-xl\:-mr-28 { margin-right: -7rem !important; } .lt-xl\:-mb-28 { margin-bottom: -7rem !important; } .lt-xl\:-ml-28 { margin-left: -7rem !important; } .lt-xl\:-mt-30 { margin-top: -7.5rem !important; } .lt-xl\:-mr-30 { margin-right: -7.5rem !important; } .lt-xl\:-mb-30 { margin-bottom: -7.5rem !important; } .lt-xl\:-ml-30 { margin-left: -7.5rem !important; } .lt-xl\:-mt-32 { margin-top: -8rem !important; } .lt-xl\:-mr-32 { margin-right: -8rem !important; } .lt-xl\:-mb-32 { margin-bottom: -8rem !important; } .lt-xl\:-ml-32 { margin-left: -8rem !important; } .lt-xl\:-mt-36 { margin-top: -9rem !important; } .lt-xl\:-mr-36 { margin-right: -9rem !important; } .lt-xl\:-mb-36 { margin-bottom: -9rem !important; } .lt-xl\:-ml-36 { margin-left: -9rem !important; } .lt-xl\:-mt-40 { margin-top: -10rem !important; } .lt-xl\:-mr-40 { margin-right: -10rem !important; } .lt-xl\:-mb-40 { margin-bottom: -10rem !important; } .lt-xl\:-ml-40 { margin-left: -10rem !important; } .lt-xl\:-mt-48 { margin-top: -12rem !important; } .lt-xl\:-mr-48 { margin-right: -12rem !important; } .lt-xl\:-mb-48 { margin-bottom: -12rem !important; } .lt-xl\:-ml-48 { margin-left: -12rem !important; } .lt-xl\:-mt-56 { margin-top: -14rem !important; } .lt-xl\:-mr-56 { margin-right: -14rem !important; } .lt-xl\:-mb-56 { margin-bottom: -14rem !important; } .lt-xl\:-ml-56 { margin-left: -14rem !important; } .lt-xl\:-mt-64 { margin-top: -16rem !important; } .lt-xl\:-mr-64 { margin-right: -16rem !important; } .lt-xl\:-mb-64 { margin-bottom: -16rem !important; } .lt-xl\:-ml-64 { margin-left: -16rem !important; } .lt-xl\:-mt-px { margin-top: -1px !important; } .lt-xl\:-mr-px { margin-right: -1px !important; } .lt-xl\:-mb-px { margin-bottom: -1px !important; } .lt-xl\:-ml-px { margin-left: -1px !important; } .lt-xl\:-mt-2px { margin-top: -2px !important; } .lt-xl\:-mr-2px { margin-right: -2px !important; } .lt-xl\:-mb-2px { margin-bottom: -2px !important; } .lt-xl\:-ml-2px { margin-left: -2px !important; } .lt-xl\:max-h-0 { max-height: 0 !important; } .lt-xl\:max-h-1 { max-height: 0.25rem !important; } .lt-xl\:max-h-2 { max-height: 0.5rem !important; } .lt-xl\:max-h-3 { max-height: 0.75rem !important; } .lt-xl\:max-h-4 { max-height: 1rem !important; } .lt-xl\:max-h-5 { max-height: 1.25rem !important; } .lt-xl\:max-h-6 { max-height: 1.5rem !important; } .lt-xl\:max-h-8 { max-height: 2rem !important; } .lt-xl\:max-h-10 { max-height: 2.5rem !important; } .lt-xl\:max-h-12 { max-height: 3rem !important; } .lt-xl\:max-h-14 { max-height: 3.5rem !important; } .lt-xl\:max-h-16 { max-height: 4rem !important; } .lt-xl\:max-h-18 { max-height: 4.5rem !important; } .lt-xl\:max-h-20 { max-height: 5rem !important; } .lt-xl\:max-h-22 { max-height: 5.5rem !important; } .lt-xl\:max-h-24 { max-height: 6rem !important; } .lt-xl\:max-h-26 { max-height: 6.5rem !important; } .lt-xl\:max-h-28 { max-height: 7rem !important; } .lt-xl\:max-h-30 { max-height: 7.5rem !important; } .lt-xl\:max-h-32 { max-height: 8rem !important; } .lt-xl\:max-h-36 { max-height: 9rem !important; } .lt-xl\:max-h-40 { max-height: 10rem !important; } .lt-xl\:max-h-48 { max-height: 12rem !important; } .lt-xl\:max-h-50 { max-height: 12.5rem !important; } .lt-xl\:max-h-56 { max-height: 14rem !important; } .lt-xl\:max-h-60 { max-height: 15rem !important; } .lt-xl\:max-h-64 { max-height: 16rem !important; } .lt-xl\:max-h-80 { max-height: 20rem !important; } .lt-xl\:max-h-90 { max-height: 24rem !important; } .lt-xl\:max-h-100 { max-height: 25rem !important; } .lt-xl\:max-h-120 { max-height: 30rem !important; } .lt-xl\:max-h-128 { max-height: 32rem !important; } .lt-xl\:max-h-140 { max-height: 35rem !important; } .lt-xl\:max-h-160 { max-height: 40rem !important; } .lt-xl\:max-h-180 { max-height: 45rem !important; } .lt-xl\:max-h-192 { max-height: 48rem !important; } .lt-xl\:max-h-200 { max-height: 50rem !important; } .lt-xl\:max-h-240 { max-height: 60rem !important; } .lt-xl\:max-h-256 { max-height: 64rem !important; } .lt-xl\:max-h-280 { max-height: 70rem !important; } .lt-xl\:max-h-320 { max-height: 80rem !important; } .lt-xl\:max-h-360 { max-height: 90rem !important; } .lt-xl\:max-h-400 { max-height: 100rem !important; } .lt-xl\:max-h-480 { max-height: 120rem !important; } .lt-xl\:max-h-full { max-height: 100% !important; } .lt-xl\:max-h-screen { max-height: 100vh !important; } .lt-xl\:max-h-none { max-height: none !important; } .lt-xl\:max-h-px { max-height: 1px !important; } .lt-xl\:max-h-2px { max-height: 2px !important; } .lt-xl\:max-h-1\/2 { max-height: 50% !important; } .lt-xl\:max-h-1\/3 { max-height: 33.33333% !important; } .lt-xl\:max-h-2\/3 { max-height: 66.66667% !important; } .lt-xl\:max-h-1\/4 { max-height: 25% !important; } .lt-xl\:max-h-2\/4 { max-height: 50% !important; } .lt-xl\:max-h-3\/4 { max-height: 75% !important; } .lt-xl\:max-h-1\/5 { max-height: 20% !important; } .lt-xl\:max-h-2\/5 { max-height: 40% !important; } .lt-xl\:max-h-3\/5 { max-height: 60% !important; } .lt-xl\:max-h-4\/5 { max-height: 80% !important; } .lt-xl\:max-h-1\/12 { max-height: 8.33333% !important; } .lt-xl\:max-h-2\/12 { max-height: 16.66667% !important; } .lt-xl\:max-h-3\/12 { max-height: 25% !important; } .lt-xl\:max-h-4\/12 { max-height: 33.33333% !important; } .lt-xl\:max-h-5\/12 { max-height: 41.66667% !important; } .lt-xl\:max-h-6\/12 { max-height: 50% !important; } .lt-xl\:max-h-7\/12 { max-height: 58.33333% !important; } .lt-xl\:max-h-8\/12 { max-height: 66.66667% !important; } .lt-xl\:max-h-9\/12 { max-height: 75% !important; } .lt-xl\:max-h-10\/12 { max-height: 83.33333% !important; } .lt-xl\:max-h-11\/12 { max-height: 91.66667% !important; } .lt-xl\:max-w-0 { max-width: 0 !important; } .lt-xl\:max-w-1 { max-width: 0.25rem !important; } .lt-xl\:max-w-2 { max-width: 0.5rem !important; } .lt-xl\:max-w-3 { max-width: 0.75rem !important; } .lt-xl\:max-w-4 { max-width: 1rem !important; } .lt-xl\:max-w-5 { max-width: 1.25rem !important; } .lt-xl\:max-w-6 { max-width: 1.5rem !important; } .lt-xl\:max-w-8 { max-width: 2rem !important; } .lt-xl\:max-w-10 { max-width: 2.5rem !important; } .lt-xl\:max-w-12 { max-width: 3rem !important; } .lt-xl\:max-w-14 { max-width: 3.5rem !important; } .lt-xl\:max-w-16 { max-width: 4rem !important; } .lt-xl\:max-w-18 { max-width: 4.5rem !important; } .lt-xl\:max-w-20 { max-width: 5rem !important; } .lt-xl\:max-w-22 { max-width: 5.5rem !important; } .lt-xl\:max-w-24 { max-width: 6rem !important; } .lt-xl\:max-w-26 { max-width: 6.5rem !important; } .lt-xl\:max-w-28 { max-width: 7rem !important; } .lt-xl\:max-w-30 { max-width: 7.5rem !important; } .lt-xl\:max-w-32 { max-width: 8rem !important; } .lt-xl\:max-w-36 { max-width: 9rem !important; } .lt-xl\:max-w-40 { max-width: 10rem !important; } .lt-xl\:max-w-48 { max-width: 12rem !important; } .lt-xl\:max-w-50 { max-width: 12.5rem !important; } .lt-xl\:max-w-56 { max-width: 14rem !important; } .lt-xl\:max-w-60 { max-width: 15rem !important; } .lt-xl\:max-w-64 { max-width: 16rem !important; } .lt-xl\:max-w-80 { max-width: 20rem !important; } .lt-xl\:max-w-90 { max-width: 24rem !important; } .lt-xl\:max-w-100 { max-width: 25rem !important; } .lt-xl\:max-w-120 { max-width: 30rem !important; } .lt-xl\:max-w-128 { max-width: 32rem !important; } .lt-xl\:max-w-140 { max-width: 35rem !important; } .lt-xl\:max-w-160 { max-width: 40rem !important; } .lt-xl\:max-w-180 { max-width: 45rem !important; } .lt-xl\:max-w-192 { max-width: 48rem !important; } .lt-xl\:max-w-200 { max-width: 50rem !important; } .lt-xl\:max-w-240 { max-width: 60rem !important; } .lt-xl\:max-w-256 { max-width: 64rem !important; } .lt-xl\:max-w-280 { max-width: 70rem !important; } .lt-xl\:max-w-320 { max-width: 80rem !important; } .lt-xl\:max-w-360 { max-width: 90rem !important; } .lt-xl\:max-w-400 { max-width: 100rem !important; } .lt-xl\:max-w-480 { max-width: 120rem !important; } .lt-xl\:max-w-none { max-width: none !important; } .lt-xl\:max-w-xs { max-width: 20rem !important; } .lt-xl\:max-w-sm { max-width: 24rem !important; } .lt-xl\:max-w-md { max-width: 28rem !important; } .lt-xl\:max-w-lg { max-width: 32rem !important; } .lt-xl\:max-w-xl { max-width: 36rem !important; } .lt-xl\:max-w-2xl { max-width: 42rem !important; } .lt-xl\:max-w-3xl { max-width: 48rem !important; } .lt-xl\:max-w-4xl { max-width: 56rem !important; } .lt-xl\:max-w-5xl { max-width: 64rem !important; } .lt-xl\:max-w-6xl { max-width: 72rem !important; } .lt-xl\:max-w-full { max-width: 100% !important; } .lt-xl\:max-w-screen { max-width: 100vw !important; } .lt-xl\:max-w-px { max-width: 1px !important; } .lt-xl\:max-w-2px { max-width: 2px !important; } .lt-xl\:max-w-1\/2 { max-width: 50% !important; } .lt-xl\:max-w-1\/3 { max-width: 33.33333% !important; } .lt-xl\:max-w-2\/3 { max-width: 66.66667% !important; } .lt-xl\:max-w-1\/4 { max-width: 25% !important; } .lt-xl\:max-w-2\/4 { max-width: 50% !important; } .lt-xl\:max-w-3\/4 { max-width: 75% !important; } .lt-xl\:max-w-1\/5 { max-width: 20% !important; } .lt-xl\:max-w-2\/5 { max-width: 40% !important; } .lt-xl\:max-w-3\/5 { max-width: 60% !important; } .lt-xl\:max-w-4\/5 { max-width: 80% !important; } .lt-xl\:max-w-1\/12 { max-width: 8.33333% !important; } .lt-xl\:max-w-2\/12 { max-width: 16.66667% !important; } .lt-xl\:max-w-3\/12 { max-width: 25% !important; } .lt-xl\:max-w-4\/12 { max-width: 33.33333% !important; } .lt-xl\:max-w-5\/12 { max-width: 41.66667% !important; } .lt-xl\:max-w-6\/12 { max-width: 50% !important; } .lt-xl\:max-w-7\/12 { max-width: 58.33333% !important; } .lt-xl\:max-w-8\/12 { max-width: 66.66667% !important; } .lt-xl\:max-w-9\/12 { max-width: 75% !important; } .lt-xl\:max-w-10\/12 { max-width: 83.33333% !important; } .lt-xl\:max-w-11\/12 { max-width: 91.66667% !important; } .lt-xl\:min-h-0 { min-height: 0 !important; } .lt-xl\:min-h-1 { min-height: 0.25rem !important; } .lt-xl\:min-h-2 { min-height: 0.5rem !important; } .lt-xl\:min-h-3 { min-height: 0.75rem !important; } .lt-xl\:min-h-4 { min-height: 1rem !important; } .lt-xl\:min-h-5 { min-height: 1.25rem !important; } .lt-xl\:min-h-6 { min-height: 1.5rem !important; } .lt-xl\:min-h-8 { min-height: 2rem !important; } .lt-xl\:min-h-10 { min-height: 2.5rem !important; } .lt-xl\:min-h-12 { min-height: 3rem !important; } .lt-xl\:min-h-14 { min-height: 3.5rem !important; } .lt-xl\:min-h-16 { min-height: 4rem !important; } .lt-xl\:min-h-18 { min-height: 4.5rem !important; } .lt-xl\:min-h-20 { min-height: 5rem !important; } .lt-xl\:min-h-22 { min-height: 5.5rem !important; } .lt-xl\:min-h-24 { min-height: 6rem !important; } .lt-xl\:min-h-26 { min-height: 6.5rem !important; } .lt-xl\:min-h-28 { min-height: 7rem !important; } .lt-xl\:min-h-30 { min-height: 7.5rem !important; } .lt-xl\:min-h-32 { min-height: 8rem !important; } .lt-xl\:min-h-36 { min-height: 9rem !important; } .lt-xl\:min-h-40 { min-height: 10rem !important; } .lt-xl\:min-h-48 { min-height: 12rem !important; } .lt-xl\:min-h-50 { min-height: 12.5rem !important; } .lt-xl\:min-h-56 { min-height: 14rem !important; } .lt-xl\:min-h-60 { min-height: 15rem !important; } .lt-xl\:min-h-64 { min-height: 16rem !important; } .lt-xl\:min-h-80 { min-height: 20rem !important; } .lt-xl\:min-h-90 { min-height: 24rem !important; } .lt-xl\:min-h-100 { min-height: 25rem !important; } .lt-xl\:min-h-120 { min-height: 30rem !important; } .lt-xl\:min-h-128 { min-height: 32rem !important; } .lt-xl\:min-h-140 { min-height: 35rem !important; } .lt-xl\:min-h-160 { min-height: 40rem !important; } .lt-xl\:min-h-180 { min-height: 45rem !important; } .lt-xl\:min-h-192 { min-height: 48rem !important; } .lt-xl\:min-h-200 { min-height: 50rem !important; } .lt-xl\:min-h-240 { min-height: 60rem !important; } .lt-xl\:min-h-256 { min-height: 64rem !important; } .lt-xl\:min-h-280 { min-height: 70rem !important; } .lt-xl\:min-h-320 { min-height: 80rem !important; } .lt-xl\:min-h-360 { min-height: 90rem !important; } .lt-xl\:min-h-400 { min-height: 100rem !important; } .lt-xl\:min-h-480 { min-height: 120rem !important; } .lt-xl\:min-h-full { min-height: 100% !important; } .lt-xl\:min-h-screen { min-height: 100vh !important; } .lt-xl\:min-h-px { min-height: 1px !important; } .lt-xl\:min-h-2px { min-height: 2px !important; } .lt-xl\:min-h-1\/2 { min-height: 50% !important; } .lt-xl\:min-h-1\/3 { min-height: 33.33333% !important; } .lt-xl\:min-h-2\/3 { min-height: 66.66667% !important; } .lt-xl\:min-h-1\/4 { min-height: 25% !important; } .lt-xl\:min-h-2\/4 { min-height: 50% !important; } .lt-xl\:min-h-3\/4 { min-height: 75% !important; } .lt-xl\:min-h-1\/5 { min-height: 20% !important; } .lt-xl\:min-h-2\/5 { min-height: 40% !important; } .lt-xl\:min-h-3\/5 { min-height: 60% !important; } .lt-xl\:min-h-4\/5 { min-height: 80% !important; } .lt-xl\:min-h-1\/12 { min-height: 8.33333% !important; } .lt-xl\:min-h-2\/12 { min-height: 16.66667% !important; } .lt-xl\:min-h-3\/12 { min-height: 25% !important; } .lt-xl\:min-h-4\/12 { min-height: 33.33333% !important; } .lt-xl\:min-h-5\/12 { min-height: 41.66667% !important; } .lt-xl\:min-h-6\/12 { min-height: 50% !important; } .lt-xl\:min-h-7\/12 { min-height: 58.33333% !important; } .lt-xl\:min-h-8\/12 { min-height: 66.66667% !important; } .lt-xl\:min-h-9\/12 { min-height: 75% !important; } .lt-xl\:min-h-10\/12 { min-height: 83.33333% !important; } .lt-xl\:min-h-11\/12 { min-height: 91.66667% !important; } .lt-xl\:min-w-0 { min-width: 0 !important; } .lt-xl\:min-w-1 { min-width: 0.25rem !important; } .lt-xl\:min-w-2 { min-width: 0.5rem !important; } .lt-xl\:min-w-3 { min-width: 0.75rem !important; } .lt-xl\:min-w-4 { min-width: 1rem !important; } .lt-xl\:min-w-5 { min-width: 1.25rem !important; } .lt-xl\:min-w-6 { min-width: 1.5rem !important; } .lt-xl\:min-w-8 { min-width: 2rem !important; } .lt-xl\:min-w-10 { min-width: 2.5rem !important; } .lt-xl\:min-w-12 { min-width: 3rem !important; } .lt-xl\:min-w-14 { min-width: 3.5rem !important; } .lt-xl\:min-w-16 { min-width: 4rem !important; } .lt-xl\:min-w-18 { min-width: 4.5rem !important; } .lt-xl\:min-w-20 { min-width: 5rem !important; } .lt-xl\:min-w-22 { min-width: 5.5rem !important; } .lt-xl\:min-w-24 { min-width: 6rem !important; } .lt-xl\:min-w-26 { min-width: 6.5rem !important; } .lt-xl\:min-w-28 { min-width: 7rem !important; } .lt-xl\:min-w-30 { min-width: 7.5rem !important; } .lt-xl\:min-w-32 { min-width: 8rem !important; } .lt-xl\:min-w-36 { min-width: 9rem !important; } .lt-xl\:min-w-40 { min-width: 10rem !important; } .lt-xl\:min-w-48 { min-width: 12rem !important; } .lt-xl\:min-w-50 { min-width: 12.5rem !important; } .lt-xl\:min-w-56 { min-width: 14rem !important; } .lt-xl\:min-w-60 { min-width: 15rem !important; } .lt-xl\:min-w-64 { min-width: 16rem !important; } .lt-xl\:min-w-80 { min-width: 20rem !important; } .lt-xl\:min-w-90 { min-width: 24rem !important; } .lt-xl\:min-w-100 { min-width: 25rem !important; } .lt-xl\:min-w-120 { min-width: 30rem !important; } .lt-xl\:min-w-128 { min-width: 32rem !important; } .lt-xl\:min-w-140 { min-width: 35rem !important; } .lt-xl\:min-w-160 { min-width: 40rem !important; } .lt-xl\:min-w-180 { min-width: 45rem !important; } .lt-xl\:min-w-192 { min-width: 48rem !important; } .lt-xl\:min-w-200 { min-width: 50rem !important; } .lt-xl\:min-w-240 { min-width: 60rem !important; } .lt-xl\:min-w-256 { min-width: 64rem !important; } .lt-xl\:min-w-280 { min-width: 70rem !important; } .lt-xl\:min-w-320 { min-width: 80rem !important; } .lt-xl\:min-w-360 { min-width: 90rem !important; } .lt-xl\:min-w-400 { min-width: 100rem !important; } .lt-xl\:min-w-480 { min-width: 120rem !important; } .lt-xl\:min-w-full { min-width: 100% !important; } .lt-xl\:min-w-screen { min-width: 100vw !important; } .lt-xl\:min-w-px { min-width: 1px !important; } .lt-xl\:min-w-2px { min-width: 2px !important; } .lt-xl\:min-w-1\/2 { min-width: 50% !important; } .lt-xl\:min-w-1\/3 { min-width: 33.33333% !important; } .lt-xl\:min-w-2\/3 { min-width: 66.66667% !important; } .lt-xl\:min-w-1\/4 { min-width: 25% !important; } .lt-xl\:min-w-2\/4 { min-width: 50% !important; } .lt-xl\:min-w-3\/4 { min-width: 75% !important; } .lt-xl\:min-w-1\/5 { min-width: 20% !important; } .lt-xl\:min-w-2\/5 { min-width: 40% !important; } .lt-xl\:min-w-3\/5 { min-width: 60% !important; } .lt-xl\:min-w-4\/5 { min-width: 80% !important; } .lt-xl\:min-w-1\/12 { min-width: 8.33333% !important; } .lt-xl\:min-w-2\/12 { min-width: 16.66667% !important; } .lt-xl\:min-w-3\/12 { min-width: 25% !important; } .lt-xl\:min-w-4\/12 { min-width: 33.33333% !important; } .lt-xl\:min-w-5\/12 { min-width: 41.66667% !important; } .lt-xl\:min-w-6\/12 { min-width: 50% !important; } .lt-xl\:min-w-7\/12 { min-width: 58.33333% !important; } .lt-xl\:min-w-8\/12 { min-width: 66.66667% !important; } .lt-xl\:min-w-9\/12 { min-width: 75% !important; } .lt-xl\:min-w-10\/12 { min-width: 83.33333% !important; } .lt-xl\:min-w-11\/12 { min-width: 91.66667% !important; } .lt-xl\:object-contain { -o-object-fit: contain !important; object-fit: contain !important; } .lt-xl\:object-cover { -o-object-fit: cover !important; object-fit: cover !important; } .lt-xl\:object-fill { -o-object-fit: fill !important; object-fit: fill !important; } .lt-xl\:object-none { -o-object-fit: none !important; object-fit: none !important; } .lt-xl\:object-scale-down { -o-object-fit: scale-down !important; object-fit: scale-down !important; } .lt-xl\:object-bottom { -o-object-position: bottom !important; object-position: bottom !important; } .lt-xl\:object-center { -o-object-position: center !important; object-position: center !important; } .lt-xl\:object-left { -o-object-position: left !important; object-position: left !important; } .lt-xl\:object-left-bottom { -o-object-position: left bottom !important; object-position: left bottom !important; } .lt-xl\:object-left-top { -o-object-position: left top !important; object-position: left top !important; } .lt-xl\:object-right { -o-object-position: right !important; object-position: right !important; } .lt-xl\:object-right-bottom { -o-object-position: right bottom !important; object-position: right bottom !important; } .lt-xl\:object-right-top { -o-object-position: right top !important; object-position: right top !important; } .lt-xl\:object-top { -o-object-position: top !important; object-position: top !important; } .lt-xl\:opacity-0 { opacity: 0 !important; } .lt-xl\:opacity-12 { opacity: 0.12 !important; } .lt-xl\:opacity-25 { opacity: 0.25 !important; } .lt-xl\:opacity-38 { opacity: 0.38 !important; } .lt-xl\:opacity-50 { opacity: 0.5 !important; } .lt-xl\:opacity-54 { opacity: 0.54 !important; } .lt-xl\:opacity-70 { opacity: 0.70 !important; } .lt-xl\:opacity-75 { opacity: 0.75 !important; } .lt-xl\:opacity-84 { opacity: 0.84 !important; } .lt-xl\:opacity-100 { opacity: 1 !important; } .lt-xl\:hover\:opacity-0:hover { opacity: 0 !important; } .lt-xl\:hover\:opacity-12:hover { opacity: 0.12 !important; } .lt-xl\:hover\:opacity-25:hover { opacity: 0.25 !important; } .lt-xl\:hover\:opacity-38:hover { opacity: 0.38 !important; } .lt-xl\:hover\:opacity-50:hover { opacity: 0.5 !important; } .lt-xl\:hover\:opacity-54:hover { opacity: 0.54 !important; } .lt-xl\:hover\:opacity-70:hover { opacity: 0.70 !important; } .lt-xl\:hover\:opacity-75:hover { opacity: 0.75 !important; } .lt-xl\:hover\:opacity-84:hover { opacity: 0.84 !important; } .lt-xl\:hover\:opacity-100:hover { opacity: 1 !important; } .lt-xl\:focus\:opacity-0:focus { opacity: 0 !important; } .lt-xl\:focus\:opacity-12:focus { opacity: 0.12 !important; } .lt-xl\:focus\:opacity-25:focus { opacity: 0.25 !important; } .lt-xl\:focus\:opacity-38:focus { opacity: 0.38 !important; } .lt-xl\:focus\:opacity-50:focus { opacity: 0.5 !important; } .lt-xl\:focus\:opacity-54:focus { opacity: 0.54 !important; } .lt-xl\:focus\:opacity-70:focus { opacity: 0.70 !important; } .lt-xl\:focus\:opacity-75:focus { opacity: 0.75 !important; } .lt-xl\:focus\:opacity-84:focus { opacity: 0.84 !important; } .lt-xl\:focus\:opacity-100:focus { opacity: 1 !important; } .lt-xl\:outline-none { outline: 0 !important; } .lt-xl\:focus\:outline-none:focus { outline: 0 !important; } .lt-xl\:overflow-auto { overflow: auto !important; } .lt-xl\:overflow-hidden { overflow: hidden !important; } .lt-xl\:overflow-visible { overflow: visible !important; } .lt-xl\:overflow-scroll { overflow: scroll !important; } .lt-xl\:overflow-x-auto { overflow-x: auto !important; } .lt-xl\:overflow-y-auto { overflow-y: auto !important; } .lt-xl\:overflow-x-hidden { overflow-x: hidden !important; } .lt-xl\:overflow-y-hidden { overflow-y: hidden !important; } .lt-xl\:overflow-x-visible { overflow-x: visible !important; } .lt-xl\:overflow-y-visible { overflow-y: visible !important; } .lt-xl\:overflow-x-scroll { overflow-x: scroll !important; } .lt-xl\:overflow-y-scroll { overflow-y: scroll !important; } .lt-xl\:scrolling-touch { -webkit-overflow-scrolling: touch !important; } .lt-xl\:scrolling-auto { -webkit-overflow-scrolling: auto !important; } .lt-xl\:p-0 { padding: 0 !important; } .lt-xl\:p-1 { padding: 0.25rem !important; } .lt-xl\:p-2 { padding: 0.5rem !important; } .lt-xl\:p-3 { padding: 0.75rem !important; } .lt-xl\:p-4 { padding: 1rem !important; } .lt-xl\:p-5 { padding: 1.25rem !important; } .lt-xl\:p-6 { padding: 1.5rem !important; } .lt-xl\:p-8 { padding: 2rem !important; } .lt-xl\:p-10 { padding: 2.5rem !important; } .lt-xl\:p-12 { padding: 3rem !important; } .lt-xl\:p-14 { padding: 3.5rem !important; } .lt-xl\:p-16 { padding: 4rem !important; } .lt-xl\:p-18 { padding: 4.5rem !important; } .lt-xl\:p-20 { padding: 5rem !important; } .lt-xl\:p-22 { padding: 5.5rem !important; } .lt-xl\:p-24 { padding: 6rem !important; } .lt-xl\:p-26 { padding: 6.5rem !important; } .lt-xl\:p-28 { padding: 7rem !important; } .lt-xl\:p-30 { padding: 7.5rem !important; } .lt-xl\:p-32 { padding: 8rem !important; } .lt-xl\:p-36 { padding: 9rem !important; } .lt-xl\:p-40 { padding: 10rem !important; } .lt-xl\:p-48 { padding: 12rem !important; } .lt-xl\:p-56 { padding: 14rem !important; } .lt-xl\:p-64 { padding: 16rem !important; } .lt-xl\:p-px { padding: 1px !important; } .lt-xl\:p-2px { padding: 2px !important; } .lt-xl\:py-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .lt-xl\:px-0 { padding-left: 0 !important; padding-right: 0 !important; } .lt-xl\:py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .lt-xl\:px-1 { padding-left: 0.25rem !important; padding-right: 0.25rem !important; } .lt-xl\:py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .lt-xl\:px-2 { padding-left: 0.5rem !important; padding-right: 0.5rem !important; } .lt-xl\:py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .lt-xl\:px-3 { padding-left: 0.75rem !important; padding-right: 0.75rem !important; } .lt-xl\:py-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .lt-xl\:px-4 { padding-left: 1rem !important; padding-right: 1rem !important; } .lt-xl\:py-5 { padding-top: 1.25rem !important; padding-bottom: 1.25rem !important; } .lt-xl\:px-5 { padding-left: 1.25rem !important; padding-right: 1.25rem !important; } .lt-xl\:py-6 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .lt-xl\:px-6 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } .lt-xl\:py-8 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .lt-xl\:px-8 { padding-left: 2rem !important; padding-right: 2rem !important; } .lt-xl\:py-10 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .lt-xl\:px-10 { padding-left: 2.5rem !important; padding-right: 2.5rem !important; } .lt-xl\:py-12 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .lt-xl\:px-12 { padding-left: 3rem !important; padding-right: 3rem !important; } .lt-xl\:py-14 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .lt-xl\:px-14 { padding-left: 3.5rem !important; padding-right: 3.5rem !important; } .lt-xl\:py-16 { padding-top: 4rem !important; padding-bottom: 4rem !important; } .lt-xl\:px-16 { padding-left: 4rem !important; padding-right: 4rem !important; } .lt-xl\:py-18 { padding-top: 4.5rem !important; padding-bottom: 4.5rem !important; } .lt-xl\:px-18 { padding-left: 4.5rem !important; padding-right: 4.5rem !important; } .lt-xl\:py-20 { padding-top: 5rem !important; padding-bottom: 5rem !important; } .lt-xl\:px-20 { padding-left: 5rem !important; padding-right: 5rem !important; } .lt-xl\:py-22 { padding-top: 5.5rem !important; padding-bottom: 5.5rem !important; } .lt-xl\:px-22 { padding-left: 5.5rem !important; padding-right: 5.5rem !important; } .lt-xl\:py-24 { padding-top: 6rem !important; padding-bottom: 6rem !important; } .lt-xl\:px-24 { padding-left: 6rem !important; padding-right: 6rem !important; } .lt-xl\:py-26 { padding-top: 6.5rem !important; padding-bottom: 6.5rem !important; } .lt-xl\:px-26 { padding-left: 6.5rem !important; padding-right: 6.5rem !important; } .lt-xl\:py-28 { padding-top: 7rem !important; padding-bottom: 7rem !important; } .lt-xl\:px-28 { padding-left: 7rem !important; padding-right: 7rem !important; } .lt-xl\:py-30 { padding-top: 7.5rem !important; padding-bottom: 7.5rem !important; } .lt-xl\:px-30 { padding-left: 7.5rem !important; padding-right: 7.5rem !important; } .lt-xl\:py-32 { padding-top: 8rem !important; padding-bottom: 8rem !important; } .lt-xl\:px-32 { padding-left: 8rem !important; padding-right: 8rem !important; } .lt-xl\:py-36 { padding-top: 9rem !important; padding-bottom: 9rem !important; } .lt-xl\:px-36 { padding-left: 9rem !important; padding-right: 9rem !important; } .lt-xl\:py-40 { padding-top: 10rem !important; padding-bottom: 10rem !important; } .lt-xl\:px-40 { padding-left: 10rem !important; padding-right: 10rem !important; } .lt-xl\:py-48 { padding-top: 12rem !important; padding-bottom: 12rem !important; } .lt-xl\:px-48 { padding-left: 12rem !important; padding-right: 12rem !important; } .lt-xl\:py-56 { padding-top: 14rem !important; padding-bottom: 14rem !important; } .lt-xl\:px-56 { padding-left: 14rem !important; padding-right: 14rem !important; } .lt-xl\:py-64 { padding-top: 16rem !important; padding-bottom: 16rem !important; } .lt-xl\:px-64 { padding-left: 16rem !important; padding-right: 16rem !important; } .lt-xl\:py-px { padding-top: 1px !important; padding-bottom: 1px !important; } .lt-xl\:px-px { padding-left: 1px !important; padding-right: 1px !important; } .lt-xl\:py-2px { padding-top: 2px !important; padding-bottom: 2px !important; } .lt-xl\:px-2px { padding-left: 2px !important; padding-right: 2px !important; } .lt-xl\:pt-0 { padding-top: 0 !important; } .lt-xl\:pr-0 { padding-right: 0 !important; } .lt-xl\:pb-0 { padding-bottom: 0 !important; } .lt-xl\:pl-0 { padding-left: 0 !important; } .lt-xl\:pt-1 { padding-top: 0.25rem !important; } .lt-xl\:pr-1 { padding-right: 0.25rem !important; } .lt-xl\:pb-1 { padding-bottom: 0.25rem !important; } .lt-xl\:pl-1 { padding-left: 0.25rem !important; } .lt-xl\:pt-2 { padding-top: 0.5rem !important; } .lt-xl\:pr-2 { padding-right: 0.5rem !important; } .lt-xl\:pb-2 { padding-bottom: 0.5rem !important; } .lt-xl\:pl-2 { padding-left: 0.5rem !important; } .lt-xl\:pt-3 { padding-top: 0.75rem !important; } .lt-xl\:pr-3 { padding-right: 0.75rem !important; } .lt-xl\:pb-3 { padding-bottom: 0.75rem !important; } .lt-xl\:pl-3 { padding-left: 0.75rem !important; } .lt-xl\:pt-4 { padding-top: 1rem !important; } .lt-xl\:pr-4 { padding-right: 1rem !important; } .lt-xl\:pb-4 { padding-bottom: 1rem !important; } .lt-xl\:pl-4 { padding-left: 1rem !important; } .lt-xl\:pt-5 { padding-top: 1.25rem !important; } .lt-xl\:pr-5 { padding-right: 1.25rem !important; } .lt-xl\:pb-5 { padding-bottom: 1.25rem !important; } .lt-xl\:pl-5 { padding-left: 1.25rem !important; } .lt-xl\:pt-6 { padding-top: 1.5rem !important; } .lt-xl\:pr-6 { padding-right: 1.5rem !important; } .lt-xl\:pb-6 { padding-bottom: 1.5rem !important; } .lt-xl\:pl-6 { padding-left: 1.5rem !important; } .lt-xl\:pt-8 { padding-top: 2rem !important; } .lt-xl\:pr-8 { padding-right: 2rem !important; } .lt-xl\:pb-8 { padding-bottom: 2rem !important; } .lt-xl\:pl-8 { padding-left: 2rem !important; } .lt-xl\:pt-10 { padding-top: 2.5rem !important; } .lt-xl\:pr-10 { padding-right: 2.5rem !important; } .lt-xl\:pb-10 { padding-bottom: 2.5rem !important; } .lt-xl\:pl-10 { padding-left: 2.5rem !important; } .lt-xl\:pt-12 { padding-top: 3rem !important; } .lt-xl\:pr-12 { padding-right: 3rem !important; } .lt-xl\:pb-12 { padding-bottom: 3rem !important; } .lt-xl\:pl-12 { padding-left: 3rem !important; } .lt-xl\:pt-14 { padding-top: 3.5rem !important; } .lt-xl\:pr-14 { padding-right: 3.5rem !important; } .lt-xl\:pb-14 { padding-bottom: 3.5rem !important; } .lt-xl\:pl-14 { padding-left: 3.5rem !important; } .lt-xl\:pt-16 { padding-top: 4rem !important; } .lt-xl\:pr-16 { padding-right: 4rem !important; } .lt-xl\:pb-16 { padding-bottom: 4rem !important; } .lt-xl\:pl-16 { padding-left: 4rem !important; } .lt-xl\:pt-18 { padding-top: 4.5rem !important; } .lt-xl\:pr-18 { padding-right: 4.5rem !important; } .lt-xl\:pb-18 { padding-bottom: 4.5rem !important; } .lt-xl\:pl-18 { padding-left: 4.5rem !important; } .lt-xl\:pt-20 { padding-top: 5rem !important; } .lt-xl\:pr-20 { padding-right: 5rem !important; } .lt-xl\:pb-20 { padding-bottom: 5rem !important; } .lt-xl\:pl-20 { padding-left: 5rem !important; } .lt-xl\:pt-22 { padding-top: 5.5rem !important; } .lt-xl\:pr-22 { padding-right: 5.5rem !important; } .lt-xl\:pb-22 { padding-bottom: 5.5rem !important; } .lt-xl\:pl-22 { padding-left: 5.5rem !important; } .lt-xl\:pt-24 { padding-top: 6rem !important; } .lt-xl\:pr-24 { padding-right: 6rem !important; } .lt-xl\:pb-24 { padding-bottom: 6rem !important; } .lt-xl\:pl-24 { padding-left: 6rem !important; } .lt-xl\:pt-26 { padding-top: 6.5rem !important; } .lt-xl\:pr-26 { padding-right: 6.5rem !important; } .lt-xl\:pb-26 { padding-bottom: 6.5rem !important; } .lt-xl\:pl-26 { padding-left: 6.5rem !important; } .lt-xl\:pt-28 { padding-top: 7rem !important; } .lt-xl\:pr-28 { padding-right: 7rem !important; } .lt-xl\:pb-28 { padding-bottom: 7rem !important; } .lt-xl\:pl-28 { padding-left: 7rem !important; } .lt-xl\:pt-30 { padding-top: 7.5rem !important; } .lt-xl\:pr-30 { padding-right: 7.5rem !important; } .lt-xl\:pb-30 { padding-bottom: 7.5rem !important; } .lt-xl\:pl-30 { padding-left: 7.5rem !important; } .lt-xl\:pt-32 { padding-top: 8rem !important; } .lt-xl\:pr-32 { padding-right: 8rem !important; } .lt-xl\:pb-32 { padding-bottom: 8rem !important; } .lt-xl\:pl-32 { padding-left: 8rem !important; } .lt-xl\:pt-36 { padding-top: 9rem !important; } .lt-xl\:pr-36 { padding-right: 9rem !important; } .lt-xl\:pb-36 { padding-bottom: 9rem !important; } .lt-xl\:pl-36 { padding-left: 9rem !important; } .lt-xl\:pt-40 { padding-top: 10rem !important; } .lt-xl\:pr-40 { padding-right: 10rem !important; } .lt-xl\:pb-40 { padding-bottom: 10rem !important; } .lt-xl\:pl-40 { padding-left: 10rem !important; } .lt-xl\:pt-48 { padding-top: 12rem !important; } .lt-xl\:pr-48 { padding-right: 12rem !important; } .lt-xl\:pb-48 { padding-bottom: 12rem !important; } .lt-xl\:pl-48 { padding-left: 12rem !important; } .lt-xl\:pt-56 { padding-top: 14rem !important; } .lt-xl\:pr-56 { padding-right: 14rem !important; } .lt-xl\:pb-56 { padding-bottom: 14rem !important; } .lt-xl\:pl-56 { padding-left: 14rem !important; } .lt-xl\:pt-64 { padding-top: 16rem !important; } .lt-xl\:pr-64 { padding-right: 16rem !important; } .lt-xl\:pb-64 { padding-bottom: 16rem !important; } .lt-xl\:pl-64 { padding-left: 16rem !important; } .lt-xl\:pt-px { padding-top: 1px !important; } .lt-xl\:pr-px { padding-right: 1px !important; } .lt-xl\:pb-px { padding-bottom: 1px !important; } .lt-xl\:pl-px { padding-left: 1px !important; } .lt-xl\:pt-2px { padding-top: 2px !important; } .lt-xl\:pr-2px { padding-right: 2px !important; } .lt-xl\:pb-2px { padding-bottom: 2px !important; } .lt-xl\:pl-2px { padding-left: 2px !important; } .lt-xl\:placeholder-opacity-0::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .lt-xl\:placeholder-opacity-0::-moz-placeholder { --placeholder-opacity: 0 !important; } .lt-xl\:placeholder-opacity-0::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .lt-xl\:placeholder-opacity-0::placeholder { --placeholder-opacity: 0 !important; } .lt-xl\:placeholder-opacity-12::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .lt-xl\:placeholder-opacity-12::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .lt-xl\:placeholder-opacity-12::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .lt-xl\:placeholder-opacity-12::placeholder { --placeholder-opacity: 0.12 !important; } .lt-xl\:placeholder-opacity-25::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .lt-xl\:placeholder-opacity-25::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .lt-xl\:placeholder-opacity-25::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .lt-xl\:placeholder-opacity-25::placeholder { --placeholder-opacity: 0.25 !important; } .lt-xl\:placeholder-opacity-38::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .lt-xl\:placeholder-opacity-38::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .lt-xl\:placeholder-opacity-38::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .lt-xl\:placeholder-opacity-38::placeholder { --placeholder-opacity: 0.38 !important; } .lt-xl\:placeholder-opacity-50::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .lt-xl\:placeholder-opacity-50::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .lt-xl\:placeholder-opacity-50::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .lt-xl\:placeholder-opacity-50::placeholder { --placeholder-opacity: 0.5 !important; } .lt-xl\:placeholder-opacity-54::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .lt-xl\:placeholder-opacity-54::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .lt-xl\:placeholder-opacity-54::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .lt-xl\:placeholder-opacity-54::placeholder { --placeholder-opacity: 0.54 !important; } .lt-xl\:placeholder-opacity-70::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .lt-xl\:placeholder-opacity-70::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .lt-xl\:placeholder-opacity-70::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .lt-xl\:placeholder-opacity-70::placeholder { --placeholder-opacity: 0.70 !important; } .lt-xl\:placeholder-opacity-75::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .lt-xl\:placeholder-opacity-75::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .lt-xl\:placeholder-opacity-75::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .lt-xl\:placeholder-opacity-75::placeholder { --placeholder-opacity: 0.75 !important; } .lt-xl\:placeholder-opacity-84::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .lt-xl\:placeholder-opacity-84::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .lt-xl\:placeholder-opacity-84::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .lt-xl\:placeholder-opacity-84::placeholder { --placeholder-opacity: 0.84 !important; } .lt-xl\:placeholder-opacity-100::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .lt-xl\:placeholder-opacity-100::-moz-placeholder { --placeholder-opacity: 1 !important; } .lt-xl\:placeholder-opacity-100::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .lt-xl\:placeholder-opacity-100::placeholder { --placeholder-opacity: 1 !important; } .lt-xl\:focus\:placeholder-opacity-0:focus::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .lt-xl\:focus\:placeholder-opacity-0:focus::-moz-placeholder { --placeholder-opacity: 0 !important; } .lt-xl\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .lt-xl\:focus\:placeholder-opacity-0:focus::placeholder { --placeholder-opacity: 0 !important; } .lt-xl\:focus\:placeholder-opacity-12:focus::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .lt-xl\:focus\:placeholder-opacity-12:focus::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .lt-xl\:focus\:placeholder-opacity-12:focus::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .lt-xl\:focus\:placeholder-opacity-12:focus::placeholder { --placeholder-opacity: 0.12 !important; } .lt-xl\:focus\:placeholder-opacity-25:focus::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .lt-xl\:focus\:placeholder-opacity-25:focus::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .lt-xl\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .lt-xl\:focus\:placeholder-opacity-25:focus::placeholder { --placeholder-opacity: 0.25 !important; } .lt-xl\:focus\:placeholder-opacity-38:focus::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .lt-xl\:focus\:placeholder-opacity-38:focus::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .lt-xl\:focus\:placeholder-opacity-38:focus::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .lt-xl\:focus\:placeholder-opacity-38:focus::placeholder { --placeholder-opacity: 0.38 !important; } .lt-xl\:focus\:placeholder-opacity-50:focus::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .lt-xl\:focus\:placeholder-opacity-50:focus::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .lt-xl\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .lt-xl\:focus\:placeholder-opacity-50:focus::placeholder { --placeholder-opacity: 0.5 !important; } .lt-xl\:focus\:placeholder-opacity-54:focus::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .lt-xl\:focus\:placeholder-opacity-54:focus::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .lt-xl\:focus\:placeholder-opacity-54:focus::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .lt-xl\:focus\:placeholder-opacity-54:focus::placeholder { --placeholder-opacity: 0.54 !important; } .lt-xl\:focus\:placeholder-opacity-70:focus::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .lt-xl\:focus\:placeholder-opacity-70:focus::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .lt-xl\:focus\:placeholder-opacity-70:focus::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .lt-xl\:focus\:placeholder-opacity-70:focus::placeholder { --placeholder-opacity: 0.70 !important; } .lt-xl\:focus\:placeholder-opacity-75:focus::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .lt-xl\:focus\:placeholder-opacity-75:focus::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .lt-xl\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .lt-xl\:focus\:placeholder-opacity-75:focus::placeholder { --placeholder-opacity: 0.75 !important; } .lt-xl\:focus\:placeholder-opacity-84:focus::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .lt-xl\:focus\:placeholder-opacity-84:focus::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .lt-xl\:focus\:placeholder-opacity-84:focus::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .lt-xl\:focus\:placeholder-opacity-84:focus::placeholder { --placeholder-opacity: 0.84 !important; } .lt-xl\:focus\:placeholder-opacity-100:focus::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .lt-xl\:focus\:placeholder-opacity-100:focus::-moz-placeholder { --placeholder-opacity: 1 !important; } .lt-xl\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .lt-xl\:focus\:placeholder-opacity-100:focus::placeholder { --placeholder-opacity: 1 !important; } .lt-xl\:pointer-events-none { pointer-events: none !important; } .lt-xl\:pointer-events-auto { pointer-events: auto !important; } .lt-xl\:static { position: static !important; } .lt-xl\:fixed { position: fixed !important; } .lt-xl\:absolute { position: absolute !important; } .lt-xl\:relative { position: relative !important; } .lt-xl\:sticky { position: -webkit-sticky !important; position: sticky !important; } .lt-xl\:inset-0 { top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; } .lt-xl\:inset-auto { top: auto !important; right: auto !important; bottom: auto !important; left: auto !important; } .lt-xl\:inset-y-0 { top: 0 !important; bottom: 0 !important; } .lt-xl\:inset-x-0 { right: 0 !important; left: 0 !important; } .lt-xl\:inset-y-auto { top: auto !important; bottom: auto !important; } .lt-xl\:inset-x-auto { right: auto !important; left: auto !important; } .lt-xl\:top-0 { top: 0 !important; } .lt-xl\:right-0 { right: 0 !important; } .lt-xl\:bottom-0 { bottom: 0 !important; } .lt-xl\:left-0 { left: 0 !important; } .lt-xl\:top-auto { top: auto !important; } .lt-xl\:right-auto { right: auto !important; } .lt-xl\:bottom-auto { bottom: auto !important; } .lt-xl\:left-auto { left: auto !important; } .lt-xl\:shadow-xs { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .lt-xl\:shadow-sm { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .lt-xl\:shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .lt-xl\:shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .lt-xl\:shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .lt-xl\:shadow-xl { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .lt-xl\:shadow-2xl { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .lt-xl\:shadow-inner { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .lt-xl\:shadow-outline { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .lt-xl\:shadow-none { box-shadow: none !important; } .lt-xl\:shadow-solid { box-shadow: 0 0 0 2px currentColor !important; } .lt-xl\:hover\:shadow-xs:hover { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .lt-xl\:hover\:shadow-sm:hover { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .lt-xl\:hover\:shadow:hover { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .lt-xl\:hover\:shadow-md:hover { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .lt-xl\:hover\:shadow-lg:hover { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .lt-xl\:hover\:shadow-xl:hover { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .lt-xl\:hover\:shadow-2xl:hover { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .lt-xl\:hover\:shadow-inner:hover { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .lt-xl\:hover\:shadow-outline:hover { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .lt-xl\:hover\:shadow-none:hover { box-shadow: none !important; } .lt-xl\:hover\:shadow-solid:hover { box-shadow: 0 0 0 2px currentColor !important; } .lt-xl\:focus\:shadow-xs:focus { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .lt-xl\:focus\:shadow-sm:focus { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .lt-xl\:focus\:shadow:focus { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .lt-xl\:focus\:shadow-md:focus { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .lt-xl\:focus\:shadow-lg:focus { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .lt-xl\:focus\:shadow-xl:focus { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .lt-xl\:focus\:shadow-2xl:focus { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .lt-xl\:focus\:shadow-inner:focus { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .lt-xl\:focus\:shadow-outline:focus { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .lt-xl\:focus\:shadow-none:focus { box-shadow: none !important; } .lt-xl\:focus\:shadow-solid:focus { box-shadow: 0 0 0 2px currentColor !important; } .lt-xl\:fill-current { fill: currentColor !important; } .lt-xl\:stroke-current { stroke: currentColor !important; } .lt-xl\:stroke-0 { stroke-width: 0 !important; } .lt-xl\:stroke-1 { stroke-width: 1 !important; } .lt-xl\:stroke-2 { stroke-width: 2 !important; } .lt-xl\:table-auto { table-layout: auto !important; } .lt-xl\:table-fixed { table-layout: fixed !important; } .lt-xl\:text-left { text-align: left !important; } .lt-xl\:text-center { text-align: center !important; } .lt-xl\:text-right { text-align: right !important; } .lt-xl\:text-justify { text-align: justify !important; } .lt-xl\:text-opacity-0 { --text-opacity: 0 !important; } .lt-xl\:text-opacity-12 { --text-opacity: 0.12 !important; } .lt-xl\:text-opacity-25 { --text-opacity: 0.25 !important; } .lt-xl\:text-opacity-38 { --text-opacity: 0.38 !important; } .lt-xl\:text-opacity-50 { --text-opacity: 0.5 !important; } .lt-xl\:text-opacity-54 { --text-opacity: 0.54 !important; } .lt-xl\:text-opacity-70 { --text-opacity: 0.70 !important; } .lt-xl\:text-opacity-75 { --text-opacity: 0.75 !important; } .lt-xl\:text-opacity-84 { --text-opacity: 0.84 !important; } .lt-xl\:text-opacity-100 { --text-opacity: 1 !important; } .lt-xl\:hover\:text-opacity-0:hover { --text-opacity: 0 !important; } .lt-xl\:hover\:text-opacity-12:hover { --text-opacity: 0.12 !important; } .lt-xl\:hover\:text-opacity-25:hover { --text-opacity: 0.25 !important; } .lt-xl\:hover\:text-opacity-38:hover { --text-opacity: 0.38 !important; } .lt-xl\:hover\:text-opacity-50:hover { --text-opacity: 0.5 !important; } .lt-xl\:hover\:text-opacity-54:hover { --text-opacity: 0.54 !important; } .lt-xl\:hover\:text-opacity-70:hover { --text-opacity: 0.70 !important; } .lt-xl\:hover\:text-opacity-75:hover { --text-opacity: 0.75 !important; } .lt-xl\:hover\:text-opacity-84:hover { --text-opacity: 0.84 !important; } .lt-xl\:hover\:text-opacity-100:hover { --text-opacity: 1 !important; } .lt-xl\:focus\:text-opacity-0:focus { --text-opacity: 0 !important; } .lt-xl\:focus\:text-opacity-12:focus { --text-opacity: 0.12 !important; } .lt-xl\:focus\:text-opacity-25:focus { --text-opacity: 0.25 !important; } .lt-xl\:focus\:text-opacity-38:focus { --text-opacity: 0.38 !important; } .lt-xl\:focus\:text-opacity-50:focus { --text-opacity: 0.5 !important; } .lt-xl\:focus\:text-opacity-54:focus { --text-opacity: 0.54 !important; } .lt-xl\:focus\:text-opacity-70:focus { --text-opacity: 0.70 !important; } .lt-xl\:focus\:text-opacity-75:focus { --text-opacity: 0.75 !important; } .lt-xl\:focus\:text-opacity-84:focus { --text-opacity: 0.84 !important; } .lt-xl\:focus\:text-opacity-100:focus { --text-opacity: 1 !important; } .lt-xl\:italic { font-style: italic !important; } .lt-xl\:not-italic { font-style: normal !important; } .lt-xl\:uppercase { text-transform: uppercase !important; } .lt-xl\:lowercase { text-transform: lowercase !important; } .lt-xl\:capitalize { text-transform: capitalize !important; } .lt-xl\:normal-case { text-transform: none !important; } .lt-xl\:underline { text-decoration: underline !important; } .lt-xl\:line-through { text-decoration: line-through !important; } .lt-xl\:no-underline { text-decoration: none !important; } .lt-xl\:hover\:underline:hover { text-decoration: underline !important; } .lt-xl\:hover\:line-through:hover { text-decoration: line-through !important; } .lt-xl\:hover\:no-underline:hover { text-decoration: none !important; } .lt-xl\:focus\:underline:focus { text-decoration: underline !important; } .lt-xl\:focus\:line-through:focus { text-decoration: line-through !important; } .lt-xl\:focus\:no-underline:focus { text-decoration: none !important; } .lt-xl\:tracking-tighter { letter-spacing: -0.05em !important; } .lt-xl\:tracking-tight { letter-spacing: -0.025em !important; } .lt-xl\:tracking-normal { letter-spacing: 0 !important; } .lt-xl\:tracking-wide { letter-spacing: 0.025em !important; } .lt-xl\:tracking-wider { letter-spacing: 0.05em !important; } .lt-xl\:tracking-widest { letter-spacing: 0.1em !important; } .lt-xl\:select-none { -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important; } .lt-xl\:select-text { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } .lt-xl\:select-all { -webkit-user-select: all !important; -moz-user-select: all !important; -ms-user-select: all !important; user-select: all !important; } .lt-xl\:select-auto { -webkit-user-select: auto !important; -moz-user-select: auto !important; -ms-user-select: auto !important; user-select: auto !important; } .lt-xl\:align-baseline { vertical-align: baseline !important; } .lt-xl\:align-top { vertical-align: top !important; } .lt-xl\:align-middle { vertical-align: middle !important; } .lt-xl\:align-bottom { vertical-align: bottom !important; } .lt-xl\:align-text-top { vertical-align: text-top !important; } .lt-xl\:align-text-bottom { vertical-align: text-bottom !important; } .lt-xl\:visible { visibility: visible !important; } .lt-xl\:invisible { visibility: hidden !important; } .lt-xl\:whitespace-normal { white-space: normal !important; } .lt-xl\:whitespace-no-wrap { white-space: nowrap !important; } .lt-xl\:whitespace-pre { white-space: pre !important; } .lt-xl\:whitespace-pre-line { white-space: pre-line !important; } .lt-xl\:whitespace-pre-wrap { white-space: pre-wrap !important; } .lt-xl\:break-normal { overflow-wrap: normal !important; word-break: normal !important; } .lt-xl\:break-words { overflow-wrap: break-word !important; } .lt-xl\:break-all { word-break: break-all !important; } .lt-xl\:truncate { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } .lt-xl\:w-0 { width: 0 !important; } .lt-xl\:w-1 { width: 0.25rem !important; } .lt-xl\:w-2 { width: 0.5rem !important; } .lt-xl\:w-3 { width: 0.75rem !important; } .lt-xl\:w-4 { width: 1rem !important; } .lt-xl\:w-5 { width: 1.25rem !important; } .lt-xl\:w-6 { width: 1.5rem !important; } .lt-xl\:w-8 { width: 2rem !important; } .lt-xl\:w-10 { width: 2.5rem !important; } .lt-xl\:w-12 { width: 3rem !important; } .lt-xl\:w-14 { width: 3.5rem !important; } .lt-xl\:w-16 { width: 4rem !important; } .lt-xl\:w-18 { width: 4.5rem !important; } .lt-xl\:w-20 { width: 5rem !important; } .lt-xl\:w-22 { width: 5.5rem !important; } .lt-xl\:w-24 { width: 6rem !important; } .lt-xl\:w-26 { width: 6.5rem !important; } .lt-xl\:w-28 { width: 7rem !important; } .lt-xl\:w-30 { width: 7.5rem !important; } .lt-xl\:w-32 { width: 8rem !important; } .lt-xl\:w-36 { width: 9rem !important; } .lt-xl\:w-40 { width: 10rem !important; } .lt-xl\:w-48 { width: 12rem !important; } .lt-xl\:w-50 { width: 12.5rem !important; } .lt-xl\:w-56 { width: 14rem !important; } .lt-xl\:w-60 { width: 15rem !important; } .lt-xl\:w-64 { width: 16rem !important; } .lt-xl\:w-80 { width: 20rem !important; } .lt-xl\:w-90 { width: 24rem !important; } .lt-xl\:w-100 { width: 25rem !important; } .lt-xl\:w-120 { width: 30rem !important; } .lt-xl\:w-128 { width: 32rem !important; } .lt-xl\:w-140 { width: 35rem !important; } .lt-xl\:w-160 { width: 40rem !important; } .lt-xl\:w-180 { width: 45rem !important; } .lt-xl\:w-192 { width: 48rem !important; } .lt-xl\:w-200 { width: 50rem !important; } .lt-xl\:w-240 { width: 60rem !important; } .lt-xl\:w-256 { width: 64rem !important; } .lt-xl\:w-280 { width: 70rem !important; } .lt-xl\:w-320 { width: 80rem !important; } .lt-xl\:w-360 { width: 90rem !important; } .lt-xl\:w-400 { width: 100rem !important; } .lt-xl\:w-480 { width: 120rem !important; } .lt-xl\:w-auto { width: auto !important; } .lt-xl\:w-px { width: 1px !important; } .lt-xl\:w-2px { width: 2px !important; } .lt-xl\:w-1\/2 { width: 50% !important; } .lt-xl\:w-1\/3 { width: 33.33333% !important; } .lt-xl\:w-2\/3 { width: 66.66667% !important; } .lt-xl\:w-1\/4 { width: 25% !important; } .lt-xl\:w-2\/4 { width: 50% !important; } .lt-xl\:w-3\/4 { width: 75% !important; } .lt-xl\:w-1\/5 { width: 20% !important; } .lt-xl\:w-2\/5 { width: 40% !important; } .lt-xl\:w-3\/5 { width: 60% !important; } .lt-xl\:w-4\/5 { width: 80% !important; } .lt-xl\:w-1\/6 { width: 16.666667% !important; } .lt-xl\:w-2\/6 { width: 33.333333% !important; } .lt-xl\:w-3\/6 { width: 50% !important; } .lt-xl\:w-4\/6 { width: 66.666667% !important; } .lt-xl\:w-5\/6 { width: 83.333333% !important; } .lt-xl\:w-1\/12 { width: 8.33333% !important; } .lt-xl\:w-2\/12 { width: 16.66667% !important; } .lt-xl\:w-3\/12 { width: 25% !important; } .lt-xl\:w-4\/12 { width: 33.33333% !important; } .lt-xl\:w-5\/12 { width: 41.66667% !important; } .lt-xl\:w-6\/12 { width: 50% !important; } .lt-xl\:w-7\/12 { width: 58.33333% !important; } .lt-xl\:w-8\/12 { width: 66.66667% !important; } .lt-xl\:w-9\/12 { width: 75% !important; } .lt-xl\:w-10\/12 { width: 83.33333% !important; } .lt-xl\:w-11\/12 { width: 91.66667% !important; } .lt-xl\:w-full { width: 100% !important; } .lt-xl\:w-screen { width: 100vw !important; } .lt-xl\:z-0 { z-index: 0 !important; } .lt-xl\:z-10 { z-index: 10 !important; } .lt-xl\:z-20 { z-index: 20 !important; } .lt-xl\:z-30 { z-index: 30 !important; } .lt-xl\:z-40 { z-index: 40 !important; } .lt-xl\:z-50 { z-index: 50 !important; } .lt-xl\:z-60 { z-index: 60 !important; } .lt-xl\:z-70 { z-index: 70 !important; } .lt-xl\:z-80 { z-index: 80 !important; } .lt-xl\:z-90 { z-index: 90 !important; } .lt-xl\:z-99 { z-index: 99 !important; } .lt-xl\:z-999 { z-index: 999 !important; } .lt-xl\:z-9999 { z-index: 9999 !important; } .lt-xl\:z-99999 { z-index: 99999 !important; } .lt-xl\:z-auto { z-index: auto !important; } .lt-xl\:-z-1 { z-index: -1 !important; } .lt-xl\:gap-0 { grid-gap: 0 !important; gap: 0 !important; } .lt-xl\:gap-1 { grid-gap: 0.25rem !important; gap: 0.25rem !important; } .lt-xl\:gap-2 { grid-gap: 0.5rem !important; gap: 0.5rem !important; } .lt-xl\:gap-3 { grid-gap: 0.75rem !important; gap: 0.75rem !important; } .lt-xl\:gap-4 { grid-gap: 1rem !important; gap: 1rem !important; } .lt-xl\:gap-5 { grid-gap: 1.25rem !important; gap: 1.25rem !important; } .lt-xl\:gap-6 { grid-gap: 1.5rem !important; gap: 1.5rem !important; } .lt-xl\:gap-8 { grid-gap: 2rem !important; gap: 2rem !important; } .lt-xl\:gap-10 { grid-gap: 2.5rem !important; gap: 2.5rem !important; } .lt-xl\:gap-12 { grid-gap: 3rem !important; gap: 3rem !important; } .lt-xl\:gap-14 { grid-gap: 3.5rem !important; gap: 3.5rem !important; } .lt-xl\:gap-16 { grid-gap: 4rem !important; gap: 4rem !important; } .lt-xl\:gap-18 { grid-gap: 4.5rem !important; gap: 4.5rem !important; } .lt-xl\:gap-20 { grid-gap: 5rem !important; gap: 5rem !important; } .lt-xl\:gap-22 { grid-gap: 5.5rem !important; gap: 5.5rem !important; } .lt-xl\:gap-24 { grid-gap: 6rem !important; gap: 6rem !important; } .lt-xl\:gap-26 { grid-gap: 6.5rem !important; gap: 6.5rem !important; } .lt-xl\:gap-28 { grid-gap: 7rem !important; gap: 7rem !important; } .lt-xl\:gap-30 { grid-gap: 7.5rem !important; gap: 7.5rem !important; } .lt-xl\:gap-32 { grid-gap: 8rem !important; gap: 8rem !important; } .lt-xl\:gap-36 { grid-gap: 9rem !important; gap: 9rem !important; } .lt-xl\:gap-40 { grid-gap: 10rem !important; gap: 10rem !important; } .lt-xl\:gap-48 { grid-gap: 12rem !important; gap: 12rem !important; } .lt-xl\:gap-56 { grid-gap: 14rem !important; gap: 14rem !important; } .lt-xl\:gap-64 { grid-gap: 16rem !important; gap: 16rem !important; } .lt-xl\:gap-px { grid-gap: 1px !important; gap: 1px !important; } .lt-xl\:gap-2px { grid-gap: 2px !important; gap: 2px !important; } .lt-xl\:col-gap-0 { grid-column-gap: 0 !important; -moz-column-gap: 0 !important; column-gap: 0 !important; } .lt-xl\:col-gap-1 { grid-column-gap: 0.25rem !important; -moz-column-gap: 0.25rem !important; column-gap: 0.25rem !important; } .lt-xl\:col-gap-2 { grid-column-gap: 0.5rem !important; -moz-column-gap: 0.5rem !important; column-gap: 0.5rem !important; } .lt-xl\:col-gap-3 { grid-column-gap: 0.75rem !important; -moz-column-gap: 0.75rem !important; column-gap: 0.75rem !important; } .lt-xl\:col-gap-4 { grid-column-gap: 1rem !important; -moz-column-gap: 1rem !important; column-gap: 1rem !important; } .lt-xl\:col-gap-5 { grid-column-gap: 1.25rem !important; -moz-column-gap: 1.25rem !important; column-gap: 1.25rem !important; } .lt-xl\:col-gap-6 { grid-column-gap: 1.5rem !important; -moz-column-gap: 1.5rem !important; column-gap: 1.5rem !important; } .lt-xl\:col-gap-8 { grid-column-gap: 2rem !important; -moz-column-gap: 2rem !important; column-gap: 2rem !important; } .lt-xl\:col-gap-10 { grid-column-gap: 2.5rem !important; -moz-column-gap: 2.5rem !important; column-gap: 2.5rem !important; } .lt-xl\:col-gap-12 { grid-column-gap: 3rem !important; -moz-column-gap: 3rem !important; column-gap: 3rem !important; } .lt-xl\:col-gap-14 { grid-column-gap: 3.5rem !important; -moz-column-gap: 3.5rem !important; column-gap: 3.5rem !important; } .lt-xl\:col-gap-16 { grid-column-gap: 4rem !important; -moz-column-gap: 4rem !important; column-gap: 4rem !important; } .lt-xl\:col-gap-18 { grid-column-gap: 4.5rem !important; -moz-column-gap: 4.5rem !important; column-gap: 4.5rem !important; } .lt-xl\:col-gap-20 { grid-column-gap: 5rem !important; -moz-column-gap: 5rem !important; column-gap: 5rem !important; } .lt-xl\:col-gap-22 { grid-column-gap: 5.5rem !important; -moz-column-gap: 5.5rem !important; column-gap: 5.5rem !important; } .lt-xl\:col-gap-24 { grid-column-gap: 6rem !important; -moz-column-gap: 6rem !important; column-gap: 6rem !important; } .lt-xl\:col-gap-26 { grid-column-gap: 6.5rem !important; -moz-column-gap: 6.5rem !important; column-gap: 6.5rem !important; } .lt-xl\:col-gap-28 { grid-column-gap: 7rem !important; -moz-column-gap: 7rem !important; column-gap: 7rem !important; } .lt-xl\:col-gap-30 { grid-column-gap: 7.5rem !important; -moz-column-gap: 7.5rem !important; column-gap: 7.5rem !important; } .lt-xl\:col-gap-32 { grid-column-gap: 8rem !important; -moz-column-gap: 8rem !important; column-gap: 8rem !important; } .lt-xl\:col-gap-36 { grid-column-gap: 9rem !important; -moz-column-gap: 9rem !important; column-gap: 9rem !important; } .lt-xl\:col-gap-40 { grid-column-gap: 10rem !important; -moz-column-gap: 10rem !important; column-gap: 10rem !important; } .lt-xl\:col-gap-48 { grid-column-gap: 12rem !important; -moz-column-gap: 12rem !important; column-gap: 12rem !important; } .lt-xl\:col-gap-56 { grid-column-gap: 14rem !important; -moz-column-gap: 14rem !important; column-gap: 14rem !important; } .lt-xl\:col-gap-64 { grid-column-gap: 16rem !important; -moz-column-gap: 16rem !important; column-gap: 16rem !important; } .lt-xl\:col-gap-px { grid-column-gap: 1px !important; -moz-column-gap: 1px !important; column-gap: 1px !important; } .lt-xl\:col-gap-2px { grid-column-gap: 2px !important; -moz-column-gap: 2px !important; column-gap: 2px !important; } .lt-xl\:row-gap-0 { grid-row-gap: 0 !important; row-gap: 0 !important; } .lt-xl\:row-gap-1 { grid-row-gap: 0.25rem !important; row-gap: 0.25rem !important; } .lt-xl\:row-gap-2 { grid-row-gap: 0.5rem !important; row-gap: 0.5rem !important; } .lt-xl\:row-gap-3 { grid-row-gap: 0.75rem !important; row-gap: 0.75rem !important; } .lt-xl\:row-gap-4 { grid-row-gap: 1rem !important; row-gap: 1rem !important; } .lt-xl\:row-gap-5 { grid-row-gap: 1.25rem !important; row-gap: 1.25rem !important; } .lt-xl\:row-gap-6 { grid-row-gap: 1.5rem !important; row-gap: 1.5rem !important; } .lt-xl\:row-gap-8 { grid-row-gap: 2rem !important; row-gap: 2rem !important; } .lt-xl\:row-gap-10 { grid-row-gap: 2.5rem !important; row-gap: 2.5rem !important; } .lt-xl\:row-gap-12 { grid-row-gap: 3rem !important; row-gap: 3rem !important; } .lt-xl\:row-gap-14 { grid-row-gap: 3.5rem !important; row-gap: 3.5rem !important; } .lt-xl\:row-gap-16 { grid-row-gap: 4rem !important; row-gap: 4rem !important; } .lt-xl\:row-gap-18 { grid-row-gap: 4.5rem !important; row-gap: 4.5rem !important; } .lt-xl\:row-gap-20 { grid-row-gap: 5rem !important; row-gap: 5rem !important; } .lt-xl\:row-gap-22 { grid-row-gap: 5.5rem !important; row-gap: 5.5rem !important; } .lt-xl\:row-gap-24 { grid-row-gap: 6rem !important; row-gap: 6rem !important; } .lt-xl\:row-gap-26 { grid-row-gap: 6.5rem !important; row-gap: 6.5rem !important; } .lt-xl\:row-gap-28 { grid-row-gap: 7rem !important; row-gap: 7rem !important; } .lt-xl\:row-gap-30 { grid-row-gap: 7.5rem !important; row-gap: 7.5rem !important; } .lt-xl\:row-gap-32 { grid-row-gap: 8rem !important; row-gap: 8rem !important; } .lt-xl\:row-gap-36 { grid-row-gap: 9rem !important; row-gap: 9rem !important; } .lt-xl\:row-gap-40 { grid-row-gap: 10rem !important; row-gap: 10rem !important; } .lt-xl\:row-gap-48 { grid-row-gap: 12rem !important; row-gap: 12rem !important; } .lt-xl\:row-gap-56 { grid-row-gap: 14rem !important; row-gap: 14rem !important; } .lt-xl\:row-gap-64 { grid-row-gap: 16rem !important; row-gap: 16rem !important; } .lt-xl\:row-gap-px { grid-row-gap: 1px !important; row-gap: 1px !important; } .lt-xl\:row-gap-2px { grid-row-gap: 2px !important; row-gap: 2px !important; } .lt-xl\:grid-flow-row { grid-auto-flow: row !important; } .lt-xl\:grid-flow-col { grid-auto-flow: column !important; } .lt-xl\:grid-flow-row-dense { grid-auto-flow: row dense !important; } .lt-xl\:grid-flow-col-dense { grid-auto-flow: column dense !important; } .lt-xl\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; } .lt-xl\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } .lt-xl\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; } .lt-xl\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; } .lt-xl\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; } .lt-xl\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; } .lt-xl\:grid-cols-7 { grid-template-columns: repeat(7, minmax(0, 1fr)) !important; } .lt-xl\:grid-cols-8 { grid-template-columns: repeat(8, minmax(0, 1fr)) !important; } .lt-xl\:grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)) !important; } .lt-xl\:grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)) !important; } .lt-xl\:grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)) !important; } .lt-xl\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)) !important; } .lt-xl\:grid-cols-none { grid-template-columns: none !important; } .lt-xl\:col-auto { grid-column: auto !important; } .lt-xl\:col-span-1 { grid-column: span 1 / span 1 !important; } .lt-xl\:col-span-2 { grid-column: span 2 / span 2 !important; } .lt-xl\:col-span-3 { grid-column: span 3 / span 3 !important; } .lt-xl\:col-span-4 { grid-column: span 4 / span 4 !important; } .lt-xl\:col-span-5 { grid-column: span 5 / span 5 !important; } .lt-xl\:col-span-6 { grid-column: span 6 / span 6 !important; } .lt-xl\:col-span-7 { grid-column: span 7 / span 7 !important; } .lt-xl\:col-span-8 { grid-column: span 8 / span 8 !important; } .lt-xl\:col-span-9 { grid-column: span 9 / span 9 !important; } .lt-xl\:col-span-10 { grid-column: span 10 / span 10 !important; } .lt-xl\:col-span-11 { grid-column: span 11 / span 11 !important; } .lt-xl\:col-span-12 { grid-column: span 12 / span 12 !important; } .lt-xl\:col-start-1 { grid-column-start: 1 !important; } .lt-xl\:col-start-2 { grid-column-start: 2 !important; } .lt-xl\:col-start-3 { grid-column-start: 3 !important; } .lt-xl\:col-start-4 { grid-column-start: 4 !important; } .lt-xl\:col-start-5 { grid-column-start: 5 !important; } .lt-xl\:col-start-6 { grid-column-start: 6 !important; } .lt-xl\:col-start-7 { grid-column-start: 7 !important; } .lt-xl\:col-start-8 { grid-column-start: 8 !important; } .lt-xl\:col-start-9 { grid-column-start: 9 !important; } .lt-xl\:col-start-10 { grid-column-start: 10 !important; } .lt-xl\:col-start-11 { grid-column-start: 11 !important; } .lt-xl\:col-start-12 { grid-column-start: 12 !important; } .lt-xl\:col-start-13 { grid-column-start: 13 !important; } .lt-xl\:col-start-auto { grid-column-start: auto !important; } .lt-xl\:col-end-1 { grid-column-end: 1 !important; } .lt-xl\:col-end-2 { grid-column-end: 2 !important; } .lt-xl\:col-end-3 { grid-column-end: 3 !important; } .lt-xl\:col-end-4 { grid-column-end: 4 !important; } .lt-xl\:col-end-5 { grid-column-end: 5 !important; } .lt-xl\:col-end-6 { grid-column-end: 6 !important; } .lt-xl\:col-end-7 { grid-column-end: 7 !important; } .lt-xl\:col-end-8 { grid-column-end: 8 !important; } .lt-xl\:col-end-9 { grid-column-end: 9 !important; } .lt-xl\:col-end-10 { grid-column-end: 10 !important; } .lt-xl\:col-end-11 { grid-column-end: 11 !important; } .lt-xl\:col-end-12 { grid-column-end: 12 !important; } .lt-xl\:col-end-13 { grid-column-end: 13 !important; } .lt-xl\:col-end-auto { grid-column-end: auto !important; } .lt-xl\:grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)) !important; } .lt-xl\:grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)) !important; } .lt-xl\:grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)) !important; } .lt-xl\:grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)) !important; } .lt-xl\:grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)) !important; } .lt-xl\:grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)) !important; } .lt-xl\:grid-rows-none { grid-template-rows: none !important; } .lt-xl\:row-auto { grid-row: auto !important; } .lt-xl\:row-span-1 { grid-row: span 1 / span 1 !important; } .lt-xl\:row-span-2 { grid-row: span 2 / span 2 !important; } .lt-xl\:row-span-3 { grid-row: span 3 / span 3 !important; } .lt-xl\:row-span-4 { grid-row: span 4 / span 4 !important; } .lt-xl\:row-span-5 { grid-row: span 5 / span 5 !important; } .lt-xl\:row-span-6 { grid-row: span 6 / span 6 !important; } .lt-xl\:row-start-1 { grid-row-start: 1 !important; } .lt-xl\:row-start-2 { grid-row-start: 2 !important; } .lt-xl\:row-start-3 { grid-row-start: 3 !important; } .lt-xl\:row-start-4 { grid-row-start: 4 !important; } .lt-xl\:row-start-5 { grid-row-start: 5 !important; } .lt-xl\:row-start-6 { grid-row-start: 6 !important; } .lt-xl\:row-start-7 { grid-row-start: 7 !important; } .lt-xl\:row-start-auto { grid-row-start: auto !important; } .lt-xl\:row-end-1 { grid-row-end: 1 !important; } .lt-xl\:row-end-2 { grid-row-end: 2 !important; } .lt-xl\:row-end-3 { grid-row-end: 3 !important; } .lt-xl\:row-end-4 { grid-row-end: 4 !important; } .lt-xl\:row-end-5 { grid-row-end: 5 !important; } .lt-xl\:row-end-6 { grid-row-end: 6 !important; } .lt-xl\:row-end-7 { grid-row-end: 7 !important; } .lt-xl\:row-end-auto { grid-row-end: auto !important; } .lt-xl\:transform { --transform-translate-x: 0 !important; --transform-translate-y: 0 !important; --transform-rotate: 0 !important; --transform-skew-x: 0 !important; --transform-skew-y: 0 !important; --transform-scale-x: 1 !important; --transform-scale-y: 1 !important; transform: translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y)) !important; } .lt-xl\:transform-none { transform: none !important; } .lt-xl\:origin-center { transform-origin: center !important; } .lt-xl\:origin-top { transform-origin: top !important; } .lt-xl\:origin-top-right { transform-origin: top right !important; } .lt-xl\:origin-right { transform-origin: right !important; } .lt-xl\:origin-bottom-right { transform-origin: bottom right !important; } .lt-xl\:origin-bottom { transform-origin: bottom !important; } .lt-xl\:origin-bottom-left { transform-origin: bottom left !important; } .lt-xl\:origin-left { transform-origin: left !important; } .lt-xl\:origin-top-left { transform-origin: top left !important; } .lt-xl\:icon-size-12 { width: 12px !important; height: 12px !important; min-width: 12px !important; min-height: 12px !important; font-size: 12px !important; line-height: 12px !important; } .lt-xl\:icon-size-12 svg { width: 12px !important; height: 12px !important; } .lt-xl\:icon-size-14 { width: 14px !important; height: 14px !important; min-width: 14px !important; min-height: 14px !important; font-size: 14px !important; line-height: 14px !important; } .lt-xl\:icon-size-14 svg { width: 14px !important; height: 14px !important; } .lt-xl\:icon-size-16 { width: 16px !important; height: 16px !important; min-width: 16px !important; min-height: 16px !important; font-size: 16px !important; line-height: 16px !important; } .lt-xl\:icon-size-16 svg { width: 16px !important; height: 16px !important; } .lt-xl\:icon-size-18 { width: 18px !important; height: 18px !important; min-width: 18px !important; min-height: 18px !important; font-size: 18px !important; line-height: 18px !important; } .lt-xl\:icon-size-18 svg { width: 18px !important; height: 18px !important; } .lt-xl\:icon-size-20 { width: 20px !important; height: 20px !important; min-width: 20px !important; min-height: 20px !important; font-size: 20px !important; line-height: 20px !important; } .lt-xl\:icon-size-20 svg { width: 20px !important; height: 20px !important; } .lt-xl\:icon-size-24 { width: 24px !important; height: 24px !important; min-width: 24px !important; min-height: 24px !important; font-size: 24px !important; line-height: 24px !important; } .lt-xl\:icon-size-24 svg { width: 24px !important; height: 24px !important; } .lt-xl\:icon-size-32 { width: 32px !important; height: 32px !important; min-width: 32px !important; min-height: 32px !important; font-size: 32px !important; line-height: 32px !important; } .lt-xl\:icon-size-32 svg { width: 32px !important; height: 32px !important; } .lt-xl\:icon-size-40 { width: 40px !important; height: 40px !important; min-width: 40px !important; min-height: 40px !important; font-size: 40px !important; line-height: 40px !important; } .lt-xl\:icon-size-40 svg { width: 40px !important; height: 40px !important; } .lt-xl\:icon-size-48 { width: 48px !important; height: 48px !important; min-width: 48px !important; min-height: 48px !important; font-size: 48px !important; line-height: 48px !important; } .lt-xl\:icon-size-48 svg { width: 48px !important; height: 48px !important; } .lt-xl\:icon-size-56 { width: 56px !important; height: 56px !important; min-width: 56px !important; min-height: 56px !important; font-size: 56px !important; line-height: 56px !important; } .lt-xl\:icon-size-56 svg { width: 56px !important; height: 56px !important; } .lt-xl\:icon-size-64 { width: 64px !important; height: 64px !important; min-width: 64px !important; min-height: 64px !important; font-size: 64px !important; line-height: 64px !important; } .lt-xl\:icon-size-64 svg { width: 64px !important; height: 64px !important; } .lt-xl\:icon-size-72 { width: 72px !important; height: 72px !important; min-width: 72px !important; min-height: 72px !important; font-size: 72px !important; line-height: 72px !important; } .lt-xl\:icon-size-72 svg { width: 72px !important; height: 72px !important; } .lt-xl\:icon-size-80 { width: 80px !important; height: 80px !important; min-width: 80px !important; min-height: 80px !important; font-size: 80px !important; line-height: 80px !important; } .lt-xl\:icon-size-80 svg { width: 80px !important; height: 80px !important; } .lt-xl\:icon-size-88 { width: 88px !important; height: 88px !important; min-width: 88px !important; min-height: 88px !important; font-size: 88px !important; line-height: 88px !important; } .lt-xl\:icon-size-88 svg { width: 88px !important; height: 88px !important; } .lt-xl\:icon-size-96 { width: 96px !important; height: 96px !important; min-width: 96px !important; min-height: 96px !important; font-size: 96px !important; line-height: 96px !important; } .lt-xl\:icon-size-96 svg { width: 96px !important; height: 96px !important; } } @media (min-width: 600px) { .gt-xs\:space-y-0 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0px * var(--space-y-reverse)) !important; } .gt-xs\:space-x-0 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0px * var(--space-x-reverse)) !important; margin-left: calc(0px * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.25rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.25rem * var(--space-x-reverse)) !important; margin-left: calc(0.25rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.5rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.5rem * var(--space-x-reverse)) !important; margin-left: calc(0.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.75rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.75rem * var(--space-x-reverse)) !important; margin-left: calc(0.75rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1rem * var(--space-x-reverse)) !important; margin-left: calc(1rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.25rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.25rem * var(--space-x-reverse)) !important; margin-left: calc(1.25rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.5rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.5rem * var(--space-x-reverse)) !important; margin-left: calc(1.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2rem * var(--space-x-reverse)) !important; margin-left: calc(2rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2.5rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2.5rem * var(--space-x-reverse)) !important; margin-left: calc(2.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3rem * var(--space-x-reverse)) !important; margin-left: calc(3rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3.5rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3.5rem * var(--space-x-reverse)) !important; margin-left: calc(3.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4rem * var(--space-x-reverse)) !important; margin-left: calc(4rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4.5rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4.5rem * var(--space-x-reverse)) !important; margin-left: calc(4.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5rem * var(--space-x-reverse)) !important; margin-left: calc(5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5.5rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5.5rem * var(--space-x-reverse)) !important; margin-left: calc(5.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6rem * var(--space-x-reverse)) !important; margin-left: calc(6rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6.5rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6.5rem * var(--space-x-reverse)) !important; margin-left: calc(6.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7rem * var(--space-x-reverse)) !important; margin-left: calc(7rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7.5rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7.5rem * var(--space-x-reverse)) !important; margin-left: calc(7.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(8rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(8rem * var(--space-x-reverse)) !important; margin-left: calc(8rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(9rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(9rem * var(--space-x-reverse)) !important; margin-left: calc(9rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(10rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(10rem * var(--space-x-reverse)) !important; margin-left: calc(10rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(12rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(12rem * var(--space-x-reverse)) !important; margin-left: calc(12rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(14rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(14rem * var(--space-x-reverse)) !important; margin-left: calc(14rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(16rem * var(--space-y-reverse)) !important; } .gt-xs\:space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(16rem * var(--space-x-reverse)) !important; margin-left: calc(16rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1px * var(--space-y-reverse)) !important; } .gt-xs\:space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1px * var(--space-x-reverse)) !important; margin-left: calc(1px * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2px * var(--space-y-reverse)) !important; } .gt-xs\:space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2px * var(--space-x-reverse)) !important; margin-left: calc(2px * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.25rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.25rem * var(--space-x-reverse)) !important; margin-left: calc(-0.25rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.5rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.5rem * var(--space-x-reverse)) !important; margin-left: calc(-0.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.75rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.75rem * var(--space-x-reverse)) !important; margin-left: calc(-0.75rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1rem * var(--space-x-reverse)) !important; margin-left: calc(-1rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.25rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.25rem * var(--space-x-reverse)) !important; margin-left: calc(-1.25rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.5rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.5rem * var(--space-x-reverse)) !important; margin-left: calc(-1.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2rem * var(--space-x-reverse)) !important; margin-left: calc(-2rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2.5rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2.5rem * var(--space-x-reverse)) !important; margin-left: calc(-2.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3rem * var(--space-x-reverse)) !important; margin-left: calc(-3rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3.5rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3.5rem * var(--space-x-reverse)) !important; margin-left: calc(-3.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4rem * var(--space-x-reverse)) !important; margin-left: calc(-4rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4.5rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4.5rem * var(--space-x-reverse)) !important; margin-left: calc(-4.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5rem * var(--space-x-reverse)) !important; margin-left: calc(-5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5.5rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5.5rem * var(--space-x-reverse)) !important; margin-left: calc(-5.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6rem * var(--space-x-reverse)) !important; margin-left: calc(-6rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6.5rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6.5rem * var(--space-x-reverse)) !important; margin-left: calc(-6.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7rem * var(--space-x-reverse)) !important; margin-left: calc(-7rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7.5rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7.5rem * var(--space-x-reverse)) !important; margin-left: calc(-7.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-8rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-8rem * var(--space-x-reverse)) !important; margin-left: calc(-8rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-9rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-9rem * var(--space-x-reverse)) !important; margin-left: calc(-9rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-10rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-10rem * var(--space-x-reverse)) !important; margin-left: calc(-10rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-12rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-12rem * var(--space-x-reverse)) !important; margin-left: calc(-12rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-14rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-14rem * var(--space-x-reverse)) !important; margin-left: calc(-14rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-16rem * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-16rem * var(--space-x-reverse)) !important; margin-left: calc(-16rem * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1px * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1px * var(--space-x-reverse)) !important; margin-left: calc(-1px * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:-space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2px * var(--space-y-reverse)) !important; } .gt-xs\:-space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2px * var(--space-x-reverse)) !important; margin-left: calc(-2px * calc(1 - var(--space-x-reverse))) !important; } .gt-xs\:space-y-reverse > :not(template) ~ :not(template) { --space-y-reverse: 1 !important; } .gt-xs\:space-x-reverse > :not(template) ~ :not(template) { --space-x-reverse: 1 !important; } .gt-xs\:divide-y-0 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(0px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(0px * var(--divide-y-reverse)) !important; } .gt-xs\:divide-x-0 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(0px * var(--divide-x-reverse)) !important; border-left-width: calc(0px * calc(1 - var(--divide-x-reverse))) !important; } .gt-xs\:divide-y-2 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(2px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(2px * var(--divide-y-reverse)) !important; } .gt-xs\:divide-x-2 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(2px * var(--divide-x-reverse)) !important; border-left-width: calc(2px * calc(1 - var(--divide-x-reverse))) !important; } .gt-xs\:divide-y-4 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(4px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(4px * var(--divide-y-reverse)) !important; } .gt-xs\:divide-x-4 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(4px * var(--divide-x-reverse)) !important; border-left-width: calc(4px * calc(1 - var(--divide-x-reverse))) !important; } .gt-xs\:divide-y-8 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(8px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(8px * var(--divide-y-reverse)) !important; } .gt-xs\:divide-x-8 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(8px * var(--divide-x-reverse)) !important; border-left-width: calc(8px * calc(1 - var(--divide-x-reverse))) !important; } .gt-xs\:divide-y > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(1px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(1px * var(--divide-y-reverse)) !important; } .gt-xs\:divide-x > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(1px * var(--divide-x-reverse)) !important; border-left-width: calc(1px * calc(1 - var(--divide-x-reverse))) !important; } .gt-xs\:divide-y-reverse > :not(template) ~ :not(template) { --divide-y-reverse: 1 !important; } .gt-xs\:divide-x-reverse > :not(template) ~ :not(template) { --divide-x-reverse: 1 !important; } .gt-xs\:divide-current > :not(template) ~ :not(template) { border-color: currentColor !important; } .gt-xs\:divide-transparent > :not(template) ~ :not(template) { border-color: transparent !important; } .gt-xs\:divide-white > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFFFFF !important; border-color: rgba(255, 255, 255, var(--divide-opacity)) !important; } .gt-xs\:divide-black > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #000000 !important; border-color: rgba(0, 0, 0, var(--divide-opacity)) !important; } .gt-xs\:divide-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F9FAFB !important; border-color: rgba(249, 250, 251, var(--divide-opacity)) !important; } .gt-xs\:divide-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F4F5F7 !important; border-color: rgba(244, 245, 247, var(--divide-opacity)) !important; } .gt-xs\:divide-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5E7EB !important; border-color: rgba(229, 231, 235, var(--divide-opacity)) !important; } .gt-xs\:divide-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D2D6DC !important; border-color: rgba(210, 214, 220, var(--divide-opacity)) !important; } .gt-xs\:divide-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9FA6B2 !important; border-color: rgba(159, 166, 178, var(--divide-opacity)) !important; } .gt-xs\:divide-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .gt-xs\:divide-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4B5563 !important; border-color: rgba(75, 85, 99, var(--divide-opacity)) !important; } .gt-xs\:divide-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #374151 !important; border-color: rgba(55, 65, 81, var(--divide-opacity)) !important; } .gt-xs\:divide-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #252F3F !important; border-color: rgba(37, 47, 63, var(--divide-opacity)) !important; } .gt-xs\:divide-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #161E2E !important; border-color: rgba(22, 30, 46, var(--divide-opacity)) !important; } .gt-xs\:divide-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .gt-xs\:divide-cool-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBFDFE !important; border-color: rgba(251, 253, 254, var(--divide-opacity)) !important; } .gt-xs\:divide-cool-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F1F5F9 !important; border-color: rgba(241, 245, 249, var(--divide-opacity)) !important; } .gt-xs\:divide-cool-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E2E8F0 !important; border-color: rgba(226, 232, 240, var(--divide-opacity)) !important; } .gt-xs\:divide-cool-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CFD8E3 !important; border-color: rgba(207, 216, 227, var(--divide-opacity)) !important; } .gt-xs\:divide-cool-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #97A6BA !important; border-color: rgba(151, 166, 186, var(--divide-opacity)) !important; } .gt-xs\:divide-cool-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .gt-xs\:divide-cool-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #475569 !important; border-color: rgba(71, 85, 105, var(--divide-opacity)) !important; } .gt-xs\:divide-cool-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #364152 !important; border-color: rgba(54, 65, 82, var(--divide-opacity)) !important; } .gt-xs\:divide-cool-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #27303F !important; border-color: rgba(39, 48, 63, var(--divide-opacity)) !important; } .gt-xs\:divide-cool-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A202E !important; border-color: rgba(26, 32, 46, var(--divide-opacity)) !important; } .gt-xs\:divide-cool-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .gt-xs\:divide-red-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F2 !important; border-color: rgba(253, 242, 242, var(--divide-opacity)) !important; } .gt-xs\:divide-red-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDE8E8 !important; border-color: rgba(253, 232, 232, var(--divide-opacity)) !important; } .gt-xs\:divide-red-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBD5D5 !important; border-color: rgba(251, 213, 213, var(--divide-opacity)) !important; } .gt-xs\:divide-red-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4B4 !important; border-color: rgba(248, 180, 180, var(--divide-opacity)) !important; } .gt-xs\:divide-red-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F98080 !important; border-color: rgba(249, 128, 128, var(--divide-opacity)) !important; } .gt-xs\:divide-red-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .gt-xs\:divide-red-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E02424 !important; border-color: rgba(224, 36, 36, var(--divide-opacity)) !important; } .gt-xs\:divide-red-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C81E1E !important; border-color: rgba(200, 30, 30, var(--divide-opacity)) !important; } .gt-xs\:divide-red-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9B1C1C !important; border-color: rgba(155, 28, 28, var(--divide-opacity)) !important; } .gt-xs\:divide-red-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .gt-xs\:divide-red > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .gt-xs\:divide-orange-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFF8F1 !important; border-color: rgba(255, 248, 241, var(--divide-opacity)) !important; } .gt-xs\:divide-orange-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FEECDC !important; border-color: rgba(254, 236, 220, var(--divide-opacity)) !important; } .gt-xs\:divide-orange-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCD9BD !important; border-color: rgba(252, 217, 189, var(--divide-opacity)) !important; } .gt-xs\:divide-orange-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDBA8C !important; border-color: rgba(253, 186, 140, var(--divide-opacity)) !important; } .gt-xs\:divide-orange-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF8A4C !important; border-color: rgba(255, 138, 76, var(--divide-opacity)) !important; } .gt-xs\:divide-orange-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .gt-xs\:divide-orange-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D03801 !important; border-color: rgba(208, 56, 1, var(--divide-opacity)) !important; } .gt-xs\:divide-orange-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B43403 !important; border-color: rgba(180, 52, 3, var(--divide-opacity)) !important; } .gt-xs\:divide-orange-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8A2C0D !important; border-color: rgba(138, 44, 13, var(--divide-opacity)) !important; } .gt-xs\:divide-orange-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .gt-xs\:divide-orange > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .gt-xs\:divide-yellow-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDFDEA !important; border-color: rgba(253, 253, 234, var(--divide-opacity)) !important; } .gt-xs\:divide-yellow-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF6B2 !important; border-color: rgba(253, 246, 178, var(--divide-opacity)) !important; } .gt-xs\:divide-yellow-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE96A !important; border-color: rgba(252, 233, 106, var(--divide-opacity)) !important; } .gt-xs\:divide-yellow-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FACA15 !important; border-color: rgba(250, 202, 21, var(--divide-opacity)) !important; } .gt-xs\:divide-yellow-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E3A008 !important; border-color: rgba(227, 160, 8, var(--divide-opacity)) !important; } .gt-xs\:divide-yellow-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .gt-xs\:divide-yellow-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9F580A !important; border-color: rgba(159, 88, 10, var(--divide-opacity)) !important; } .gt-xs\:divide-yellow-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8E4B10 !important; border-color: rgba(142, 75, 16, var(--divide-opacity)) !important; } .gt-xs\:divide-yellow-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #723B13 !important; border-color: rgba(114, 59, 19, var(--divide-opacity)) !important; } .gt-xs\:divide-yellow-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #633112 !important; border-color: rgba(99, 49, 18, var(--divide-opacity)) !important; } .gt-xs\:divide-yellow > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .gt-xs\:divide-green-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F3FAF7 !important; border-color: rgba(243, 250, 247, var(--divide-opacity)) !important; } .gt-xs\:divide-green-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DEF7EC !important; border-color: rgba(222, 247, 236, var(--divide-opacity)) !important; } .gt-xs\:divide-green-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BCF0DA !important; border-color: rgba(188, 240, 218, var(--divide-opacity)) !important; } .gt-xs\:divide-green-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #84E1BC !important; border-color: rgba(132, 225, 188, var(--divide-opacity)) !important; } .gt-xs\:divide-green-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #31C48D !important; border-color: rgba(49, 196, 141, var(--divide-opacity)) !important; } .gt-xs\:divide-green-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .gt-xs\:divide-green-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #057A55 !important; border-color: rgba(5, 122, 85, var(--divide-opacity)) !important; } .gt-xs\:divide-green-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #046C4E !important; border-color: rgba(4, 108, 78, var(--divide-opacity)) !important; } .gt-xs\:divide-green-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #03543F !important; border-color: rgba(3, 84, 63, var(--divide-opacity)) !important; } .gt-xs\:divide-green-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014737 !important; border-color: rgba(1, 71, 55, var(--divide-opacity)) !important; } .gt-xs\:divide-green > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .gt-xs\:divide-teal-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDFAFA !important; border-color: rgba(237, 250, 250, var(--divide-opacity)) !important; } .gt-xs\:divide-teal-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D5F5F6 !important; border-color: rgba(213, 245, 246, var(--divide-opacity)) !important; } .gt-xs\:divide-teal-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AFECEF !important; border-color: rgba(175, 236, 239, var(--divide-opacity)) !important; } .gt-xs\:divide-teal-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7EDCE2 !important; border-color: rgba(126, 220, 226, var(--divide-opacity)) !important; } .gt-xs\:divide-teal-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #16BDCA !important; border-color: rgba(22, 189, 202, var(--divide-opacity)) !important; } .gt-xs\:divide-teal-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .gt-xs\:divide-teal-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #047481 !important; border-color: rgba(4, 116, 129, var(--divide-opacity)) !important; } .gt-xs\:divide-teal-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #036672 !important; border-color: rgba(3, 102, 114, var(--divide-opacity)) !important; } .gt-xs\:divide-teal-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #05505C !important; border-color: rgba(5, 80, 92, var(--divide-opacity)) !important; } .gt-xs\:divide-teal-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014451 !important; border-color: rgba(1, 68, 81, var(--divide-opacity)) !important; } .gt-xs\:divide-teal > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .gt-xs\:divide-blue-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EBF5FF !important; border-color: rgba(235, 245, 255, var(--divide-opacity)) !important; } .gt-xs\:divide-blue-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E1EFFE !important; border-color: rgba(225, 239, 254, var(--divide-opacity)) !important; } .gt-xs\:divide-blue-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C3DDFD !important; border-color: rgba(195, 221, 253, var(--divide-opacity)) !important; } .gt-xs\:divide-blue-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #A4CAFE !important; border-color: rgba(164, 202, 254, var(--divide-opacity)) !important; } .gt-xs\:divide-blue-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #76A9FA !important; border-color: rgba(118, 169, 250, var(--divide-opacity)) !important; } .gt-xs\:divide-blue-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .gt-xs\:divide-blue-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1C64F2 !important; border-color: rgba(28, 100, 242, var(--divide-opacity)) !important; } .gt-xs\:divide-blue-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A56DB !important; border-color: rgba(26, 86, 219, var(--divide-opacity)) !important; } .gt-xs\:divide-blue-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1E429F !important; border-color: rgba(30, 66, 159, var(--divide-opacity)) !important; } .gt-xs\:divide-blue-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #233876 !important; border-color: rgba(35, 56, 118, var(--divide-opacity)) !important; } .gt-xs\:divide-blue > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .gt-xs\:divide-indigo-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F0F5FF !important; border-color: rgba(240, 245, 255, var(--divide-opacity)) !important; } .gt-xs\:divide-indigo-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5EDFF !important; border-color: rgba(229, 237, 255, var(--divide-opacity)) !important; } .gt-xs\:divide-indigo-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CDDBFE !important; border-color: rgba(205, 219, 254, var(--divide-opacity)) !important; } .gt-xs\:divide-indigo-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B4C6FC !important; border-color: rgba(180, 198, 252, var(--divide-opacity)) !important; } .gt-xs\:divide-indigo-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8DA2FB !important; border-color: rgba(141, 162, 251, var(--divide-opacity)) !important; } .gt-xs\:divide-indigo-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .gt-xs\:divide-indigo-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5850EC !important; border-color: rgba(88, 80, 236, var(--divide-opacity)) !important; } .gt-xs\:divide-indigo-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5145CD !important; border-color: rgba(81, 69, 205, var(--divide-opacity)) !important; } .gt-xs\:divide-indigo-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #42389D !important; border-color: rgba(66, 56, 157, var(--divide-opacity)) !important; } .gt-xs\:divide-indigo-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #362F78 !important; border-color: rgba(54, 47, 120, var(--divide-opacity)) !important; } .gt-xs\:divide-indigo > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .gt-xs\:divide-purple-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F6F5FF !important; border-color: rgba(246, 245, 255, var(--divide-opacity)) !important; } .gt-xs\:divide-purple-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDEBFE !important; border-color: rgba(237, 235, 254, var(--divide-opacity)) !important; } .gt-xs\:divide-purple-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DCD7FE !important; border-color: rgba(220, 215, 254, var(--divide-opacity)) !important; } .gt-xs\:divide-purple-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CABFFD !important; border-color: rgba(202, 191, 253, var(--divide-opacity)) !important; } .gt-xs\:divide-purple-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AC94FA !important; border-color: rgba(172, 148, 250, var(--divide-opacity)) !important; } .gt-xs\:divide-purple-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .gt-xs\:divide-purple-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7E3AF2 !important; border-color: rgba(126, 58, 242, var(--divide-opacity)) !important; } .gt-xs\:divide-purple-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6C2BD9 !important; border-color: rgba(108, 43, 217, var(--divide-opacity)) !important; } .gt-xs\:divide-purple-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5521B5 !important; border-color: rgba(85, 33, 181, var(--divide-opacity)) !important; } .gt-xs\:divide-purple-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4A1D96 !important; border-color: rgba(74, 29, 150, var(--divide-opacity)) !important; } .gt-xs\:divide-purple > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .gt-xs\:divide-pink-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F8 !important; border-color: rgba(253, 242, 248, var(--divide-opacity)) !important; } .gt-xs\:divide-pink-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE8F3 !important; border-color: rgba(252, 232, 243, var(--divide-opacity)) !important; } .gt-xs\:divide-pink-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FAD1E8 !important; border-color: rgba(250, 209, 232, var(--divide-opacity)) !important; } .gt-xs\:divide-pink-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4D9 !important; border-color: rgba(248, 180, 217, var(--divide-opacity)) !important; } .gt-xs\:divide-pink-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F17EB8 !important; border-color: rgba(241, 126, 184, var(--divide-opacity)) !important; } .gt-xs\:divide-pink-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .gt-xs\:divide-pink-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D61F69 !important; border-color: rgba(214, 31, 105, var(--divide-opacity)) !important; } .gt-xs\:divide-pink-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BF125D !important; border-color: rgba(191, 18, 93, var(--divide-opacity)) !important; } .gt-xs\:divide-pink-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #99154B !important; border-color: rgba(153, 21, 75, var(--divide-opacity)) !important; } .gt-xs\:divide-pink-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #751A3D !important; border-color: rgba(117, 26, 61, var(--divide-opacity)) !important; } .gt-xs\:divide-pink > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .gt-xs\:divide-opacity-0 > :not(template) ~ :not(template) { --divide-opacity: 0 !important; } .gt-xs\:divide-opacity-12 > :not(template) ~ :not(template) { --divide-opacity: 0.12 !important; } .gt-xs\:divide-opacity-25 > :not(template) ~ :not(template) { --divide-opacity: 0.25 !important; } .gt-xs\:divide-opacity-38 > :not(template) ~ :not(template) { --divide-opacity: 0.38 !important; } .gt-xs\:divide-opacity-50 > :not(template) ~ :not(template) { --divide-opacity: 0.5 !important; } .gt-xs\:divide-opacity-54 > :not(template) ~ :not(template) { --divide-opacity: 0.54 !important; } .gt-xs\:divide-opacity-70 > :not(template) ~ :not(template) { --divide-opacity: 0.70 !important; } .gt-xs\:divide-opacity-75 > :not(template) ~ :not(template) { --divide-opacity: 0.75 !important; } .gt-xs\:divide-opacity-84 > :not(template) ~ :not(template) { --divide-opacity: 0.84 !important; } .gt-xs\:divide-opacity-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; } .gt-xs\:sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .gt-xs\:not-sr-only { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .gt-xs\:focus\:sr-only:focus { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .gt-xs\:focus\:not-sr-only:focus { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .gt-xs\:appearance-none { -webkit-appearance: none !important; -moz-appearance: none !important; appearance: none !important; } .gt-xs\:bg-fixed { background-attachment: fixed !important; } .gt-xs\:bg-local { background-attachment: local !important; } .gt-xs\:bg-scroll { background-attachment: scroll !important; } .gt-xs\:bg-opacity-0 { --bg-opacity: 0 !important; } .gt-xs\:bg-opacity-12 { --bg-opacity: 0.12 !important; } .gt-xs\:bg-opacity-25 { --bg-opacity: 0.25 !important; } .gt-xs\:bg-opacity-38 { --bg-opacity: 0.38 !important; } .gt-xs\:bg-opacity-50 { --bg-opacity: 0.5 !important; } .gt-xs\:bg-opacity-54 { --bg-opacity: 0.54 !important; } .gt-xs\:bg-opacity-70 { --bg-opacity: 0.70 !important; } .gt-xs\:bg-opacity-75 { --bg-opacity: 0.75 !important; } .gt-xs\:bg-opacity-84 { --bg-opacity: 0.84 !important; } .gt-xs\:bg-opacity-100 { --bg-opacity: 1 !important; } .gt-xs\:hover\:bg-opacity-0:hover { --bg-opacity: 0 !important; } .gt-xs\:hover\:bg-opacity-12:hover { --bg-opacity: 0.12 !important; } .gt-xs\:hover\:bg-opacity-25:hover { --bg-opacity: 0.25 !important; } .gt-xs\:hover\:bg-opacity-38:hover { --bg-opacity: 0.38 !important; } .gt-xs\:hover\:bg-opacity-50:hover { --bg-opacity: 0.5 !important; } .gt-xs\:hover\:bg-opacity-54:hover { --bg-opacity: 0.54 !important; } .gt-xs\:hover\:bg-opacity-70:hover { --bg-opacity: 0.70 !important; } .gt-xs\:hover\:bg-opacity-75:hover { --bg-opacity: 0.75 !important; } .gt-xs\:hover\:bg-opacity-84:hover { --bg-opacity: 0.84 !important; } .gt-xs\:hover\:bg-opacity-100:hover { --bg-opacity: 1 !important; } .gt-xs\:focus\:bg-opacity-0:focus { --bg-opacity: 0 !important; } .gt-xs\:focus\:bg-opacity-12:focus { --bg-opacity: 0.12 !important; } .gt-xs\:focus\:bg-opacity-25:focus { --bg-opacity: 0.25 !important; } .gt-xs\:focus\:bg-opacity-38:focus { --bg-opacity: 0.38 !important; } .gt-xs\:focus\:bg-opacity-50:focus { --bg-opacity: 0.5 !important; } .gt-xs\:focus\:bg-opacity-54:focus { --bg-opacity: 0.54 !important; } .gt-xs\:focus\:bg-opacity-70:focus { --bg-opacity: 0.70 !important; } .gt-xs\:focus\:bg-opacity-75:focus { --bg-opacity: 0.75 !important; } .gt-xs\:focus\:bg-opacity-84:focus { --bg-opacity: 0.84 !important; } .gt-xs\:focus\:bg-opacity-100:focus { --bg-opacity: 1 !important; } .gt-xs\:bg-bottom { background-position: bottom !important; } .gt-xs\:bg-center { background-position: center !important; } .gt-xs\:bg-left { background-position: left !important; } .gt-xs\:bg-left-bottom { background-position: left bottom !important; } .gt-xs\:bg-left-top { background-position: left top !important; } .gt-xs\:bg-right { background-position: right !important; } .gt-xs\:bg-right-bottom { background-position: right bottom !important; } .gt-xs\:bg-right-top { background-position: right top !important; } .gt-xs\:bg-top { background-position: top !important; } .gt-xs\:bg-repeat { background-repeat: repeat !important; } .gt-xs\:bg-no-repeat { background-repeat: no-repeat !important; } .gt-xs\:bg-repeat-x { background-repeat: repeat-x !important; } .gt-xs\:bg-repeat-y { background-repeat: repeat-y !important; } .gt-xs\:bg-repeat-round { background-repeat: round !important; } .gt-xs\:bg-repeat-space { background-repeat: space !important; } .gt-xs\:bg-auto { background-size: auto !important; } .gt-xs\:bg-cover { background-size: cover !important; } .gt-xs\:bg-contain { background-size: contain !important; } .gt-xs\:border-collapse { border-collapse: collapse !important; } .gt-xs\:border-separate { border-collapse: separate !important; } .gt-xs\:border-opacity-0 { --border-opacity: 0 !important; } .gt-xs\:border-opacity-12 { --border-opacity: 0.12 !important; } .gt-xs\:border-opacity-25 { --border-opacity: 0.25 !important; } .gt-xs\:border-opacity-38 { --border-opacity: 0.38 !important; } .gt-xs\:border-opacity-50 { --border-opacity: 0.5 !important; } .gt-xs\:border-opacity-54 { --border-opacity: 0.54 !important; } .gt-xs\:border-opacity-70 { --border-opacity: 0.70 !important; } .gt-xs\:border-opacity-75 { --border-opacity: 0.75 !important; } .gt-xs\:border-opacity-84 { --border-opacity: 0.84 !important; } .gt-xs\:border-opacity-100 { --border-opacity: 1 !important; } .gt-xs\:hover\:border-opacity-0:hover { --border-opacity: 0 !important; } .gt-xs\:hover\:border-opacity-12:hover { --border-opacity: 0.12 !important; } .gt-xs\:hover\:border-opacity-25:hover { --border-opacity: 0.25 !important; } .gt-xs\:hover\:border-opacity-38:hover { --border-opacity: 0.38 !important; } .gt-xs\:hover\:border-opacity-50:hover { --border-opacity: 0.5 !important; } .gt-xs\:hover\:border-opacity-54:hover { --border-opacity: 0.54 !important; } .gt-xs\:hover\:border-opacity-70:hover { --border-opacity: 0.70 !important; } .gt-xs\:hover\:border-opacity-75:hover { --border-opacity: 0.75 !important; } .gt-xs\:hover\:border-opacity-84:hover { --border-opacity: 0.84 !important; } .gt-xs\:hover\:border-opacity-100:hover { --border-opacity: 1 !important; } .gt-xs\:focus\:border-opacity-0:focus { --border-opacity: 0 !important; } .gt-xs\:focus\:border-opacity-12:focus { --border-opacity: 0.12 !important; } .gt-xs\:focus\:border-opacity-25:focus { --border-opacity: 0.25 !important; } .gt-xs\:focus\:border-opacity-38:focus { --border-opacity: 0.38 !important; } .gt-xs\:focus\:border-opacity-50:focus { --border-opacity: 0.5 !important; } .gt-xs\:focus\:border-opacity-54:focus { --border-opacity: 0.54 !important; } .gt-xs\:focus\:border-opacity-70:focus { --border-opacity: 0.70 !important; } .gt-xs\:focus\:border-opacity-75:focus { --border-opacity: 0.75 !important; } .gt-xs\:focus\:border-opacity-84:focus { --border-opacity: 0.84 !important; } .gt-xs\:focus\:border-opacity-100:focus { --border-opacity: 1 !important; } .gt-xs\:rounded-none { border-radius: 0 !important; } .gt-xs\:rounded-sm { border-radius: 0.125rem !important; } .gt-xs\:rounded { border-radius: 0.25rem !important; } .gt-xs\:rounded-md { border-radius: 0.375rem !important; } .gt-xs\:rounded-lg { border-radius: 0.5rem !important; } .gt-xs\:rounded-full { border-radius: 9999px !important; } .gt-xs\:rounded-t-none { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } .gt-xs\:rounded-r-none { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } .gt-xs\:rounded-b-none { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } .gt-xs\:rounded-l-none { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; } .gt-xs\:rounded-t-sm { border-top-left-radius: 0.125rem !important; border-top-right-radius: 0.125rem !important; } .gt-xs\:rounded-r-sm { border-top-right-radius: 0.125rem !important; border-bottom-right-radius: 0.125rem !important; } .gt-xs\:rounded-b-sm { border-bottom-right-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .gt-xs\:rounded-l-sm { border-top-left-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .gt-xs\:rounded-t { border-top-left-radius: 0.25rem !important; border-top-right-radius: 0.25rem !important; } .gt-xs\:rounded-r { border-top-right-radius: 0.25rem !important; border-bottom-right-radius: 0.25rem !important; } .gt-xs\:rounded-b { border-bottom-right-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .gt-xs\:rounded-l { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .gt-xs\:rounded-t-md { border-top-left-radius: 0.375rem !important; border-top-right-radius: 0.375rem !important; } .gt-xs\:rounded-r-md { border-top-right-radius: 0.375rem !important; border-bottom-right-radius: 0.375rem !important; } .gt-xs\:rounded-b-md { border-bottom-right-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .gt-xs\:rounded-l-md { border-top-left-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .gt-xs\:rounded-t-lg { border-top-left-radius: 0.5rem !important; border-top-right-radius: 0.5rem !important; } .gt-xs\:rounded-r-lg { border-top-right-radius: 0.5rem !important; border-bottom-right-radius: 0.5rem !important; } .gt-xs\:rounded-b-lg { border-bottom-right-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .gt-xs\:rounded-l-lg { border-top-left-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .gt-xs\:rounded-t-full { border-top-left-radius: 9999px !important; border-top-right-radius: 9999px !important; } .gt-xs\:rounded-r-full { border-top-right-radius: 9999px !important; border-bottom-right-radius: 9999px !important; } .gt-xs\:rounded-b-full { border-bottom-right-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .gt-xs\:rounded-l-full { border-top-left-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .gt-xs\:rounded-tl-none { border-top-left-radius: 0 !important; } .gt-xs\:rounded-tr-none { border-top-right-radius: 0 !important; } .gt-xs\:rounded-br-none { border-bottom-right-radius: 0 !important; } .gt-xs\:rounded-bl-none { border-bottom-left-radius: 0 !important; } .gt-xs\:rounded-tl-sm { border-top-left-radius: 0.125rem !important; } .gt-xs\:rounded-tr-sm { border-top-right-radius: 0.125rem !important; } .gt-xs\:rounded-br-sm { border-bottom-right-radius: 0.125rem !important; } .gt-xs\:rounded-bl-sm { border-bottom-left-radius: 0.125rem !important; } .gt-xs\:rounded-tl { border-top-left-radius: 0.25rem !important; } .gt-xs\:rounded-tr { border-top-right-radius: 0.25rem !important; } .gt-xs\:rounded-br { border-bottom-right-radius: 0.25rem !important; } .gt-xs\:rounded-bl { border-bottom-left-radius: 0.25rem !important; } .gt-xs\:rounded-tl-md { border-top-left-radius: 0.375rem !important; } .gt-xs\:rounded-tr-md { border-top-right-radius: 0.375rem !important; } .gt-xs\:rounded-br-md { border-bottom-right-radius: 0.375rem !important; } .gt-xs\:rounded-bl-md { border-bottom-left-radius: 0.375rem !important; } .gt-xs\:rounded-tl-lg { border-top-left-radius: 0.5rem !important; } .gt-xs\:rounded-tr-lg { border-top-right-radius: 0.5rem !important; } .gt-xs\:rounded-br-lg { border-bottom-right-radius: 0.5rem !important; } .gt-xs\:rounded-bl-lg { border-bottom-left-radius: 0.5rem !important; } .gt-xs\:rounded-tl-full { border-top-left-radius: 9999px !important; } .gt-xs\:rounded-tr-full { border-top-right-radius: 9999px !important; } .gt-xs\:rounded-br-full { border-bottom-right-radius: 9999px !important; } .gt-xs\:rounded-bl-full { border-bottom-left-radius: 9999px !important; } .gt-xs\:border-solid { border-style: solid !important; } .gt-xs\:border-dashed { border-style: dashed !important; } .gt-xs\:border-dotted { border-style: dotted !important; } .gt-xs\:border-double { border-style: double !important; } .gt-xs\:border-none { border-style: none !important; } .gt-xs\:border-0 { border-width: 0 !important; } .gt-xs\:border-2 { border-width: 2px !important; } .gt-xs\:border-4 { border-width: 4px !important; } .gt-xs\:border-8 { border-width: 8px !important; } .gt-xs\:border { border-width: 1px !important; } .gt-xs\:border-t-0 { border-top-width: 0 !important; } .gt-xs\:border-r-0 { border-right-width: 0 !important; } .gt-xs\:border-b-0 { border-bottom-width: 0 !important; } .gt-xs\:border-l-0 { border-left-width: 0 !important; } .gt-xs\:border-t-2 { border-top-width: 2px !important; } .gt-xs\:border-r-2 { border-right-width: 2px !important; } .gt-xs\:border-b-2 { border-bottom-width: 2px !important; } .gt-xs\:border-l-2 { border-left-width: 2px !important; } .gt-xs\:border-t-4 { border-top-width: 4px !important; } .gt-xs\:border-r-4 { border-right-width: 4px !important; } .gt-xs\:border-b-4 { border-bottom-width: 4px !important; } .gt-xs\:border-l-4 { border-left-width: 4px !important; } .gt-xs\:border-t-8 { border-top-width: 8px !important; } .gt-xs\:border-r-8 { border-right-width: 8px !important; } .gt-xs\:border-b-8 { border-bottom-width: 8px !important; } .gt-xs\:border-l-8 { border-left-width: 8px !important; } .gt-xs\:border-t { border-top-width: 1px !important; } .gt-xs\:border-r { border-right-width: 1px !important; } .gt-xs\:border-b { border-bottom-width: 1px !important; } .gt-xs\:border-l { border-left-width: 1px !important; } .gt-xs\:first\:border-0:first-child { border-width: 0 !important; } .gt-xs\:first\:border-2:first-child { border-width: 2px !important; } .gt-xs\:first\:border-4:first-child { border-width: 4px !important; } .gt-xs\:first\:border-8:first-child { border-width: 8px !important; } .gt-xs\:first\:border:first-child { border-width: 1px !important; } .gt-xs\:first\:border-t-0:first-child { border-top-width: 0 !important; } .gt-xs\:first\:border-r-0:first-child { border-right-width: 0 !important; } .gt-xs\:first\:border-b-0:first-child { border-bottom-width: 0 !important; } .gt-xs\:first\:border-l-0:first-child { border-left-width: 0 !important; } .gt-xs\:first\:border-t-2:first-child { border-top-width: 2px !important; } .gt-xs\:first\:border-r-2:first-child { border-right-width: 2px !important; } .gt-xs\:first\:border-b-2:first-child { border-bottom-width: 2px !important; } .gt-xs\:first\:border-l-2:first-child { border-left-width: 2px !important; } .gt-xs\:first\:border-t-4:first-child { border-top-width: 4px !important; } .gt-xs\:first\:border-r-4:first-child { border-right-width: 4px !important; } .gt-xs\:first\:border-b-4:first-child { border-bottom-width: 4px !important; } .gt-xs\:first\:border-l-4:first-child { border-left-width: 4px !important; } .gt-xs\:first\:border-t-8:first-child { border-top-width: 8px !important; } .gt-xs\:first\:border-r-8:first-child { border-right-width: 8px !important; } .gt-xs\:first\:border-b-8:first-child { border-bottom-width: 8px !important; } .gt-xs\:first\:border-l-8:first-child { border-left-width: 8px !important; } .gt-xs\:first\:border-t:first-child { border-top-width: 1px !important; } .gt-xs\:first\:border-r:first-child { border-right-width: 1px !important; } .gt-xs\:first\:border-b:first-child { border-bottom-width: 1px !important; } .gt-xs\:first\:border-l:first-child { border-left-width: 1px !important; } .gt-xs\:last\:border-0:last-child { border-width: 0 !important; } .gt-xs\:last\:border-2:last-child { border-width: 2px !important; } .gt-xs\:last\:border-4:last-child { border-width: 4px !important; } .gt-xs\:last\:border-8:last-child { border-width: 8px !important; } .gt-xs\:last\:border:last-child { border-width: 1px !important; } .gt-xs\:last\:border-t-0:last-child { border-top-width: 0 !important; } .gt-xs\:last\:border-r-0:last-child { border-right-width: 0 !important; } .gt-xs\:last\:border-b-0:last-child { border-bottom-width: 0 !important; } .gt-xs\:last\:border-l-0:last-child { border-left-width: 0 !important; } .gt-xs\:last\:border-t-2:last-child { border-top-width: 2px !important; } .gt-xs\:last\:border-r-2:last-child { border-right-width: 2px !important; } .gt-xs\:last\:border-b-2:last-child { border-bottom-width: 2px !important; } .gt-xs\:last\:border-l-2:last-child { border-left-width: 2px !important; } .gt-xs\:last\:border-t-4:last-child { border-top-width: 4px !important; } .gt-xs\:last\:border-r-4:last-child { border-right-width: 4px !important; } .gt-xs\:last\:border-b-4:last-child { border-bottom-width: 4px !important; } .gt-xs\:last\:border-l-4:last-child { border-left-width: 4px !important; } .gt-xs\:last\:border-t-8:last-child { border-top-width: 8px !important; } .gt-xs\:last\:border-r-8:last-child { border-right-width: 8px !important; } .gt-xs\:last\:border-b-8:last-child { border-bottom-width: 8px !important; } .gt-xs\:last\:border-l-8:last-child { border-left-width: 8px !important; } .gt-xs\:last\:border-t:last-child { border-top-width: 1px !important; } .gt-xs\:last\:border-r:last-child { border-right-width: 1px !important; } .gt-xs\:last\:border-b:last-child { border-bottom-width: 1px !important; } .gt-xs\:last\:border-l:last-child { border-left-width: 1px !important; } .gt-xs\:box-border { box-sizing: border-box !important; } .gt-xs\:box-content { box-sizing: content-box !important; } .gt-xs\:block { display: block !important; } .gt-xs\:inline-block { display: inline-block !important; } .gt-xs\:inline { display: inline !important; } .gt-xs\:flex { display: flex !important; } .gt-xs\:inline-flex { display: inline-flex !important; } .gt-xs\:table { display: table !important; } .gt-xs\:table-caption { display: table-caption !important; } .gt-xs\:table-cell { display: table-cell !important; } .gt-xs\:table-column { display: table-column !important; } .gt-xs\:table-column-group { display: table-column-group !important; } .gt-xs\:table-footer-group { display: table-footer-group !important; } .gt-xs\:table-header-group { display: table-header-group !important; } .gt-xs\:table-row-group { display: table-row-group !important; } .gt-xs\:table-row { display: table-row !important; } .gt-xs\:flow-root { display: flow-root !important; } .gt-xs\:grid { display: grid !important; } .gt-xs\:inline-grid { display: inline-grid !important; } .gt-xs\:hidden { display: none !important; } .gt-xs\:flex-row { flex-direction: row !important; } .gt-xs\:flex-row-reverse { flex-direction: row-reverse !important; } .gt-xs\:flex-col { flex-direction: column !important; } .gt-xs\:flex-col-reverse { flex-direction: column-reverse !important; } .gt-xs\:flex-wrap { flex-wrap: wrap !important; } .gt-xs\:flex-wrap-reverse { flex-wrap: wrap-reverse !important; } .gt-xs\:flex-no-wrap { flex-wrap: nowrap !important; } .gt-xs\:items-start { align-items: flex-start !important; } .gt-xs\:items-end { align-items: flex-end !important; } .gt-xs\:items-center { align-items: center !important; } .gt-xs\:items-baseline { align-items: baseline !important; } .gt-xs\:items-stretch { align-items: stretch !important; } .gt-xs\:self-auto { align-self: auto !important; } .gt-xs\:self-start { align-self: flex-start !important; } .gt-xs\:self-end { align-self: flex-end !important; } .gt-xs\:self-center { align-self: center !important; } .gt-xs\:self-stretch { align-self: stretch !important; } .gt-xs\:justify-start { justify-content: flex-start !important; } .gt-xs\:justify-end { justify-content: flex-end !important; } .gt-xs\:justify-center { justify-content: center !important; } .gt-xs\:justify-between { justify-content: space-between !important; } .gt-xs\:justify-around { justify-content: space-around !important; } .gt-xs\:justify-evenly { justify-content: space-evenly !important; } .gt-xs\:content-center { align-content: center !important; } .gt-xs\:content-start { align-content: flex-start !important; } .gt-xs\:content-end { align-content: flex-end !important; } .gt-xs\:content-between { align-content: space-between !important; } .gt-xs\:content-around { align-content: space-around !important; } .gt-xs\:flex-0 { flex: 0 0 auto !important; } .gt-xs\:flex-1 { flex: 1 1 0% !important; } .gt-xs\:flex-auto { flex: 1 1 auto !important; } .gt-xs\:flex-initial { flex: 0 1 auto !important; } .gt-xs\:flex-none { flex: none !important; } .gt-xs\:flex-grow-0 { flex-grow: 0 !important; } .gt-xs\:flex-grow { flex-grow: 1 !important; } .gt-xs\:flex-shrink-0 { flex-shrink: 0 !important; } .gt-xs\:flex-shrink { flex-shrink: 1 !important; } .gt-xs\:order-1 { order: 1 !important; } .gt-xs\:order-2 { order: 2 !important; } .gt-xs\:order-3 { order: 3 !important; } .gt-xs\:order-4 { order: 4 !important; } .gt-xs\:order-5 { order: 5 !important; } .gt-xs\:order-6 { order: 6 !important; } .gt-xs\:order-7 { order: 7 !important; } .gt-xs\:order-8 { order: 8 !important; } .gt-xs\:order-9 { order: 9 !important; } .gt-xs\:order-10 { order: 10 !important; } .gt-xs\:order-11 { order: 11 !important; } .gt-xs\:order-12 { order: 12 !important; } .gt-xs\:order-first { order: -9999 !important; } .gt-xs\:order-last { order: 9999 !important; } .gt-xs\:order-none { order: 0 !important; } .gt-xs\:font-hairline { font-weight: 100 !important; } .gt-xs\:font-thin { font-weight: 200 !important; } .gt-xs\:font-light { font-weight: 300 !important; } .gt-xs\:font-normal { font-weight: 400 !important; } .gt-xs\:font-medium { font-weight: 500 !important; } .gt-xs\:font-semibold { font-weight: 600 !important; } .gt-xs\:font-bold { font-weight: 700 !important; } .gt-xs\:font-extrabold { font-weight: 800 !important; } .gt-xs\:font-black { font-weight: 900 !important; } .gt-xs\:h-0 { height: 0 !important; } .gt-xs\:h-1 { height: 0.25rem !important; } .gt-xs\:h-2 { height: 0.5rem !important; } .gt-xs\:h-3 { height: 0.75rem !important; } .gt-xs\:h-4 { height: 1rem !important; } .gt-xs\:h-5 { height: 1.25rem !important; } .gt-xs\:h-6 { height: 1.5rem !important; } .gt-xs\:h-8 { height: 2rem !important; } .gt-xs\:h-10 { height: 2.5rem !important; } .gt-xs\:h-12 { height: 3rem !important; } .gt-xs\:h-14 { height: 3.5rem !important; } .gt-xs\:h-16 { height: 4rem !important; } .gt-xs\:h-18 { height: 4.5rem !important; } .gt-xs\:h-20 { height: 5rem !important; } .gt-xs\:h-22 { height: 5.5rem !important; } .gt-xs\:h-24 { height: 6rem !important; } .gt-xs\:h-26 { height: 6.5rem !important; } .gt-xs\:h-28 { height: 7rem !important; } .gt-xs\:h-30 { height: 7.5rem !important; } .gt-xs\:h-32 { height: 8rem !important; } .gt-xs\:h-36 { height: 9rem !important; } .gt-xs\:h-40 { height: 10rem !important; } .gt-xs\:h-48 { height: 12rem !important; } .gt-xs\:h-50 { height: 12.5rem !important; } .gt-xs\:h-56 { height: 14rem !important; } .gt-xs\:h-60 { height: 15rem !important; } .gt-xs\:h-64 { height: 16rem !important; } .gt-xs\:h-80 { height: 20rem !important; } .gt-xs\:h-90 { height: 24rem !important; } .gt-xs\:h-100 { height: 25rem !important; } .gt-xs\:h-120 { height: 30rem !important; } .gt-xs\:h-128 { height: 32rem !important; } .gt-xs\:h-140 { height: 35rem !important; } .gt-xs\:h-160 { height: 40rem !important; } .gt-xs\:h-180 { height: 45rem !important; } .gt-xs\:h-192 { height: 48rem !important; } .gt-xs\:h-200 { height: 50rem !important; } .gt-xs\:h-240 { height: 60rem !important; } .gt-xs\:h-256 { height: 64rem !important; } .gt-xs\:h-280 { height: 70rem !important; } .gt-xs\:h-320 { height: 80rem !important; } .gt-xs\:h-360 { height: 90rem !important; } .gt-xs\:h-400 { height: 100rem !important; } .gt-xs\:h-480 { height: 120rem !important; } .gt-xs\:h-auto { height: auto !important; } .gt-xs\:h-px { height: 1px !important; } .gt-xs\:h-2px { height: 2px !important; } .gt-xs\:h-full { height: 100% !important; } .gt-xs\:h-screen { height: 100vh !important; } .gt-xs\:h-1\/2 { height: 50% !important; } .gt-xs\:h-1\/3 { height: 33.33333% !important; } .gt-xs\:h-2\/3 { height: 66.66667% !important; } .gt-xs\:h-1\/4 { height: 25% !important; } .gt-xs\:h-2\/4 { height: 50% !important; } .gt-xs\:h-3\/4 { height: 75% !important; } .gt-xs\:h-1\/5 { height: 20% !important; } .gt-xs\:h-2\/5 { height: 40% !important; } .gt-xs\:h-3\/5 { height: 60% !important; } .gt-xs\:h-4\/5 { height: 80% !important; } .gt-xs\:h-1\/12 { height: 8.33333% !important; } .gt-xs\:h-2\/12 { height: 16.66667% !important; } .gt-xs\:h-3\/12 { height: 25% !important; } .gt-xs\:h-4\/12 { height: 33.33333% !important; } .gt-xs\:h-5\/12 { height: 41.66667% !important; } .gt-xs\:h-6\/12 { height: 50% !important; } .gt-xs\:h-7\/12 { height: 58.33333% !important; } .gt-xs\:h-8\/12 { height: 66.66667% !important; } .gt-xs\:h-9\/12 { height: 75% !important; } .gt-xs\:h-10\/12 { height: 83.33333% !important; } .gt-xs\:h-11\/12 { height: 91.66667% !important; } .gt-xs\:text-xs { font-size: 0.625rem !important; } .gt-xs\:text-sm { font-size: 0.75rem !important; } .gt-xs\:text-md { font-size: 0.8125rem !important; } .gt-xs\:text-base { font-size: 0.875rem !important; } .gt-xs\:text-lg { font-size: 1rem !important; } .gt-xs\:text-xl { font-size: 1.125rem !important; } .gt-xs\:text-2xl { font-size: 1.25rem !important; } .gt-xs\:text-3xl { font-size: 1.5rem !important; } .gt-xs\:text-4xl { font-size: 2rem !important; } .gt-xs\:text-5xl { font-size: 2.25rem !important; } .gt-xs\:text-6xl { font-size: 2.5rem !important; } .gt-xs\:text-7xl { font-size: 3rem !important; } .gt-xs\:text-8xl { font-size: 4rem !important; } .gt-xs\:text-9xl { font-size: 6rem !important; } .gt-xs\:text-10xl { font-size: 8rem !important; } .gt-xs\:leading-3 { line-height: .75rem !important; } .gt-xs\:leading-4 { line-height: 1rem !important; } .gt-xs\:leading-5 { line-height: 1.25rem !important; } .gt-xs\:leading-6 { line-height: 1.5rem !important; } .gt-xs\:leading-7 { line-height: 1.75rem !important; } .gt-xs\:leading-8 { line-height: 2rem !important; } .gt-xs\:leading-9 { line-height: 2.25rem !important; } .gt-xs\:leading-10 { line-height: 2.5rem !important; } .gt-xs\:leading-none { line-height: 1 !important; } .gt-xs\:leading-tight { line-height: 1.25 !important; } .gt-xs\:leading-snug { line-height: 1.375 !important; } .gt-xs\:leading-normal { line-height: 1.5 !important; } .gt-xs\:leading-relaxed { line-height: 1.625 !important; } .gt-xs\:leading-loose { line-height: 2 !important; } .gt-xs\:list-inside { list-style-position: inside !important; } .gt-xs\:list-outside { list-style-position: outside !important; } .gt-xs\:list-none { list-style-type: none !important; } .gt-xs\:list-disc { list-style-type: disc !important; } .gt-xs\:list-decimal { list-style-type: decimal !important; } .gt-xs\:m-0 { margin: 0 !important; } .gt-xs\:m-1 { margin: 0.25rem !important; } .gt-xs\:m-2 { margin: 0.5rem !important; } .gt-xs\:m-3 { margin: 0.75rem !important; } .gt-xs\:m-4 { margin: 1rem !important; } .gt-xs\:m-5 { margin: 1.25rem !important; } .gt-xs\:m-6 { margin: 1.5rem !important; } .gt-xs\:m-8 { margin: 2rem !important; } .gt-xs\:m-10 { margin: 2.5rem !important; } .gt-xs\:m-12 { margin: 3rem !important; } .gt-xs\:m-14 { margin: 3.5rem !important; } .gt-xs\:m-16 { margin: 4rem !important; } .gt-xs\:m-18 { margin: 4.5rem !important; } .gt-xs\:m-20 { margin: 5rem !important; } .gt-xs\:m-22 { margin: 5.5rem !important; } .gt-xs\:m-24 { margin: 6rem !important; } .gt-xs\:m-26 { margin: 6.5rem !important; } .gt-xs\:m-28 { margin: 7rem !important; } .gt-xs\:m-30 { margin: 7.5rem !important; } .gt-xs\:m-32 { margin: 8rem !important; } .gt-xs\:m-36 { margin: 9rem !important; } .gt-xs\:m-40 { margin: 10rem !important; } .gt-xs\:m-48 { margin: 12rem !important; } .gt-xs\:m-56 { margin: 14rem !important; } .gt-xs\:m-64 { margin: 16rem !important; } .gt-xs\:m-auto { margin: auto !important; } .gt-xs\:m-px { margin: 1px !important; } .gt-xs\:m-2px { margin: 2px !important; } .gt-xs\:-m-1 { margin: -0.25rem !important; } .gt-xs\:-m-2 { margin: -0.5rem !important; } .gt-xs\:-m-3 { margin: -0.75rem !important; } .gt-xs\:-m-4 { margin: -1rem !important; } .gt-xs\:-m-5 { margin: -1.25rem !important; } .gt-xs\:-m-6 { margin: -1.5rem !important; } .gt-xs\:-m-8 { margin: -2rem !important; } .gt-xs\:-m-10 { margin: -2.5rem !important; } .gt-xs\:-m-12 { margin: -3rem !important; } .gt-xs\:-m-14 { margin: -3.5rem !important; } .gt-xs\:-m-16 { margin: -4rem !important; } .gt-xs\:-m-18 { margin: -4.5rem !important; } .gt-xs\:-m-20 { margin: -5rem !important; } .gt-xs\:-m-22 { margin: -5.5rem !important; } .gt-xs\:-m-24 { margin: -6rem !important; } .gt-xs\:-m-26 { margin: -6.5rem !important; } .gt-xs\:-m-28 { margin: -7rem !important; } .gt-xs\:-m-30 { margin: -7.5rem !important; } .gt-xs\:-m-32 { margin: -8rem !important; } .gt-xs\:-m-36 { margin: -9rem !important; } .gt-xs\:-m-40 { margin: -10rem !important; } .gt-xs\:-m-48 { margin: -12rem !important; } .gt-xs\:-m-56 { margin: -14rem !important; } .gt-xs\:-m-64 { margin: -16rem !important; } .gt-xs\:-m-px { margin: -1px !important; } .gt-xs\:-m-2px { margin: -2px !important; } .gt-xs\:my-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .gt-xs\:mx-0 { margin-left: 0 !important; margin-right: 0 !important; } .gt-xs\:my-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .gt-xs\:mx-1 { margin-left: 0.25rem !important; margin-right: 0.25rem !important; } .gt-xs\:my-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .gt-xs\:mx-2 { margin-left: 0.5rem !important; margin-right: 0.5rem !important; } .gt-xs\:my-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .gt-xs\:mx-3 { margin-left: 0.75rem !important; margin-right: 0.75rem !important; } .gt-xs\:my-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .gt-xs\:mx-4 { margin-left: 1rem !important; margin-right: 1rem !important; } .gt-xs\:my-5 { margin-top: 1.25rem !important; margin-bottom: 1.25rem !important; } .gt-xs\:mx-5 { margin-left: 1.25rem !important; margin-right: 1.25rem !important; } .gt-xs\:my-6 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .gt-xs\:mx-6 { margin-left: 1.5rem !important; margin-right: 1.5rem !important; } .gt-xs\:my-8 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .gt-xs\:mx-8 { margin-left: 2rem !important; margin-right: 2rem !important; } .gt-xs\:my-10 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .gt-xs\:mx-10 { margin-left: 2.5rem !important; margin-right: 2.5rem !important; } .gt-xs\:my-12 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .gt-xs\:mx-12 { margin-left: 3rem !important; margin-right: 3rem !important; } .gt-xs\:my-14 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .gt-xs\:mx-14 { margin-left: 3.5rem !important; margin-right: 3.5rem !important; } .gt-xs\:my-16 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .gt-xs\:mx-16 { margin-left: 4rem !important; margin-right: 4rem !important; } .gt-xs\:my-18 { margin-top: 4.5rem !important; margin-bottom: 4.5rem !important; } .gt-xs\:mx-18 { margin-left: 4.5rem !important; margin-right: 4.5rem !important; } .gt-xs\:my-20 { margin-top: 5rem !important; margin-bottom: 5rem !important; } .gt-xs\:mx-20 { margin-left: 5rem !important; margin-right: 5rem !important; } .gt-xs\:my-22 { margin-top: 5.5rem !important; margin-bottom: 5.5rem !important; } .gt-xs\:mx-22 { margin-left: 5.5rem !important; margin-right: 5.5rem !important; } .gt-xs\:my-24 { margin-top: 6rem !important; margin-bottom: 6rem !important; } .gt-xs\:mx-24 { margin-left: 6rem !important; margin-right: 6rem !important; } .gt-xs\:my-26 { margin-top: 6.5rem !important; margin-bottom: 6.5rem !important; } .gt-xs\:mx-26 { margin-left: 6.5rem !important; margin-right: 6.5rem !important; } .gt-xs\:my-28 { margin-top: 7rem !important; margin-bottom: 7rem !important; } .gt-xs\:mx-28 { margin-left: 7rem !important; margin-right: 7rem !important; } .gt-xs\:my-30 { margin-top: 7.5rem !important; margin-bottom: 7.5rem !important; } .gt-xs\:mx-30 { margin-left: 7.5rem !important; margin-right: 7.5rem !important; } .gt-xs\:my-32 { margin-top: 8rem !important; margin-bottom: 8rem !important; } .gt-xs\:mx-32 { margin-left: 8rem !important; margin-right: 8rem !important; } .gt-xs\:my-36 { margin-top: 9rem !important; margin-bottom: 9rem !important; } .gt-xs\:mx-36 { margin-left: 9rem !important; margin-right: 9rem !important; } .gt-xs\:my-40 { margin-top: 10rem !important; margin-bottom: 10rem !important; } .gt-xs\:mx-40 { margin-left: 10rem !important; margin-right: 10rem !important; } .gt-xs\:my-48 { margin-top: 12rem !important; margin-bottom: 12rem !important; } .gt-xs\:mx-48 { margin-left: 12rem !important; margin-right: 12rem !important; } .gt-xs\:my-56 { margin-top: 14rem !important; margin-bottom: 14rem !important; } .gt-xs\:mx-56 { margin-left: 14rem !important; margin-right: 14rem !important; } .gt-xs\:my-64 { margin-top: 16rem !important; margin-bottom: 16rem !important; } .gt-xs\:mx-64 { margin-left: 16rem !important; margin-right: 16rem !important; } .gt-xs\:my-auto { margin-top: auto !important; margin-bottom: auto !important; } .gt-xs\:mx-auto { margin-left: auto !important; margin-right: auto !important; } .gt-xs\:my-px { margin-top: 1px !important; margin-bottom: 1px !important; } .gt-xs\:mx-px { margin-left: 1px !important; margin-right: 1px !important; } .gt-xs\:my-2px { margin-top: 2px !important; margin-bottom: 2px !important; } .gt-xs\:mx-2px { margin-left: 2px !important; margin-right: 2px !important; } .gt-xs\:-my-1 { margin-top: -0.25rem !important; margin-bottom: -0.25rem !important; } .gt-xs\:-mx-1 { margin-left: -0.25rem !important; margin-right: -0.25rem !important; } .gt-xs\:-my-2 { margin-top: -0.5rem !important; margin-bottom: -0.5rem !important; } .gt-xs\:-mx-2 { margin-left: -0.5rem !important; margin-right: -0.5rem !important; } .gt-xs\:-my-3 { margin-top: -0.75rem !important; margin-bottom: -0.75rem !important; } .gt-xs\:-mx-3 { margin-left: -0.75rem !important; margin-right: -0.75rem !important; } .gt-xs\:-my-4 { margin-top: -1rem !important; margin-bottom: -1rem !important; } .gt-xs\:-mx-4 { margin-left: -1rem !important; margin-right: -1rem !important; } .gt-xs\:-my-5 { margin-top: -1.25rem !important; margin-bottom: -1.25rem !important; } .gt-xs\:-mx-5 { margin-left: -1.25rem !important; margin-right: -1.25rem !important; } .gt-xs\:-my-6 { margin-top: -1.5rem !important; margin-bottom: -1.5rem !important; } .gt-xs\:-mx-6 { margin-left: -1.5rem !important; margin-right: -1.5rem !important; } .gt-xs\:-my-8 { margin-top: -2rem !important; margin-bottom: -2rem !important; } .gt-xs\:-mx-8 { margin-left: -2rem !important; margin-right: -2rem !important; } .gt-xs\:-my-10 { margin-top: -2.5rem !important; margin-bottom: -2.5rem !important; } .gt-xs\:-mx-10 { margin-left: -2.5rem !important; margin-right: -2.5rem !important; } .gt-xs\:-my-12 { margin-top: -3rem !important; margin-bottom: -3rem !important; } .gt-xs\:-mx-12 { margin-left: -3rem !important; margin-right: -3rem !important; } .gt-xs\:-my-14 { margin-top: -3.5rem !important; margin-bottom: -3.5rem !important; } .gt-xs\:-mx-14 { margin-left: -3.5rem !important; margin-right: -3.5rem !important; } .gt-xs\:-my-16 { margin-top: -4rem !important; margin-bottom: -4rem !important; } .gt-xs\:-mx-16 { margin-left: -4rem !important; margin-right: -4rem !important; } .gt-xs\:-my-18 { margin-top: -4.5rem !important; margin-bottom: -4.5rem !important; } .gt-xs\:-mx-18 { margin-left: -4.5rem !important; margin-right: -4.5rem !important; } .gt-xs\:-my-20 { margin-top: -5rem !important; margin-bottom: -5rem !important; } .gt-xs\:-mx-20 { margin-left: -5rem !important; margin-right: -5rem !important; } .gt-xs\:-my-22 { margin-top: -5.5rem !important; margin-bottom: -5.5rem !important; } .gt-xs\:-mx-22 { margin-left: -5.5rem !important; margin-right: -5.5rem !important; } .gt-xs\:-my-24 { margin-top: -6rem !important; margin-bottom: -6rem !important; } .gt-xs\:-mx-24 { margin-left: -6rem !important; margin-right: -6rem !important; } .gt-xs\:-my-26 { margin-top: -6.5rem !important; margin-bottom: -6.5rem !important; } .gt-xs\:-mx-26 { margin-left: -6.5rem !important; margin-right: -6.5rem !important; } .gt-xs\:-my-28 { margin-top: -7rem !important; margin-bottom: -7rem !important; } .gt-xs\:-mx-28 { margin-left: -7rem !important; margin-right: -7rem !important; } .gt-xs\:-my-30 { margin-top: -7.5rem !important; margin-bottom: -7.5rem !important; } .gt-xs\:-mx-30 { margin-left: -7.5rem !important; margin-right: -7.5rem !important; } .gt-xs\:-my-32 { margin-top: -8rem !important; margin-bottom: -8rem !important; } .gt-xs\:-mx-32 { margin-left: -8rem !important; margin-right: -8rem !important; } .gt-xs\:-my-36 { margin-top: -9rem !important; margin-bottom: -9rem !important; } .gt-xs\:-mx-36 { margin-left: -9rem !important; margin-right: -9rem !important; } .gt-xs\:-my-40 { margin-top: -10rem !important; margin-bottom: -10rem !important; } .gt-xs\:-mx-40 { margin-left: -10rem !important; margin-right: -10rem !important; } .gt-xs\:-my-48 { margin-top: -12rem !important; margin-bottom: -12rem !important; } .gt-xs\:-mx-48 { margin-left: -12rem !important; margin-right: -12rem !important; } .gt-xs\:-my-56 { margin-top: -14rem !important; margin-bottom: -14rem !important; } .gt-xs\:-mx-56 { margin-left: -14rem !important; margin-right: -14rem !important; } .gt-xs\:-my-64 { margin-top: -16rem !important; margin-bottom: -16rem !important; } .gt-xs\:-mx-64 { margin-left: -16rem !important; margin-right: -16rem !important; } .gt-xs\:-my-px { margin-top: -1px !important; margin-bottom: -1px !important; } .gt-xs\:-mx-px { margin-left: -1px !important; margin-right: -1px !important; } .gt-xs\:-my-2px { margin-top: -2px !important; margin-bottom: -2px !important; } .gt-xs\:-mx-2px { margin-left: -2px !important; margin-right: -2px !important; } .gt-xs\:mt-0 { margin-top: 0 !important; } .gt-xs\:mr-0 { margin-right: 0 !important; } .gt-xs\:mb-0 { margin-bottom: 0 !important; } .gt-xs\:ml-0 { margin-left: 0 !important; } .gt-xs\:mt-1 { margin-top: 0.25rem !important; } .gt-xs\:mr-1 { margin-right: 0.25rem !important; } .gt-xs\:mb-1 { margin-bottom: 0.25rem !important; } .gt-xs\:ml-1 { margin-left: 0.25rem !important; } .gt-xs\:mt-2 { margin-top: 0.5rem !important; } .gt-xs\:mr-2 { margin-right: 0.5rem !important; } .gt-xs\:mb-2 { margin-bottom: 0.5rem !important; } .gt-xs\:ml-2 { margin-left: 0.5rem !important; } .gt-xs\:mt-3 { margin-top: 0.75rem !important; } .gt-xs\:mr-3 { margin-right: 0.75rem !important; } .gt-xs\:mb-3 { margin-bottom: 0.75rem !important; } .gt-xs\:ml-3 { margin-left: 0.75rem !important; } .gt-xs\:mt-4 { margin-top: 1rem !important; } .gt-xs\:mr-4 { margin-right: 1rem !important; } .gt-xs\:mb-4 { margin-bottom: 1rem !important; } .gt-xs\:ml-4 { margin-left: 1rem !important; } .gt-xs\:mt-5 { margin-top: 1.25rem !important; } .gt-xs\:mr-5 { margin-right: 1.25rem !important; } .gt-xs\:mb-5 { margin-bottom: 1.25rem !important; } .gt-xs\:ml-5 { margin-left: 1.25rem !important; } .gt-xs\:mt-6 { margin-top: 1.5rem !important; } .gt-xs\:mr-6 { margin-right: 1.5rem !important; } .gt-xs\:mb-6 { margin-bottom: 1.5rem !important; } .gt-xs\:ml-6 { margin-left: 1.5rem !important; } .gt-xs\:mt-8 { margin-top: 2rem !important; } .gt-xs\:mr-8 { margin-right: 2rem !important; } .gt-xs\:mb-8 { margin-bottom: 2rem !important; } .gt-xs\:ml-8 { margin-left: 2rem !important; } .gt-xs\:mt-10 { margin-top: 2.5rem !important; } .gt-xs\:mr-10 { margin-right: 2.5rem !important; } .gt-xs\:mb-10 { margin-bottom: 2.5rem !important; } .gt-xs\:ml-10 { margin-left: 2.5rem !important; } .gt-xs\:mt-12 { margin-top: 3rem !important; } .gt-xs\:mr-12 { margin-right: 3rem !important; } .gt-xs\:mb-12 { margin-bottom: 3rem !important; } .gt-xs\:ml-12 { margin-left: 3rem !important; } .gt-xs\:mt-14 { margin-top: 3.5rem !important; } .gt-xs\:mr-14 { margin-right: 3.5rem !important; } .gt-xs\:mb-14 { margin-bottom: 3.5rem !important; } .gt-xs\:ml-14 { margin-left: 3.5rem !important; } .gt-xs\:mt-16 { margin-top: 4rem !important; } .gt-xs\:mr-16 { margin-right: 4rem !important; } .gt-xs\:mb-16 { margin-bottom: 4rem !important; } .gt-xs\:ml-16 { margin-left: 4rem !important; } .gt-xs\:mt-18 { margin-top: 4.5rem !important; } .gt-xs\:mr-18 { margin-right: 4.5rem !important; } .gt-xs\:mb-18 { margin-bottom: 4.5rem !important; } .gt-xs\:ml-18 { margin-left: 4.5rem !important; } .gt-xs\:mt-20 { margin-top: 5rem !important; } .gt-xs\:mr-20 { margin-right: 5rem !important; } .gt-xs\:mb-20 { margin-bottom: 5rem !important; } .gt-xs\:ml-20 { margin-left: 5rem !important; } .gt-xs\:mt-22 { margin-top: 5.5rem !important; } .gt-xs\:mr-22 { margin-right: 5.5rem !important; } .gt-xs\:mb-22 { margin-bottom: 5.5rem !important; } .gt-xs\:ml-22 { margin-left: 5.5rem !important; } .gt-xs\:mt-24 { margin-top: 6rem !important; } .gt-xs\:mr-24 { margin-right: 6rem !important; } .gt-xs\:mb-24 { margin-bottom: 6rem !important; } .gt-xs\:ml-24 { margin-left: 6rem !important; } .gt-xs\:mt-26 { margin-top: 6.5rem !important; } .gt-xs\:mr-26 { margin-right: 6.5rem !important; } .gt-xs\:mb-26 { margin-bottom: 6.5rem !important; } .gt-xs\:ml-26 { margin-left: 6.5rem !important; } .gt-xs\:mt-28 { margin-top: 7rem !important; } .gt-xs\:mr-28 { margin-right: 7rem !important; } .gt-xs\:mb-28 { margin-bottom: 7rem !important; } .gt-xs\:ml-28 { margin-left: 7rem !important; } .gt-xs\:mt-30 { margin-top: 7.5rem !important; } .gt-xs\:mr-30 { margin-right: 7.5rem !important; } .gt-xs\:mb-30 { margin-bottom: 7.5rem !important; } .gt-xs\:ml-30 { margin-left: 7.5rem !important; } .gt-xs\:mt-32 { margin-top: 8rem !important; } .gt-xs\:mr-32 { margin-right: 8rem !important; } .gt-xs\:mb-32 { margin-bottom: 8rem !important; } .gt-xs\:ml-32 { margin-left: 8rem !important; } .gt-xs\:mt-36 { margin-top: 9rem !important; } .gt-xs\:mr-36 { margin-right: 9rem !important; } .gt-xs\:mb-36 { margin-bottom: 9rem !important; } .gt-xs\:ml-36 { margin-left: 9rem !important; } .gt-xs\:mt-40 { margin-top: 10rem !important; } .gt-xs\:mr-40 { margin-right: 10rem !important; } .gt-xs\:mb-40 { margin-bottom: 10rem !important; } .gt-xs\:ml-40 { margin-left: 10rem !important; } .gt-xs\:mt-48 { margin-top: 12rem !important; } .gt-xs\:mr-48 { margin-right: 12rem !important; } .gt-xs\:mb-48 { margin-bottom: 12rem !important; } .gt-xs\:ml-48 { margin-left: 12rem !important; } .gt-xs\:mt-56 { margin-top: 14rem !important; } .gt-xs\:mr-56 { margin-right: 14rem !important; } .gt-xs\:mb-56 { margin-bottom: 14rem !important; } .gt-xs\:ml-56 { margin-left: 14rem !important; } .gt-xs\:mt-64 { margin-top: 16rem !important; } .gt-xs\:mr-64 { margin-right: 16rem !important; } .gt-xs\:mb-64 { margin-bottom: 16rem !important; } .gt-xs\:ml-64 { margin-left: 16rem !important; } .gt-xs\:mt-auto { margin-top: auto !important; } .gt-xs\:mr-auto { margin-right: auto !important; } .gt-xs\:mb-auto { margin-bottom: auto !important; } .gt-xs\:ml-auto { margin-left: auto !important; } .gt-xs\:mt-px { margin-top: 1px !important; } .gt-xs\:mr-px { margin-right: 1px !important; } .gt-xs\:mb-px { margin-bottom: 1px !important; } .gt-xs\:ml-px { margin-left: 1px !important; } .gt-xs\:mt-2px { margin-top: 2px !important; } .gt-xs\:mr-2px { margin-right: 2px !important; } .gt-xs\:mb-2px { margin-bottom: 2px !important; } .gt-xs\:ml-2px { margin-left: 2px !important; } .gt-xs\:-mt-1 { margin-top: -0.25rem !important; } .gt-xs\:-mr-1 { margin-right: -0.25rem !important; } .gt-xs\:-mb-1 { margin-bottom: -0.25rem !important; } .gt-xs\:-ml-1 { margin-left: -0.25rem !important; } .gt-xs\:-mt-2 { margin-top: -0.5rem !important; } .gt-xs\:-mr-2 { margin-right: -0.5rem !important; } .gt-xs\:-mb-2 { margin-bottom: -0.5rem !important; } .gt-xs\:-ml-2 { margin-left: -0.5rem !important; } .gt-xs\:-mt-3 { margin-top: -0.75rem !important; } .gt-xs\:-mr-3 { margin-right: -0.75rem !important; } .gt-xs\:-mb-3 { margin-bottom: -0.75rem !important; } .gt-xs\:-ml-3 { margin-left: -0.75rem !important; } .gt-xs\:-mt-4 { margin-top: -1rem !important; } .gt-xs\:-mr-4 { margin-right: -1rem !important; } .gt-xs\:-mb-4 { margin-bottom: -1rem !important; } .gt-xs\:-ml-4 { margin-left: -1rem !important; } .gt-xs\:-mt-5 { margin-top: -1.25rem !important; } .gt-xs\:-mr-5 { margin-right: -1.25rem !important; } .gt-xs\:-mb-5 { margin-bottom: -1.25rem !important; } .gt-xs\:-ml-5 { margin-left: -1.25rem !important; } .gt-xs\:-mt-6 { margin-top: -1.5rem !important; } .gt-xs\:-mr-6 { margin-right: -1.5rem !important; } .gt-xs\:-mb-6 { margin-bottom: -1.5rem !important; } .gt-xs\:-ml-6 { margin-left: -1.5rem !important; } .gt-xs\:-mt-8 { margin-top: -2rem !important; } .gt-xs\:-mr-8 { margin-right: -2rem !important; } .gt-xs\:-mb-8 { margin-bottom: -2rem !important; } .gt-xs\:-ml-8 { margin-left: -2rem !important; } .gt-xs\:-mt-10 { margin-top: -2.5rem !important; } .gt-xs\:-mr-10 { margin-right: -2.5rem !important; } .gt-xs\:-mb-10 { margin-bottom: -2.5rem !important; } .gt-xs\:-ml-10 { margin-left: -2.5rem !important; } .gt-xs\:-mt-12 { margin-top: -3rem !important; } .gt-xs\:-mr-12 { margin-right: -3rem !important; } .gt-xs\:-mb-12 { margin-bottom: -3rem !important; } .gt-xs\:-ml-12 { margin-left: -3rem !important; } .gt-xs\:-mt-14 { margin-top: -3.5rem !important; } .gt-xs\:-mr-14 { margin-right: -3.5rem !important; } .gt-xs\:-mb-14 { margin-bottom: -3.5rem !important; } .gt-xs\:-ml-14 { margin-left: -3.5rem !important; } .gt-xs\:-mt-16 { margin-top: -4rem !important; } .gt-xs\:-mr-16 { margin-right: -4rem !important; } .gt-xs\:-mb-16 { margin-bottom: -4rem !important; } .gt-xs\:-ml-16 { margin-left: -4rem !important; } .gt-xs\:-mt-18 { margin-top: -4.5rem !important; } .gt-xs\:-mr-18 { margin-right: -4.5rem !important; } .gt-xs\:-mb-18 { margin-bottom: -4.5rem !important; } .gt-xs\:-ml-18 { margin-left: -4.5rem !important; } .gt-xs\:-mt-20 { margin-top: -5rem !important; } .gt-xs\:-mr-20 { margin-right: -5rem !important; } .gt-xs\:-mb-20 { margin-bottom: -5rem !important; } .gt-xs\:-ml-20 { margin-left: -5rem !important; } .gt-xs\:-mt-22 { margin-top: -5.5rem !important; } .gt-xs\:-mr-22 { margin-right: -5.5rem !important; } .gt-xs\:-mb-22 { margin-bottom: -5.5rem !important; } .gt-xs\:-ml-22 { margin-left: -5.5rem !important; } .gt-xs\:-mt-24 { margin-top: -6rem !important; } .gt-xs\:-mr-24 { margin-right: -6rem !important; } .gt-xs\:-mb-24 { margin-bottom: -6rem !important; } .gt-xs\:-ml-24 { margin-left: -6rem !important; } .gt-xs\:-mt-26 { margin-top: -6.5rem !important; } .gt-xs\:-mr-26 { margin-right: -6.5rem !important; } .gt-xs\:-mb-26 { margin-bottom: -6.5rem !important; } .gt-xs\:-ml-26 { margin-left: -6.5rem !important; } .gt-xs\:-mt-28 { margin-top: -7rem !important; } .gt-xs\:-mr-28 { margin-right: -7rem !important; } .gt-xs\:-mb-28 { margin-bottom: -7rem !important; } .gt-xs\:-ml-28 { margin-left: -7rem !important; } .gt-xs\:-mt-30 { margin-top: -7.5rem !important; } .gt-xs\:-mr-30 { margin-right: -7.5rem !important; } .gt-xs\:-mb-30 { margin-bottom: -7.5rem !important; } .gt-xs\:-ml-30 { margin-left: -7.5rem !important; } .gt-xs\:-mt-32 { margin-top: -8rem !important; } .gt-xs\:-mr-32 { margin-right: -8rem !important; } .gt-xs\:-mb-32 { margin-bottom: -8rem !important; } .gt-xs\:-ml-32 { margin-left: -8rem !important; } .gt-xs\:-mt-36 { margin-top: -9rem !important; } .gt-xs\:-mr-36 { margin-right: -9rem !important; } .gt-xs\:-mb-36 { margin-bottom: -9rem !important; } .gt-xs\:-ml-36 { margin-left: -9rem !important; } .gt-xs\:-mt-40 { margin-top: -10rem !important; } .gt-xs\:-mr-40 { margin-right: -10rem !important; } .gt-xs\:-mb-40 { margin-bottom: -10rem !important; } .gt-xs\:-ml-40 { margin-left: -10rem !important; } .gt-xs\:-mt-48 { margin-top: -12rem !important; } .gt-xs\:-mr-48 { margin-right: -12rem !important; } .gt-xs\:-mb-48 { margin-bottom: -12rem !important; } .gt-xs\:-ml-48 { margin-left: -12rem !important; } .gt-xs\:-mt-56 { margin-top: -14rem !important; } .gt-xs\:-mr-56 { margin-right: -14rem !important; } .gt-xs\:-mb-56 { margin-bottom: -14rem !important; } .gt-xs\:-ml-56 { margin-left: -14rem !important; } .gt-xs\:-mt-64 { margin-top: -16rem !important; } .gt-xs\:-mr-64 { margin-right: -16rem !important; } .gt-xs\:-mb-64 { margin-bottom: -16rem !important; } .gt-xs\:-ml-64 { margin-left: -16rem !important; } .gt-xs\:-mt-px { margin-top: -1px !important; } .gt-xs\:-mr-px { margin-right: -1px !important; } .gt-xs\:-mb-px { margin-bottom: -1px !important; } .gt-xs\:-ml-px { margin-left: -1px !important; } .gt-xs\:-mt-2px { margin-top: -2px !important; } .gt-xs\:-mr-2px { margin-right: -2px !important; } .gt-xs\:-mb-2px { margin-bottom: -2px !important; } .gt-xs\:-ml-2px { margin-left: -2px !important; } .gt-xs\:max-h-0 { max-height: 0 !important; } .gt-xs\:max-h-1 { max-height: 0.25rem !important; } .gt-xs\:max-h-2 { max-height: 0.5rem !important; } .gt-xs\:max-h-3 { max-height: 0.75rem !important; } .gt-xs\:max-h-4 { max-height: 1rem !important; } .gt-xs\:max-h-5 { max-height: 1.25rem !important; } .gt-xs\:max-h-6 { max-height: 1.5rem !important; } .gt-xs\:max-h-8 { max-height: 2rem !important; } .gt-xs\:max-h-10 { max-height: 2.5rem !important; } .gt-xs\:max-h-12 { max-height: 3rem !important; } .gt-xs\:max-h-14 { max-height: 3.5rem !important; } .gt-xs\:max-h-16 { max-height: 4rem !important; } .gt-xs\:max-h-18 { max-height: 4.5rem !important; } .gt-xs\:max-h-20 { max-height: 5rem !important; } .gt-xs\:max-h-22 { max-height: 5.5rem !important; } .gt-xs\:max-h-24 { max-height: 6rem !important; } .gt-xs\:max-h-26 { max-height: 6.5rem !important; } .gt-xs\:max-h-28 { max-height: 7rem !important; } .gt-xs\:max-h-30 { max-height: 7.5rem !important; } .gt-xs\:max-h-32 { max-height: 8rem !important; } .gt-xs\:max-h-36 { max-height: 9rem !important; } .gt-xs\:max-h-40 { max-height: 10rem !important; } .gt-xs\:max-h-48 { max-height: 12rem !important; } .gt-xs\:max-h-50 { max-height: 12.5rem !important; } .gt-xs\:max-h-56 { max-height: 14rem !important; } .gt-xs\:max-h-60 { max-height: 15rem !important; } .gt-xs\:max-h-64 { max-height: 16rem !important; } .gt-xs\:max-h-80 { max-height: 20rem !important; } .gt-xs\:max-h-90 { max-height: 24rem !important; } .gt-xs\:max-h-100 { max-height: 25rem !important; } .gt-xs\:max-h-120 { max-height: 30rem !important; } .gt-xs\:max-h-128 { max-height: 32rem !important; } .gt-xs\:max-h-140 { max-height: 35rem !important; } .gt-xs\:max-h-160 { max-height: 40rem !important; } .gt-xs\:max-h-180 { max-height: 45rem !important; } .gt-xs\:max-h-192 { max-height: 48rem !important; } .gt-xs\:max-h-200 { max-height: 50rem !important; } .gt-xs\:max-h-240 { max-height: 60rem !important; } .gt-xs\:max-h-256 { max-height: 64rem !important; } .gt-xs\:max-h-280 { max-height: 70rem !important; } .gt-xs\:max-h-320 { max-height: 80rem !important; } .gt-xs\:max-h-360 { max-height: 90rem !important; } .gt-xs\:max-h-400 { max-height: 100rem !important; } .gt-xs\:max-h-480 { max-height: 120rem !important; } .gt-xs\:max-h-full { max-height: 100% !important; } .gt-xs\:max-h-screen { max-height: 100vh !important; } .gt-xs\:max-h-none { max-height: none !important; } .gt-xs\:max-h-px { max-height: 1px !important; } .gt-xs\:max-h-2px { max-height: 2px !important; } .gt-xs\:max-h-1\/2 { max-height: 50% !important; } .gt-xs\:max-h-1\/3 { max-height: 33.33333% !important; } .gt-xs\:max-h-2\/3 { max-height: 66.66667% !important; } .gt-xs\:max-h-1\/4 { max-height: 25% !important; } .gt-xs\:max-h-2\/4 { max-height: 50% !important; } .gt-xs\:max-h-3\/4 { max-height: 75% !important; } .gt-xs\:max-h-1\/5 { max-height: 20% !important; } .gt-xs\:max-h-2\/5 { max-height: 40% !important; } .gt-xs\:max-h-3\/5 { max-height: 60% !important; } .gt-xs\:max-h-4\/5 { max-height: 80% !important; } .gt-xs\:max-h-1\/12 { max-height: 8.33333% !important; } .gt-xs\:max-h-2\/12 { max-height: 16.66667% !important; } .gt-xs\:max-h-3\/12 { max-height: 25% !important; } .gt-xs\:max-h-4\/12 { max-height: 33.33333% !important; } .gt-xs\:max-h-5\/12 { max-height: 41.66667% !important; } .gt-xs\:max-h-6\/12 { max-height: 50% !important; } .gt-xs\:max-h-7\/12 { max-height: 58.33333% !important; } .gt-xs\:max-h-8\/12 { max-height: 66.66667% !important; } .gt-xs\:max-h-9\/12 { max-height: 75% !important; } .gt-xs\:max-h-10\/12 { max-height: 83.33333% !important; } .gt-xs\:max-h-11\/12 { max-height: 91.66667% !important; } .gt-xs\:max-w-0 { max-width: 0 !important; } .gt-xs\:max-w-1 { max-width: 0.25rem !important; } .gt-xs\:max-w-2 { max-width: 0.5rem !important; } .gt-xs\:max-w-3 { max-width: 0.75rem !important; } .gt-xs\:max-w-4 { max-width: 1rem !important; } .gt-xs\:max-w-5 { max-width: 1.25rem !important; } .gt-xs\:max-w-6 { max-width: 1.5rem !important; } .gt-xs\:max-w-8 { max-width: 2rem !important; } .gt-xs\:max-w-10 { max-width: 2.5rem !important; } .gt-xs\:max-w-12 { max-width: 3rem !important; } .gt-xs\:max-w-14 { max-width: 3.5rem !important; } .gt-xs\:max-w-16 { max-width: 4rem !important; } .gt-xs\:max-w-18 { max-width: 4.5rem !important; } .gt-xs\:max-w-20 { max-width: 5rem !important; } .gt-xs\:max-w-22 { max-width: 5.5rem !important; } .gt-xs\:max-w-24 { max-width: 6rem !important; } .gt-xs\:max-w-26 { max-width: 6.5rem !important; } .gt-xs\:max-w-28 { max-width: 7rem !important; } .gt-xs\:max-w-30 { max-width: 7.5rem !important; } .gt-xs\:max-w-32 { max-width: 8rem !important; } .gt-xs\:max-w-36 { max-width: 9rem !important; } .gt-xs\:max-w-40 { max-width: 10rem !important; } .gt-xs\:max-w-48 { max-width: 12rem !important; } .gt-xs\:max-w-50 { max-width: 12.5rem !important; } .gt-xs\:max-w-56 { max-width: 14rem !important; } .gt-xs\:max-w-60 { max-width: 15rem !important; } .gt-xs\:max-w-64 { max-width: 16rem !important; } .gt-xs\:max-w-80 { max-width: 20rem !important; } .gt-xs\:max-w-90 { max-width: 24rem !important; } .gt-xs\:max-w-100 { max-width: 25rem !important; } .gt-xs\:max-w-120 { max-width: 30rem !important; } .gt-xs\:max-w-128 { max-width: 32rem !important; } .gt-xs\:max-w-140 { max-width: 35rem !important; } .gt-xs\:max-w-160 { max-width: 40rem !important; } .gt-xs\:max-w-180 { max-width: 45rem !important; } .gt-xs\:max-w-192 { max-width: 48rem !important; } .gt-xs\:max-w-200 { max-width: 50rem !important; } .gt-xs\:max-w-240 { max-width: 60rem !important; } .gt-xs\:max-w-256 { max-width: 64rem !important; } .gt-xs\:max-w-280 { max-width: 70rem !important; } .gt-xs\:max-w-320 { max-width: 80rem !important; } .gt-xs\:max-w-360 { max-width: 90rem !important; } .gt-xs\:max-w-400 { max-width: 100rem !important; } .gt-xs\:max-w-480 { max-width: 120rem !important; } .gt-xs\:max-w-none { max-width: none !important; } .gt-xs\:max-w-xs { max-width: 20rem !important; } .gt-xs\:max-w-sm { max-width: 24rem !important; } .gt-xs\:max-w-md { max-width: 28rem !important; } .gt-xs\:max-w-lg { max-width: 32rem !important; } .gt-xs\:max-w-xl { max-width: 36rem !important; } .gt-xs\:max-w-2xl { max-width: 42rem !important; } .gt-xs\:max-w-3xl { max-width: 48rem !important; } .gt-xs\:max-w-4xl { max-width: 56rem !important; } .gt-xs\:max-w-5xl { max-width: 64rem !important; } .gt-xs\:max-w-6xl { max-width: 72rem !important; } .gt-xs\:max-w-full { max-width: 100% !important; } .gt-xs\:max-w-screen { max-width: 100vw !important; } .gt-xs\:max-w-px { max-width: 1px !important; } .gt-xs\:max-w-2px { max-width: 2px !important; } .gt-xs\:max-w-1\/2 { max-width: 50% !important; } .gt-xs\:max-w-1\/3 { max-width: 33.33333% !important; } .gt-xs\:max-w-2\/3 { max-width: 66.66667% !important; } .gt-xs\:max-w-1\/4 { max-width: 25% !important; } .gt-xs\:max-w-2\/4 { max-width: 50% !important; } .gt-xs\:max-w-3\/4 { max-width: 75% !important; } .gt-xs\:max-w-1\/5 { max-width: 20% !important; } .gt-xs\:max-w-2\/5 { max-width: 40% !important; } .gt-xs\:max-w-3\/5 { max-width: 60% !important; } .gt-xs\:max-w-4\/5 { max-width: 80% !important; } .gt-xs\:max-w-1\/12 { max-width: 8.33333% !important; } .gt-xs\:max-w-2\/12 { max-width: 16.66667% !important; } .gt-xs\:max-w-3\/12 { max-width: 25% !important; } .gt-xs\:max-w-4\/12 { max-width: 33.33333% !important; } .gt-xs\:max-w-5\/12 { max-width: 41.66667% !important; } .gt-xs\:max-w-6\/12 { max-width: 50% !important; } .gt-xs\:max-w-7\/12 { max-width: 58.33333% !important; } .gt-xs\:max-w-8\/12 { max-width: 66.66667% !important; } .gt-xs\:max-w-9\/12 { max-width: 75% !important; } .gt-xs\:max-w-10\/12 { max-width: 83.33333% !important; } .gt-xs\:max-w-11\/12 { max-width: 91.66667% !important; } .gt-xs\:min-h-0 { min-height: 0 !important; } .gt-xs\:min-h-1 { min-height: 0.25rem !important; } .gt-xs\:min-h-2 { min-height: 0.5rem !important; } .gt-xs\:min-h-3 { min-height: 0.75rem !important; } .gt-xs\:min-h-4 { min-height: 1rem !important; } .gt-xs\:min-h-5 { min-height: 1.25rem !important; } .gt-xs\:min-h-6 { min-height: 1.5rem !important; } .gt-xs\:min-h-8 { min-height: 2rem !important; } .gt-xs\:min-h-10 { min-height: 2.5rem !important; } .gt-xs\:min-h-12 { min-height: 3rem !important; } .gt-xs\:min-h-14 { min-height: 3.5rem !important; } .gt-xs\:min-h-16 { min-height: 4rem !important; } .gt-xs\:min-h-18 { min-height: 4.5rem !important; } .gt-xs\:min-h-20 { min-height: 5rem !important; } .gt-xs\:min-h-22 { min-height: 5.5rem !important; } .gt-xs\:min-h-24 { min-height: 6rem !important; } .gt-xs\:min-h-26 { min-height: 6.5rem !important; } .gt-xs\:min-h-28 { min-height: 7rem !important; } .gt-xs\:min-h-30 { min-height: 7.5rem !important; } .gt-xs\:min-h-32 { min-height: 8rem !important; } .gt-xs\:min-h-36 { min-height: 9rem !important; } .gt-xs\:min-h-40 { min-height: 10rem !important; } .gt-xs\:min-h-48 { min-height: 12rem !important; } .gt-xs\:min-h-50 { min-height: 12.5rem !important; } .gt-xs\:min-h-56 { min-height: 14rem !important; } .gt-xs\:min-h-60 { min-height: 15rem !important; } .gt-xs\:min-h-64 { min-height: 16rem !important; } .gt-xs\:min-h-80 { min-height: 20rem !important; } .gt-xs\:min-h-90 { min-height: 24rem !important; } .gt-xs\:min-h-100 { min-height: 25rem !important; } .gt-xs\:min-h-120 { min-height: 30rem !important; } .gt-xs\:min-h-128 { min-height: 32rem !important; } .gt-xs\:min-h-140 { min-height: 35rem !important; } .gt-xs\:min-h-160 { min-height: 40rem !important; } .gt-xs\:min-h-180 { min-height: 45rem !important; } .gt-xs\:min-h-192 { min-height: 48rem !important; } .gt-xs\:min-h-200 { min-height: 50rem !important; } .gt-xs\:min-h-240 { min-height: 60rem !important; } .gt-xs\:min-h-256 { min-height: 64rem !important; } .gt-xs\:min-h-280 { min-height: 70rem !important; } .gt-xs\:min-h-320 { min-height: 80rem !important; } .gt-xs\:min-h-360 { min-height: 90rem !important; } .gt-xs\:min-h-400 { min-height: 100rem !important; } .gt-xs\:min-h-480 { min-height: 120rem !important; } .gt-xs\:min-h-full { min-height: 100% !important; } .gt-xs\:min-h-screen { min-height: 100vh !important; } .gt-xs\:min-h-px { min-height: 1px !important; } .gt-xs\:min-h-2px { min-height: 2px !important; } .gt-xs\:min-h-1\/2 { min-height: 50% !important; } .gt-xs\:min-h-1\/3 { min-height: 33.33333% !important; } .gt-xs\:min-h-2\/3 { min-height: 66.66667% !important; } .gt-xs\:min-h-1\/4 { min-height: 25% !important; } .gt-xs\:min-h-2\/4 { min-height: 50% !important; } .gt-xs\:min-h-3\/4 { min-height: 75% !important; } .gt-xs\:min-h-1\/5 { min-height: 20% !important; } .gt-xs\:min-h-2\/5 { min-height: 40% !important; } .gt-xs\:min-h-3\/5 { min-height: 60% !important; } .gt-xs\:min-h-4\/5 { min-height: 80% !important; } .gt-xs\:min-h-1\/12 { min-height: 8.33333% !important; } .gt-xs\:min-h-2\/12 { min-height: 16.66667% !important; } .gt-xs\:min-h-3\/12 { min-height: 25% !important; } .gt-xs\:min-h-4\/12 { min-height: 33.33333% !important; } .gt-xs\:min-h-5\/12 { min-height: 41.66667% !important; } .gt-xs\:min-h-6\/12 { min-height: 50% !important; } .gt-xs\:min-h-7\/12 { min-height: 58.33333% !important; } .gt-xs\:min-h-8\/12 { min-height: 66.66667% !important; } .gt-xs\:min-h-9\/12 { min-height: 75% !important; } .gt-xs\:min-h-10\/12 { min-height: 83.33333% !important; } .gt-xs\:min-h-11\/12 { min-height: 91.66667% !important; } .gt-xs\:min-w-0 { min-width: 0 !important; } .gt-xs\:min-w-1 { min-width: 0.25rem !important; } .gt-xs\:min-w-2 { min-width: 0.5rem !important; } .gt-xs\:min-w-3 { min-width: 0.75rem !important; } .gt-xs\:min-w-4 { min-width: 1rem !important; } .gt-xs\:min-w-5 { min-width: 1.25rem !important; } .gt-xs\:min-w-6 { min-width: 1.5rem !important; } .gt-xs\:min-w-8 { min-width: 2rem !important; } .gt-xs\:min-w-10 { min-width: 2.5rem !important; } .gt-xs\:min-w-12 { min-width: 3rem !important; } .gt-xs\:min-w-14 { min-width: 3.5rem !important; } .gt-xs\:min-w-16 { min-width: 4rem !important; } .gt-xs\:min-w-18 { min-width: 4.5rem !important; } .gt-xs\:min-w-20 { min-width: 5rem !important; } .gt-xs\:min-w-22 { min-width: 5.5rem !important; } .gt-xs\:min-w-24 { min-width: 6rem !important; } .gt-xs\:min-w-26 { min-width: 6.5rem !important; } .gt-xs\:min-w-28 { min-width: 7rem !important; } .gt-xs\:min-w-30 { min-width: 7.5rem !important; } .gt-xs\:min-w-32 { min-width: 8rem !important; } .gt-xs\:min-w-36 { min-width: 9rem !important; } .gt-xs\:min-w-40 { min-width: 10rem !important; } .gt-xs\:min-w-48 { min-width: 12rem !important; } .gt-xs\:min-w-50 { min-width: 12.5rem !important; } .gt-xs\:min-w-56 { min-width: 14rem !important; } .gt-xs\:min-w-60 { min-width: 15rem !important; } .gt-xs\:min-w-64 { min-width: 16rem !important; } .gt-xs\:min-w-80 { min-width: 20rem !important; } .gt-xs\:min-w-90 { min-width: 24rem !important; } .gt-xs\:min-w-100 { min-width: 25rem !important; } .gt-xs\:min-w-120 { min-width: 30rem !important; } .gt-xs\:min-w-128 { min-width: 32rem !important; } .gt-xs\:min-w-140 { min-width: 35rem !important; } .gt-xs\:min-w-160 { min-width: 40rem !important; } .gt-xs\:min-w-180 { min-width: 45rem !important; } .gt-xs\:min-w-192 { min-width: 48rem !important; } .gt-xs\:min-w-200 { min-width: 50rem !important; } .gt-xs\:min-w-240 { min-width: 60rem !important; } .gt-xs\:min-w-256 { min-width: 64rem !important; } .gt-xs\:min-w-280 { min-width: 70rem !important; } .gt-xs\:min-w-320 { min-width: 80rem !important; } .gt-xs\:min-w-360 { min-width: 90rem !important; } .gt-xs\:min-w-400 { min-width: 100rem !important; } .gt-xs\:min-w-480 { min-width: 120rem !important; } .gt-xs\:min-w-full { min-width: 100% !important; } .gt-xs\:min-w-screen { min-width: 100vw !important; } .gt-xs\:min-w-px { min-width: 1px !important; } .gt-xs\:min-w-2px { min-width: 2px !important; } .gt-xs\:min-w-1\/2 { min-width: 50% !important; } .gt-xs\:min-w-1\/3 { min-width: 33.33333% !important; } .gt-xs\:min-w-2\/3 { min-width: 66.66667% !important; } .gt-xs\:min-w-1\/4 { min-width: 25% !important; } .gt-xs\:min-w-2\/4 { min-width: 50% !important; } .gt-xs\:min-w-3\/4 { min-width: 75% !important; } .gt-xs\:min-w-1\/5 { min-width: 20% !important; } .gt-xs\:min-w-2\/5 { min-width: 40% !important; } .gt-xs\:min-w-3\/5 { min-width: 60% !important; } .gt-xs\:min-w-4\/5 { min-width: 80% !important; } .gt-xs\:min-w-1\/12 { min-width: 8.33333% !important; } .gt-xs\:min-w-2\/12 { min-width: 16.66667% !important; } .gt-xs\:min-w-3\/12 { min-width: 25% !important; } .gt-xs\:min-w-4\/12 { min-width: 33.33333% !important; } .gt-xs\:min-w-5\/12 { min-width: 41.66667% !important; } .gt-xs\:min-w-6\/12 { min-width: 50% !important; } .gt-xs\:min-w-7\/12 { min-width: 58.33333% !important; } .gt-xs\:min-w-8\/12 { min-width: 66.66667% !important; } .gt-xs\:min-w-9\/12 { min-width: 75% !important; } .gt-xs\:min-w-10\/12 { min-width: 83.33333% !important; } .gt-xs\:min-w-11\/12 { min-width: 91.66667% !important; } .gt-xs\:object-contain { -o-object-fit: contain !important; object-fit: contain !important; } .gt-xs\:object-cover { -o-object-fit: cover !important; object-fit: cover !important; } .gt-xs\:object-fill { -o-object-fit: fill !important; object-fit: fill !important; } .gt-xs\:object-none { -o-object-fit: none !important; object-fit: none !important; } .gt-xs\:object-scale-down { -o-object-fit: scale-down !important; object-fit: scale-down !important; } .gt-xs\:object-bottom { -o-object-position: bottom !important; object-position: bottom !important; } .gt-xs\:object-center { -o-object-position: center !important; object-position: center !important; } .gt-xs\:object-left { -o-object-position: left !important; object-position: left !important; } .gt-xs\:object-left-bottom { -o-object-position: left bottom !important; object-position: left bottom !important; } .gt-xs\:object-left-top { -o-object-position: left top !important; object-position: left top !important; } .gt-xs\:object-right { -o-object-position: right !important; object-position: right !important; } .gt-xs\:object-right-bottom { -o-object-position: right bottom !important; object-position: right bottom !important; } .gt-xs\:object-right-top { -o-object-position: right top !important; object-position: right top !important; } .gt-xs\:object-top { -o-object-position: top !important; object-position: top !important; } .gt-xs\:opacity-0 { opacity: 0 !important; } .gt-xs\:opacity-12 { opacity: 0.12 !important; } .gt-xs\:opacity-25 { opacity: 0.25 !important; } .gt-xs\:opacity-38 { opacity: 0.38 !important; } .gt-xs\:opacity-50 { opacity: 0.5 !important; } .gt-xs\:opacity-54 { opacity: 0.54 !important; } .gt-xs\:opacity-70 { opacity: 0.70 !important; } .gt-xs\:opacity-75 { opacity: 0.75 !important; } .gt-xs\:opacity-84 { opacity: 0.84 !important; } .gt-xs\:opacity-100 { opacity: 1 !important; } .gt-xs\:hover\:opacity-0:hover { opacity: 0 !important; } .gt-xs\:hover\:opacity-12:hover { opacity: 0.12 !important; } .gt-xs\:hover\:opacity-25:hover { opacity: 0.25 !important; } .gt-xs\:hover\:opacity-38:hover { opacity: 0.38 !important; } .gt-xs\:hover\:opacity-50:hover { opacity: 0.5 !important; } .gt-xs\:hover\:opacity-54:hover { opacity: 0.54 !important; } .gt-xs\:hover\:opacity-70:hover { opacity: 0.70 !important; } .gt-xs\:hover\:opacity-75:hover { opacity: 0.75 !important; } .gt-xs\:hover\:opacity-84:hover { opacity: 0.84 !important; } .gt-xs\:hover\:opacity-100:hover { opacity: 1 !important; } .gt-xs\:focus\:opacity-0:focus { opacity: 0 !important; } .gt-xs\:focus\:opacity-12:focus { opacity: 0.12 !important; } .gt-xs\:focus\:opacity-25:focus { opacity: 0.25 !important; } .gt-xs\:focus\:opacity-38:focus { opacity: 0.38 !important; } .gt-xs\:focus\:opacity-50:focus { opacity: 0.5 !important; } .gt-xs\:focus\:opacity-54:focus { opacity: 0.54 !important; } .gt-xs\:focus\:opacity-70:focus { opacity: 0.70 !important; } .gt-xs\:focus\:opacity-75:focus { opacity: 0.75 !important; } .gt-xs\:focus\:opacity-84:focus { opacity: 0.84 !important; } .gt-xs\:focus\:opacity-100:focus { opacity: 1 !important; } .gt-xs\:outline-none { outline: 0 !important; } .gt-xs\:focus\:outline-none:focus { outline: 0 !important; } .gt-xs\:overflow-auto { overflow: auto !important; } .gt-xs\:overflow-hidden { overflow: hidden !important; } .gt-xs\:overflow-visible { overflow: visible !important; } .gt-xs\:overflow-scroll { overflow: scroll !important; } .gt-xs\:overflow-x-auto { overflow-x: auto !important; } .gt-xs\:overflow-y-auto { overflow-y: auto !important; } .gt-xs\:overflow-x-hidden { overflow-x: hidden !important; } .gt-xs\:overflow-y-hidden { overflow-y: hidden !important; } .gt-xs\:overflow-x-visible { overflow-x: visible !important; } .gt-xs\:overflow-y-visible { overflow-y: visible !important; } .gt-xs\:overflow-x-scroll { overflow-x: scroll !important; } .gt-xs\:overflow-y-scroll { overflow-y: scroll !important; } .gt-xs\:scrolling-touch { -webkit-overflow-scrolling: touch !important; } .gt-xs\:scrolling-auto { -webkit-overflow-scrolling: auto !important; } .gt-xs\:p-0 { padding: 0 !important; } .gt-xs\:p-1 { padding: 0.25rem !important; } .gt-xs\:p-2 { padding: 0.5rem !important; } .gt-xs\:p-3 { padding: 0.75rem !important; } .gt-xs\:p-4 { padding: 1rem !important; } .gt-xs\:p-5 { padding: 1.25rem !important; } .gt-xs\:p-6 { padding: 1.5rem !important; } .gt-xs\:p-8 { padding: 2rem !important; } .gt-xs\:p-10 { padding: 2.5rem !important; } .gt-xs\:p-12 { padding: 3rem !important; } .gt-xs\:p-14 { padding: 3.5rem !important; } .gt-xs\:p-16 { padding: 4rem !important; } .gt-xs\:p-18 { padding: 4.5rem !important; } .gt-xs\:p-20 { padding: 5rem !important; } .gt-xs\:p-22 { padding: 5.5rem !important; } .gt-xs\:p-24 { padding: 6rem !important; } .gt-xs\:p-26 { padding: 6.5rem !important; } .gt-xs\:p-28 { padding: 7rem !important; } .gt-xs\:p-30 { padding: 7.5rem !important; } .gt-xs\:p-32 { padding: 8rem !important; } .gt-xs\:p-36 { padding: 9rem !important; } .gt-xs\:p-40 { padding: 10rem !important; } .gt-xs\:p-48 { padding: 12rem !important; } .gt-xs\:p-56 { padding: 14rem !important; } .gt-xs\:p-64 { padding: 16rem !important; } .gt-xs\:p-px { padding: 1px !important; } .gt-xs\:p-2px { padding: 2px !important; } .gt-xs\:py-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .gt-xs\:px-0 { padding-left: 0 !important; padding-right: 0 !important; } .gt-xs\:py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .gt-xs\:px-1 { padding-left: 0.25rem !important; padding-right: 0.25rem !important; } .gt-xs\:py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .gt-xs\:px-2 { padding-left: 0.5rem !important; padding-right: 0.5rem !important; } .gt-xs\:py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .gt-xs\:px-3 { padding-left: 0.75rem !important; padding-right: 0.75rem !important; } .gt-xs\:py-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .gt-xs\:px-4 { padding-left: 1rem !important; padding-right: 1rem !important; } .gt-xs\:py-5 { padding-top: 1.25rem !important; padding-bottom: 1.25rem !important; } .gt-xs\:px-5 { padding-left: 1.25rem !important; padding-right: 1.25rem !important; } .gt-xs\:py-6 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .gt-xs\:px-6 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } .gt-xs\:py-8 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .gt-xs\:px-8 { padding-left: 2rem !important; padding-right: 2rem !important; } .gt-xs\:py-10 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .gt-xs\:px-10 { padding-left: 2.5rem !important; padding-right: 2.5rem !important; } .gt-xs\:py-12 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .gt-xs\:px-12 { padding-left: 3rem !important; padding-right: 3rem !important; } .gt-xs\:py-14 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .gt-xs\:px-14 { padding-left: 3.5rem !important; padding-right: 3.5rem !important; } .gt-xs\:py-16 { padding-top: 4rem !important; padding-bottom: 4rem !important; } .gt-xs\:px-16 { padding-left: 4rem !important; padding-right: 4rem !important; } .gt-xs\:py-18 { padding-top: 4.5rem !important; padding-bottom: 4.5rem !important; } .gt-xs\:px-18 { padding-left: 4.5rem !important; padding-right: 4.5rem !important; } .gt-xs\:py-20 { padding-top: 5rem !important; padding-bottom: 5rem !important; } .gt-xs\:px-20 { padding-left: 5rem !important; padding-right: 5rem !important; } .gt-xs\:py-22 { padding-top: 5.5rem !important; padding-bottom: 5.5rem !important; } .gt-xs\:px-22 { padding-left: 5.5rem !important; padding-right: 5.5rem !important; } .gt-xs\:py-24 { padding-top: 6rem !important; padding-bottom: 6rem !important; } .gt-xs\:px-24 { padding-left: 6rem !important; padding-right: 6rem !important; } .gt-xs\:py-26 { padding-top: 6.5rem !important; padding-bottom: 6.5rem !important; } .gt-xs\:px-26 { padding-left: 6.5rem !important; padding-right: 6.5rem !important; } .gt-xs\:py-28 { padding-top: 7rem !important; padding-bottom: 7rem !important; } .gt-xs\:px-28 { padding-left: 7rem !important; padding-right: 7rem !important; } .gt-xs\:py-30 { padding-top: 7.5rem !important; padding-bottom: 7.5rem !important; } .gt-xs\:px-30 { padding-left: 7.5rem !important; padding-right: 7.5rem !important; } .gt-xs\:py-32 { padding-top: 8rem !important; padding-bottom: 8rem !important; } .gt-xs\:px-32 { padding-left: 8rem !important; padding-right: 8rem !important; } .gt-xs\:py-36 { padding-top: 9rem !important; padding-bottom: 9rem !important; } .gt-xs\:px-36 { padding-left: 9rem !important; padding-right: 9rem !important; } .gt-xs\:py-40 { padding-top: 10rem !important; padding-bottom: 10rem !important; } .gt-xs\:px-40 { padding-left: 10rem !important; padding-right: 10rem !important; } .gt-xs\:py-48 { padding-top: 12rem !important; padding-bottom: 12rem !important; } .gt-xs\:px-48 { padding-left: 12rem !important; padding-right: 12rem !important; } .gt-xs\:py-56 { padding-top: 14rem !important; padding-bottom: 14rem !important; } .gt-xs\:px-56 { padding-left: 14rem !important; padding-right: 14rem !important; } .gt-xs\:py-64 { padding-top: 16rem !important; padding-bottom: 16rem !important; } .gt-xs\:px-64 { padding-left: 16rem !important; padding-right: 16rem !important; } .gt-xs\:py-px { padding-top: 1px !important; padding-bottom: 1px !important; } .gt-xs\:px-px { padding-left: 1px !important; padding-right: 1px !important; } .gt-xs\:py-2px { padding-top: 2px !important; padding-bottom: 2px !important; } .gt-xs\:px-2px { padding-left: 2px !important; padding-right: 2px !important; } .gt-xs\:pt-0 { padding-top: 0 !important; } .gt-xs\:pr-0 { padding-right: 0 !important; } .gt-xs\:pb-0 { padding-bottom: 0 !important; } .gt-xs\:pl-0 { padding-left: 0 !important; } .gt-xs\:pt-1 { padding-top: 0.25rem !important; } .gt-xs\:pr-1 { padding-right: 0.25rem !important; } .gt-xs\:pb-1 { padding-bottom: 0.25rem !important; } .gt-xs\:pl-1 { padding-left: 0.25rem !important; } .gt-xs\:pt-2 { padding-top: 0.5rem !important; } .gt-xs\:pr-2 { padding-right: 0.5rem !important; } .gt-xs\:pb-2 { padding-bottom: 0.5rem !important; } .gt-xs\:pl-2 { padding-left: 0.5rem !important; } .gt-xs\:pt-3 { padding-top: 0.75rem !important; } .gt-xs\:pr-3 { padding-right: 0.75rem !important; } .gt-xs\:pb-3 { padding-bottom: 0.75rem !important; } .gt-xs\:pl-3 { padding-left: 0.75rem !important; } .gt-xs\:pt-4 { padding-top: 1rem !important; } .gt-xs\:pr-4 { padding-right: 1rem !important; } .gt-xs\:pb-4 { padding-bottom: 1rem !important; } .gt-xs\:pl-4 { padding-left: 1rem !important; } .gt-xs\:pt-5 { padding-top: 1.25rem !important; } .gt-xs\:pr-5 { padding-right: 1.25rem !important; } .gt-xs\:pb-5 { padding-bottom: 1.25rem !important; } .gt-xs\:pl-5 { padding-left: 1.25rem !important; } .gt-xs\:pt-6 { padding-top: 1.5rem !important; } .gt-xs\:pr-6 { padding-right: 1.5rem !important; } .gt-xs\:pb-6 { padding-bottom: 1.5rem !important; } .gt-xs\:pl-6 { padding-left: 1.5rem !important; } .gt-xs\:pt-8 { padding-top: 2rem !important; } .gt-xs\:pr-8 { padding-right: 2rem !important; } .gt-xs\:pb-8 { padding-bottom: 2rem !important; } .gt-xs\:pl-8 { padding-left: 2rem !important; } .gt-xs\:pt-10 { padding-top: 2.5rem !important; } .gt-xs\:pr-10 { padding-right: 2.5rem !important; } .gt-xs\:pb-10 { padding-bottom: 2.5rem !important; } .gt-xs\:pl-10 { padding-left: 2.5rem !important; } .gt-xs\:pt-12 { padding-top: 3rem !important; } .gt-xs\:pr-12 { padding-right: 3rem !important; } .gt-xs\:pb-12 { padding-bottom: 3rem !important; } .gt-xs\:pl-12 { padding-left: 3rem !important; } .gt-xs\:pt-14 { padding-top: 3.5rem !important; } .gt-xs\:pr-14 { padding-right: 3.5rem !important; } .gt-xs\:pb-14 { padding-bottom: 3.5rem !important; } .gt-xs\:pl-14 { padding-left: 3.5rem !important; } .gt-xs\:pt-16 { padding-top: 4rem !important; } .gt-xs\:pr-16 { padding-right: 4rem !important; } .gt-xs\:pb-16 { padding-bottom: 4rem !important; } .gt-xs\:pl-16 { padding-left: 4rem !important; } .gt-xs\:pt-18 { padding-top: 4.5rem !important; } .gt-xs\:pr-18 { padding-right: 4.5rem !important; } .gt-xs\:pb-18 { padding-bottom: 4.5rem !important; } .gt-xs\:pl-18 { padding-left: 4.5rem !important; } .gt-xs\:pt-20 { padding-top: 5rem !important; } .gt-xs\:pr-20 { padding-right: 5rem !important; } .gt-xs\:pb-20 { padding-bottom: 5rem !important; } .gt-xs\:pl-20 { padding-left: 5rem !important; } .gt-xs\:pt-22 { padding-top: 5.5rem !important; } .gt-xs\:pr-22 { padding-right: 5.5rem !important; } .gt-xs\:pb-22 { padding-bottom: 5.5rem !important; } .gt-xs\:pl-22 { padding-left: 5.5rem !important; } .gt-xs\:pt-24 { padding-top: 6rem !important; } .gt-xs\:pr-24 { padding-right: 6rem !important; } .gt-xs\:pb-24 { padding-bottom: 6rem !important; } .gt-xs\:pl-24 { padding-left: 6rem !important; } .gt-xs\:pt-26 { padding-top: 6.5rem !important; } .gt-xs\:pr-26 { padding-right: 6.5rem !important; } .gt-xs\:pb-26 { padding-bottom: 6.5rem !important; } .gt-xs\:pl-26 { padding-left: 6.5rem !important; } .gt-xs\:pt-28 { padding-top: 7rem !important; } .gt-xs\:pr-28 { padding-right: 7rem !important; } .gt-xs\:pb-28 { padding-bottom: 7rem !important; } .gt-xs\:pl-28 { padding-left: 7rem !important; } .gt-xs\:pt-30 { padding-top: 7.5rem !important; } .gt-xs\:pr-30 { padding-right: 7.5rem !important; } .gt-xs\:pb-30 { padding-bottom: 7.5rem !important; } .gt-xs\:pl-30 { padding-left: 7.5rem !important; } .gt-xs\:pt-32 { padding-top: 8rem !important; } .gt-xs\:pr-32 { padding-right: 8rem !important; } .gt-xs\:pb-32 { padding-bottom: 8rem !important; } .gt-xs\:pl-32 { padding-left: 8rem !important; } .gt-xs\:pt-36 { padding-top: 9rem !important; } .gt-xs\:pr-36 { padding-right: 9rem !important; } .gt-xs\:pb-36 { padding-bottom: 9rem !important; } .gt-xs\:pl-36 { padding-left: 9rem !important; } .gt-xs\:pt-40 { padding-top: 10rem !important; } .gt-xs\:pr-40 { padding-right: 10rem !important; } .gt-xs\:pb-40 { padding-bottom: 10rem !important; } .gt-xs\:pl-40 { padding-left: 10rem !important; } .gt-xs\:pt-48 { padding-top: 12rem !important; } .gt-xs\:pr-48 { padding-right: 12rem !important; } .gt-xs\:pb-48 { padding-bottom: 12rem !important; } .gt-xs\:pl-48 { padding-left: 12rem !important; } .gt-xs\:pt-56 { padding-top: 14rem !important; } .gt-xs\:pr-56 { padding-right: 14rem !important; } .gt-xs\:pb-56 { padding-bottom: 14rem !important; } .gt-xs\:pl-56 { padding-left: 14rem !important; } .gt-xs\:pt-64 { padding-top: 16rem !important; } .gt-xs\:pr-64 { padding-right: 16rem !important; } .gt-xs\:pb-64 { padding-bottom: 16rem !important; } .gt-xs\:pl-64 { padding-left: 16rem !important; } .gt-xs\:pt-px { padding-top: 1px !important; } .gt-xs\:pr-px { padding-right: 1px !important; } .gt-xs\:pb-px { padding-bottom: 1px !important; } .gt-xs\:pl-px { padding-left: 1px !important; } .gt-xs\:pt-2px { padding-top: 2px !important; } .gt-xs\:pr-2px { padding-right: 2px !important; } .gt-xs\:pb-2px { padding-bottom: 2px !important; } .gt-xs\:pl-2px { padding-left: 2px !important; } .gt-xs\:placeholder-opacity-0::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .gt-xs\:placeholder-opacity-0::-moz-placeholder { --placeholder-opacity: 0 !important; } .gt-xs\:placeholder-opacity-0::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .gt-xs\:placeholder-opacity-0::placeholder { --placeholder-opacity: 0 !important; } .gt-xs\:placeholder-opacity-12::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .gt-xs\:placeholder-opacity-12::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .gt-xs\:placeholder-opacity-12::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .gt-xs\:placeholder-opacity-12::placeholder { --placeholder-opacity: 0.12 !important; } .gt-xs\:placeholder-opacity-25::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .gt-xs\:placeholder-opacity-25::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .gt-xs\:placeholder-opacity-25::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .gt-xs\:placeholder-opacity-25::placeholder { --placeholder-opacity: 0.25 !important; } .gt-xs\:placeholder-opacity-38::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .gt-xs\:placeholder-opacity-38::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .gt-xs\:placeholder-opacity-38::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .gt-xs\:placeholder-opacity-38::placeholder { --placeholder-opacity: 0.38 !important; } .gt-xs\:placeholder-opacity-50::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .gt-xs\:placeholder-opacity-50::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .gt-xs\:placeholder-opacity-50::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .gt-xs\:placeholder-opacity-50::placeholder { --placeholder-opacity: 0.5 !important; } .gt-xs\:placeholder-opacity-54::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .gt-xs\:placeholder-opacity-54::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .gt-xs\:placeholder-opacity-54::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .gt-xs\:placeholder-opacity-54::placeholder { --placeholder-opacity: 0.54 !important; } .gt-xs\:placeholder-opacity-70::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .gt-xs\:placeholder-opacity-70::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .gt-xs\:placeholder-opacity-70::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .gt-xs\:placeholder-opacity-70::placeholder { --placeholder-opacity: 0.70 !important; } .gt-xs\:placeholder-opacity-75::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .gt-xs\:placeholder-opacity-75::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .gt-xs\:placeholder-opacity-75::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .gt-xs\:placeholder-opacity-75::placeholder { --placeholder-opacity: 0.75 !important; } .gt-xs\:placeholder-opacity-84::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .gt-xs\:placeholder-opacity-84::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .gt-xs\:placeholder-opacity-84::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .gt-xs\:placeholder-opacity-84::placeholder { --placeholder-opacity: 0.84 !important; } .gt-xs\:placeholder-opacity-100::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .gt-xs\:placeholder-opacity-100::-moz-placeholder { --placeholder-opacity: 1 !important; } .gt-xs\:placeholder-opacity-100::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .gt-xs\:placeholder-opacity-100::placeholder { --placeholder-opacity: 1 !important; } .gt-xs\:focus\:placeholder-opacity-0:focus::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .gt-xs\:focus\:placeholder-opacity-0:focus::-moz-placeholder { --placeholder-opacity: 0 !important; } .gt-xs\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .gt-xs\:focus\:placeholder-opacity-0:focus::placeholder { --placeholder-opacity: 0 !important; } .gt-xs\:focus\:placeholder-opacity-12:focus::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .gt-xs\:focus\:placeholder-opacity-12:focus::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .gt-xs\:focus\:placeholder-opacity-12:focus::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .gt-xs\:focus\:placeholder-opacity-12:focus::placeholder { --placeholder-opacity: 0.12 !important; } .gt-xs\:focus\:placeholder-opacity-25:focus::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .gt-xs\:focus\:placeholder-opacity-25:focus::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .gt-xs\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .gt-xs\:focus\:placeholder-opacity-25:focus::placeholder { --placeholder-opacity: 0.25 !important; } .gt-xs\:focus\:placeholder-opacity-38:focus::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .gt-xs\:focus\:placeholder-opacity-38:focus::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .gt-xs\:focus\:placeholder-opacity-38:focus::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .gt-xs\:focus\:placeholder-opacity-38:focus::placeholder { --placeholder-opacity: 0.38 !important; } .gt-xs\:focus\:placeholder-opacity-50:focus::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .gt-xs\:focus\:placeholder-opacity-50:focus::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .gt-xs\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .gt-xs\:focus\:placeholder-opacity-50:focus::placeholder { --placeholder-opacity: 0.5 !important; } .gt-xs\:focus\:placeholder-opacity-54:focus::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .gt-xs\:focus\:placeholder-opacity-54:focus::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .gt-xs\:focus\:placeholder-opacity-54:focus::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .gt-xs\:focus\:placeholder-opacity-54:focus::placeholder { --placeholder-opacity: 0.54 !important; } .gt-xs\:focus\:placeholder-opacity-70:focus::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .gt-xs\:focus\:placeholder-opacity-70:focus::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .gt-xs\:focus\:placeholder-opacity-70:focus::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .gt-xs\:focus\:placeholder-opacity-70:focus::placeholder { --placeholder-opacity: 0.70 !important; } .gt-xs\:focus\:placeholder-opacity-75:focus::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .gt-xs\:focus\:placeholder-opacity-75:focus::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .gt-xs\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .gt-xs\:focus\:placeholder-opacity-75:focus::placeholder { --placeholder-opacity: 0.75 !important; } .gt-xs\:focus\:placeholder-opacity-84:focus::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .gt-xs\:focus\:placeholder-opacity-84:focus::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .gt-xs\:focus\:placeholder-opacity-84:focus::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .gt-xs\:focus\:placeholder-opacity-84:focus::placeholder { --placeholder-opacity: 0.84 !important; } .gt-xs\:focus\:placeholder-opacity-100:focus::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .gt-xs\:focus\:placeholder-opacity-100:focus::-moz-placeholder { --placeholder-opacity: 1 !important; } .gt-xs\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .gt-xs\:focus\:placeholder-opacity-100:focus::placeholder { --placeholder-opacity: 1 !important; } .gt-xs\:pointer-events-none { pointer-events: none !important; } .gt-xs\:pointer-events-auto { pointer-events: auto !important; } .gt-xs\:static { position: static !important; } .gt-xs\:fixed { position: fixed !important; } .gt-xs\:absolute { position: absolute !important; } .gt-xs\:relative { position: relative !important; } .gt-xs\:sticky { position: -webkit-sticky !important; position: sticky !important; } .gt-xs\:inset-0 { top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; } .gt-xs\:inset-auto { top: auto !important; right: auto !important; bottom: auto !important; left: auto !important; } .gt-xs\:inset-y-0 { top: 0 !important; bottom: 0 !important; } .gt-xs\:inset-x-0 { right: 0 !important; left: 0 !important; } .gt-xs\:inset-y-auto { top: auto !important; bottom: auto !important; } .gt-xs\:inset-x-auto { right: auto !important; left: auto !important; } .gt-xs\:top-0 { top: 0 !important; } .gt-xs\:right-0 { right: 0 !important; } .gt-xs\:bottom-0 { bottom: 0 !important; } .gt-xs\:left-0 { left: 0 !important; } .gt-xs\:top-auto { top: auto !important; } .gt-xs\:right-auto { right: auto !important; } .gt-xs\:bottom-auto { bottom: auto !important; } .gt-xs\:left-auto { left: auto !important; } .gt-xs\:shadow-xs { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .gt-xs\:shadow-sm { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .gt-xs\:shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .gt-xs\:shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .gt-xs\:shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .gt-xs\:shadow-xl { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .gt-xs\:shadow-2xl { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .gt-xs\:shadow-inner { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .gt-xs\:shadow-outline { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .gt-xs\:shadow-none { box-shadow: none !important; } .gt-xs\:shadow-solid { box-shadow: 0 0 0 2px currentColor !important; } .gt-xs\:hover\:shadow-xs:hover { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .gt-xs\:hover\:shadow-sm:hover { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .gt-xs\:hover\:shadow:hover { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .gt-xs\:hover\:shadow-md:hover { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .gt-xs\:hover\:shadow-lg:hover { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .gt-xs\:hover\:shadow-xl:hover { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .gt-xs\:hover\:shadow-2xl:hover { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .gt-xs\:hover\:shadow-inner:hover { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .gt-xs\:hover\:shadow-outline:hover { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .gt-xs\:hover\:shadow-none:hover { box-shadow: none !important; } .gt-xs\:hover\:shadow-solid:hover { box-shadow: 0 0 0 2px currentColor !important; } .gt-xs\:focus\:shadow-xs:focus { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .gt-xs\:focus\:shadow-sm:focus { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .gt-xs\:focus\:shadow:focus { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .gt-xs\:focus\:shadow-md:focus { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .gt-xs\:focus\:shadow-lg:focus { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .gt-xs\:focus\:shadow-xl:focus { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .gt-xs\:focus\:shadow-2xl:focus { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .gt-xs\:focus\:shadow-inner:focus { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .gt-xs\:focus\:shadow-outline:focus { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .gt-xs\:focus\:shadow-none:focus { box-shadow: none !important; } .gt-xs\:focus\:shadow-solid:focus { box-shadow: 0 0 0 2px currentColor !important; } .gt-xs\:fill-current { fill: currentColor !important; } .gt-xs\:stroke-current { stroke: currentColor !important; } .gt-xs\:stroke-0 { stroke-width: 0 !important; } .gt-xs\:stroke-1 { stroke-width: 1 !important; } .gt-xs\:stroke-2 { stroke-width: 2 !important; } .gt-xs\:table-auto { table-layout: auto !important; } .gt-xs\:table-fixed { table-layout: fixed !important; } .gt-xs\:text-left { text-align: left !important; } .gt-xs\:text-center { text-align: center !important; } .gt-xs\:text-right { text-align: right !important; } .gt-xs\:text-justify { text-align: justify !important; } .gt-xs\:text-opacity-0 { --text-opacity: 0 !important; } .gt-xs\:text-opacity-12 { --text-opacity: 0.12 !important; } .gt-xs\:text-opacity-25 { --text-opacity: 0.25 !important; } .gt-xs\:text-opacity-38 { --text-opacity: 0.38 !important; } .gt-xs\:text-opacity-50 { --text-opacity: 0.5 !important; } .gt-xs\:text-opacity-54 { --text-opacity: 0.54 !important; } .gt-xs\:text-opacity-70 { --text-opacity: 0.70 !important; } .gt-xs\:text-opacity-75 { --text-opacity: 0.75 !important; } .gt-xs\:text-opacity-84 { --text-opacity: 0.84 !important; } .gt-xs\:text-opacity-100 { --text-opacity: 1 !important; } .gt-xs\:hover\:text-opacity-0:hover { --text-opacity: 0 !important; } .gt-xs\:hover\:text-opacity-12:hover { --text-opacity: 0.12 !important; } .gt-xs\:hover\:text-opacity-25:hover { --text-opacity: 0.25 !important; } .gt-xs\:hover\:text-opacity-38:hover { --text-opacity: 0.38 !important; } .gt-xs\:hover\:text-opacity-50:hover { --text-opacity: 0.5 !important; } .gt-xs\:hover\:text-opacity-54:hover { --text-opacity: 0.54 !important; } .gt-xs\:hover\:text-opacity-70:hover { --text-opacity: 0.70 !important; } .gt-xs\:hover\:text-opacity-75:hover { --text-opacity: 0.75 !important; } .gt-xs\:hover\:text-opacity-84:hover { --text-opacity: 0.84 !important; } .gt-xs\:hover\:text-opacity-100:hover { --text-opacity: 1 !important; } .gt-xs\:focus\:text-opacity-0:focus { --text-opacity: 0 !important; } .gt-xs\:focus\:text-opacity-12:focus { --text-opacity: 0.12 !important; } .gt-xs\:focus\:text-opacity-25:focus { --text-opacity: 0.25 !important; } .gt-xs\:focus\:text-opacity-38:focus { --text-opacity: 0.38 !important; } .gt-xs\:focus\:text-opacity-50:focus { --text-opacity: 0.5 !important; } .gt-xs\:focus\:text-opacity-54:focus { --text-opacity: 0.54 !important; } .gt-xs\:focus\:text-opacity-70:focus { --text-opacity: 0.70 !important; } .gt-xs\:focus\:text-opacity-75:focus { --text-opacity: 0.75 !important; } .gt-xs\:focus\:text-opacity-84:focus { --text-opacity: 0.84 !important; } .gt-xs\:focus\:text-opacity-100:focus { --text-opacity: 1 !important; } .gt-xs\:italic { font-style: italic !important; } .gt-xs\:not-italic { font-style: normal !important; } .gt-xs\:uppercase { text-transform: uppercase !important; } .gt-xs\:lowercase { text-transform: lowercase !important; } .gt-xs\:capitalize { text-transform: capitalize !important; } .gt-xs\:normal-case { text-transform: none !important; } .gt-xs\:underline { text-decoration: underline !important; } .gt-xs\:line-through { text-decoration: line-through !important; } .gt-xs\:no-underline { text-decoration: none !important; } .gt-xs\:hover\:underline:hover { text-decoration: underline !important; } .gt-xs\:hover\:line-through:hover { text-decoration: line-through !important; } .gt-xs\:hover\:no-underline:hover { text-decoration: none !important; } .gt-xs\:focus\:underline:focus { text-decoration: underline !important; } .gt-xs\:focus\:line-through:focus { text-decoration: line-through !important; } .gt-xs\:focus\:no-underline:focus { text-decoration: none !important; } .gt-xs\:tracking-tighter { letter-spacing: -0.05em !important; } .gt-xs\:tracking-tight { letter-spacing: -0.025em !important; } .gt-xs\:tracking-normal { letter-spacing: 0 !important; } .gt-xs\:tracking-wide { letter-spacing: 0.025em !important; } .gt-xs\:tracking-wider { letter-spacing: 0.05em !important; } .gt-xs\:tracking-widest { letter-spacing: 0.1em !important; } .gt-xs\:select-none { -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important; } .gt-xs\:select-text { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } .gt-xs\:select-all { -webkit-user-select: all !important; -moz-user-select: all !important; -ms-user-select: all !important; user-select: all !important; } .gt-xs\:select-auto { -webkit-user-select: auto !important; -moz-user-select: auto !important; -ms-user-select: auto !important; user-select: auto !important; } .gt-xs\:align-baseline { vertical-align: baseline !important; } .gt-xs\:align-top { vertical-align: top !important; } .gt-xs\:align-middle { vertical-align: middle !important; } .gt-xs\:align-bottom { vertical-align: bottom !important; } .gt-xs\:align-text-top { vertical-align: text-top !important; } .gt-xs\:align-text-bottom { vertical-align: text-bottom !important; } .gt-xs\:visible { visibility: visible !important; } .gt-xs\:invisible { visibility: hidden !important; } .gt-xs\:whitespace-normal { white-space: normal !important; } .gt-xs\:whitespace-no-wrap { white-space: nowrap !important; } .gt-xs\:whitespace-pre { white-space: pre !important; } .gt-xs\:whitespace-pre-line { white-space: pre-line !important; } .gt-xs\:whitespace-pre-wrap { white-space: pre-wrap !important; } .gt-xs\:break-normal { overflow-wrap: normal !important; word-break: normal !important; } .gt-xs\:break-words { overflow-wrap: break-word !important; } .gt-xs\:break-all { word-break: break-all !important; } .gt-xs\:truncate { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } .gt-xs\:w-0 { width: 0 !important; } .gt-xs\:w-1 { width: 0.25rem !important; } .gt-xs\:w-2 { width: 0.5rem !important; } .gt-xs\:w-3 { width: 0.75rem !important; } .gt-xs\:w-4 { width: 1rem !important; } .gt-xs\:w-5 { width: 1.25rem !important; } .gt-xs\:w-6 { width: 1.5rem !important; } .gt-xs\:w-8 { width: 2rem !important; } .gt-xs\:w-10 { width: 2.5rem !important; } .gt-xs\:w-12 { width: 3rem !important; } .gt-xs\:w-14 { width: 3.5rem !important; } .gt-xs\:w-16 { width: 4rem !important; } .gt-xs\:w-18 { width: 4.5rem !important; } .gt-xs\:w-20 { width: 5rem !important; } .gt-xs\:w-22 { width: 5.5rem !important; } .gt-xs\:w-24 { width: 6rem !important; } .gt-xs\:w-26 { width: 6.5rem !important; } .gt-xs\:w-28 { width: 7rem !important; } .gt-xs\:w-30 { width: 7.5rem !important; } .gt-xs\:w-32 { width: 8rem !important; } .gt-xs\:w-36 { width: 9rem !important; } .gt-xs\:w-40 { width: 10rem !important; } .gt-xs\:w-48 { width: 12rem !important; } .gt-xs\:w-50 { width: 12.5rem !important; } .gt-xs\:w-56 { width: 14rem !important; } .gt-xs\:w-60 { width: 15rem !important; } .gt-xs\:w-64 { width: 16rem !important; } .gt-xs\:w-80 { width: 20rem !important; } .gt-xs\:w-90 { width: 24rem !important; } .gt-xs\:w-100 { width: 25rem !important; } .gt-xs\:w-120 { width: 30rem !important; } .gt-xs\:w-128 { width: 32rem !important; } .gt-xs\:w-140 { width: 35rem !important; } .gt-xs\:w-160 { width: 40rem !important; } .gt-xs\:w-180 { width: 45rem !important; } .gt-xs\:w-192 { width: 48rem !important; } .gt-xs\:w-200 { width: 50rem !important; } .gt-xs\:w-240 { width: 60rem !important; } .gt-xs\:w-256 { width: 64rem !important; } .gt-xs\:w-280 { width: 70rem !important; } .gt-xs\:w-320 { width: 80rem !important; } .gt-xs\:w-360 { width: 90rem !important; } .gt-xs\:w-400 { width: 100rem !important; } .gt-xs\:w-480 { width: 120rem !important; } .gt-xs\:w-auto { width: auto !important; } .gt-xs\:w-px { width: 1px !important; } .gt-xs\:w-2px { width: 2px !important; } .gt-xs\:w-1\/2 { width: 50% !important; } .gt-xs\:w-1\/3 { width: 33.33333% !important; } .gt-xs\:w-2\/3 { width: 66.66667% !important; } .gt-xs\:w-1\/4 { width: 25% !important; } .gt-xs\:w-2\/4 { width: 50% !important; } .gt-xs\:w-3\/4 { width: 75% !important; } .gt-xs\:w-1\/5 { width: 20% !important; } .gt-xs\:w-2\/5 { width: 40% !important; } .gt-xs\:w-3\/5 { width: 60% !important; } .gt-xs\:w-4\/5 { width: 80% !important; } .gt-xs\:w-1\/6 { width: 16.666667% !important; } .gt-xs\:w-2\/6 { width: 33.333333% !important; } .gt-xs\:w-3\/6 { width: 50% !important; } .gt-xs\:w-4\/6 { width: 66.666667% !important; } .gt-xs\:w-5\/6 { width: 83.333333% !important; } .gt-xs\:w-1\/12 { width: 8.33333% !important; } .gt-xs\:w-2\/12 { width: 16.66667% !important; } .gt-xs\:w-3\/12 { width: 25% !important; } .gt-xs\:w-4\/12 { width: 33.33333% !important; } .gt-xs\:w-5\/12 { width: 41.66667% !important; } .gt-xs\:w-6\/12 { width: 50% !important; } .gt-xs\:w-7\/12 { width: 58.33333% !important; } .gt-xs\:w-8\/12 { width: 66.66667% !important; } .gt-xs\:w-9\/12 { width: 75% !important; } .gt-xs\:w-10\/12 { width: 83.33333% !important; } .gt-xs\:w-11\/12 { width: 91.66667% !important; } .gt-xs\:w-full { width: 100% !important; } .gt-xs\:w-screen { width: 100vw !important; } .gt-xs\:z-0 { z-index: 0 !important; } .gt-xs\:z-10 { z-index: 10 !important; } .gt-xs\:z-20 { z-index: 20 !important; } .gt-xs\:z-30 { z-index: 30 !important; } .gt-xs\:z-40 { z-index: 40 !important; } .gt-xs\:z-50 { z-index: 50 !important; } .gt-xs\:z-60 { z-index: 60 !important; } .gt-xs\:z-70 { z-index: 70 !important; } .gt-xs\:z-80 { z-index: 80 !important; } .gt-xs\:z-90 { z-index: 90 !important; } .gt-xs\:z-99 { z-index: 99 !important; } .gt-xs\:z-999 { z-index: 999 !important; } .gt-xs\:z-9999 { z-index: 9999 !important; } .gt-xs\:z-99999 { z-index: 99999 !important; } .gt-xs\:z-auto { z-index: auto !important; } .gt-xs\:-z-1 { z-index: -1 !important; } .gt-xs\:gap-0 { grid-gap: 0 !important; gap: 0 !important; } .gt-xs\:gap-1 { grid-gap: 0.25rem !important; gap: 0.25rem !important; } .gt-xs\:gap-2 { grid-gap: 0.5rem !important; gap: 0.5rem !important; } .gt-xs\:gap-3 { grid-gap: 0.75rem !important; gap: 0.75rem !important; } .gt-xs\:gap-4 { grid-gap: 1rem !important; gap: 1rem !important; } .gt-xs\:gap-5 { grid-gap: 1.25rem !important; gap: 1.25rem !important; } .gt-xs\:gap-6 { grid-gap: 1.5rem !important; gap: 1.5rem !important; } .gt-xs\:gap-8 { grid-gap: 2rem !important; gap: 2rem !important; } .gt-xs\:gap-10 { grid-gap: 2.5rem !important; gap: 2.5rem !important; } .gt-xs\:gap-12 { grid-gap: 3rem !important; gap: 3rem !important; } .gt-xs\:gap-14 { grid-gap: 3.5rem !important; gap: 3.5rem !important; } .gt-xs\:gap-16 { grid-gap: 4rem !important; gap: 4rem !important; } .gt-xs\:gap-18 { grid-gap: 4.5rem !important; gap: 4.5rem !important; } .gt-xs\:gap-20 { grid-gap: 5rem !important; gap: 5rem !important; } .gt-xs\:gap-22 { grid-gap: 5.5rem !important; gap: 5.5rem !important; } .gt-xs\:gap-24 { grid-gap: 6rem !important; gap: 6rem !important; } .gt-xs\:gap-26 { grid-gap: 6.5rem !important; gap: 6.5rem !important; } .gt-xs\:gap-28 { grid-gap: 7rem !important; gap: 7rem !important; } .gt-xs\:gap-30 { grid-gap: 7.5rem !important; gap: 7.5rem !important; } .gt-xs\:gap-32 { grid-gap: 8rem !important; gap: 8rem !important; } .gt-xs\:gap-36 { grid-gap: 9rem !important; gap: 9rem !important; } .gt-xs\:gap-40 { grid-gap: 10rem !important; gap: 10rem !important; } .gt-xs\:gap-48 { grid-gap: 12rem !important; gap: 12rem !important; } .gt-xs\:gap-56 { grid-gap: 14rem !important; gap: 14rem !important; } .gt-xs\:gap-64 { grid-gap: 16rem !important; gap: 16rem !important; } .gt-xs\:gap-px { grid-gap: 1px !important; gap: 1px !important; } .gt-xs\:gap-2px { grid-gap: 2px !important; gap: 2px !important; } .gt-xs\:col-gap-0 { grid-column-gap: 0 !important; -moz-column-gap: 0 !important; column-gap: 0 !important; } .gt-xs\:col-gap-1 { grid-column-gap: 0.25rem !important; -moz-column-gap: 0.25rem !important; column-gap: 0.25rem !important; } .gt-xs\:col-gap-2 { grid-column-gap: 0.5rem !important; -moz-column-gap: 0.5rem !important; column-gap: 0.5rem !important; } .gt-xs\:col-gap-3 { grid-column-gap: 0.75rem !important; -moz-column-gap: 0.75rem !important; column-gap: 0.75rem !important; } .gt-xs\:col-gap-4 { grid-column-gap: 1rem !important; -moz-column-gap: 1rem !important; column-gap: 1rem !important; } .gt-xs\:col-gap-5 { grid-column-gap: 1.25rem !important; -moz-column-gap: 1.25rem !important; column-gap: 1.25rem !important; } .gt-xs\:col-gap-6 { grid-column-gap: 1.5rem !important; -moz-column-gap: 1.5rem !important; column-gap: 1.5rem !important; } .gt-xs\:col-gap-8 { grid-column-gap: 2rem !important; -moz-column-gap: 2rem !important; column-gap: 2rem !important; } .gt-xs\:col-gap-10 { grid-column-gap: 2.5rem !important; -moz-column-gap: 2.5rem !important; column-gap: 2.5rem !important; } .gt-xs\:col-gap-12 { grid-column-gap: 3rem !important; -moz-column-gap: 3rem !important; column-gap: 3rem !important; } .gt-xs\:col-gap-14 { grid-column-gap: 3.5rem !important; -moz-column-gap: 3.5rem !important; column-gap: 3.5rem !important; } .gt-xs\:col-gap-16 { grid-column-gap: 4rem !important; -moz-column-gap: 4rem !important; column-gap: 4rem !important; } .gt-xs\:col-gap-18 { grid-column-gap: 4.5rem !important; -moz-column-gap: 4.5rem !important; column-gap: 4.5rem !important; } .gt-xs\:col-gap-20 { grid-column-gap: 5rem !important; -moz-column-gap: 5rem !important; column-gap: 5rem !important; } .gt-xs\:col-gap-22 { grid-column-gap: 5.5rem !important; -moz-column-gap: 5.5rem !important; column-gap: 5.5rem !important; } .gt-xs\:col-gap-24 { grid-column-gap: 6rem !important; -moz-column-gap: 6rem !important; column-gap: 6rem !important; } .gt-xs\:col-gap-26 { grid-column-gap: 6.5rem !important; -moz-column-gap: 6.5rem !important; column-gap: 6.5rem !important; } .gt-xs\:col-gap-28 { grid-column-gap: 7rem !important; -moz-column-gap: 7rem !important; column-gap: 7rem !important; } .gt-xs\:col-gap-30 { grid-column-gap: 7.5rem !important; -moz-column-gap: 7.5rem !important; column-gap: 7.5rem !important; } .gt-xs\:col-gap-32 { grid-column-gap: 8rem !important; -moz-column-gap: 8rem !important; column-gap: 8rem !important; } .gt-xs\:col-gap-36 { grid-column-gap: 9rem !important; -moz-column-gap: 9rem !important; column-gap: 9rem !important; } .gt-xs\:col-gap-40 { grid-column-gap: 10rem !important; -moz-column-gap: 10rem !important; column-gap: 10rem !important; } .gt-xs\:col-gap-48 { grid-column-gap: 12rem !important; -moz-column-gap: 12rem !important; column-gap: 12rem !important; } .gt-xs\:col-gap-56 { grid-column-gap: 14rem !important; -moz-column-gap: 14rem !important; column-gap: 14rem !important; } .gt-xs\:col-gap-64 { grid-column-gap: 16rem !important; -moz-column-gap: 16rem !important; column-gap: 16rem !important; } .gt-xs\:col-gap-px { grid-column-gap: 1px !important; -moz-column-gap: 1px !important; column-gap: 1px !important; } .gt-xs\:col-gap-2px { grid-column-gap: 2px !important; -moz-column-gap: 2px !important; column-gap: 2px !important; } .gt-xs\:row-gap-0 { grid-row-gap: 0 !important; row-gap: 0 !important; } .gt-xs\:row-gap-1 { grid-row-gap: 0.25rem !important; row-gap: 0.25rem !important; } .gt-xs\:row-gap-2 { grid-row-gap: 0.5rem !important; row-gap: 0.5rem !important; } .gt-xs\:row-gap-3 { grid-row-gap: 0.75rem !important; row-gap: 0.75rem !important; } .gt-xs\:row-gap-4 { grid-row-gap: 1rem !important; row-gap: 1rem !important; } .gt-xs\:row-gap-5 { grid-row-gap: 1.25rem !important; row-gap: 1.25rem !important; } .gt-xs\:row-gap-6 { grid-row-gap: 1.5rem !important; row-gap: 1.5rem !important; } .gt-xs\:row-gap-8 { grid-row-gap: 2rem !important; row-gap: 2rem !important; } .gt-xs\:row-gap-10 { grid-row-gap: 2.5rem !important; row-gap: 2.5rem !important; } .gt-xs\:row-gap-12 { grid-row-gap: 3rem !important; row-gap: 3rem !important; } .gt-xs\:row-gap-14 { grid-row-gap: 3.5rem !important; row-gap: 3.5rem !important; } .gt-xs\:row-gap-16 { grid-row-gap: 4rem !important; row-gap: 4rem !important; } .gt-xs\:row-gap-18 { grid-row-gap: 4.5rem !important; row-gap: 4.5rem !important; } .gt-xs\:row-gap-20 { grid-row-gap: 5rem !important; row-gap: 5rem !important; } .gt-xs\:row-gap-22 { grid-row-gap: 5.5rem !important; row-gap: 5.5rem !important; } .gt-xs\:row-gap-24 { grid-row-gap: 6rem !important; row-gap: 6rem !important; } .gt-xs\:row-gap-26 { grid-row-gap: 6.5rem !important; row-gap: 6.5rem !important; } .gt-xs\:row-gap-28 { grid-row-gap: 7rem !important; row-gap: 7rem !important; } .gt-xs\:row-gap-30 { grid-row-gap: 7.5rem !important; row-gap: 7.5rem !important; } .gt-xs\:row-gap-32 { grid-row-gap: 8rem !important; row-gap: 8rem !important; } .gt-xs\:row-gap-36 { grid-row-gap: 9rem !important; row-gap: 9rem !important; } .gt-xs\:row-gap-40 { grid-row-gap: 10rem !important; row-gap: 10rem !important; } .gt-xs\:row-gap-48 { grid-row-gap: 12rem !important; row-gap: 12rem !important; } .gt-xs\:row-gap-56 { grid-row-gap: 14rem !important; row-gap: 14rem !important; } .gt-xs\:row-gap-64 { grid-row-gap: 16rem !important; row-gap: 16rem !important; } .gt-xs\:row-gap-px { grid-row-gap: 1px !important; row-gap: 1px !important; } .gt-xs\:row-gap-2px { grid-row-gap: 2px !important; row-gap: 2px !important; } .gt-xs\:grid-flow-row { grid-auto-flow: row !important; } .gt-xs\:grid-flow-col { grid-auto-flow: column !important; } .gt-xs\:grid-flow-row-dense { grid-auto-flow: row dense !important; } .gt-xs\:grid-flow-col-dense { grid-auto-flow: column dense !important; } .gt-xs\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; } .gt-xs\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } .gt-xs\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; } .gt-xs\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; } .gt-xs\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; } .gt-xs\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; } .gt-xs\:grid-cols-7 { grid-template-columns: repeat(7, minmax(0, 1fr)) !important; } .gt-xs\:grid-cols-8 { grid-template-columns: repeat(8, minmax(0, 1fr)) !important; } .gt-xs\:grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)) !important; } .gt-xs\:grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)) !important; } .gt-xs\:grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)) !important; } .gt-xs\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)) !important; } .gt-xs\:grid-cols-none { grid-template-columns: none !important; } .gt-xs\:col-auto { grid-column: auto !important; } .gt-xs\:col-span-1 { grid-column: span 1 / span 1 !important; } .gt-xs\:col-span-2 { grid-column: span 2 / span 2 !important; } .gt-xs\:col-span-3 { grid-column: span 3 / span 3 !important; } .gt-xs\:col-span-4 { grid-column: span 4 / span 4 !important; } .gt-xs\:col-span-5 { grid-column: span 5 / span 5 !important; } .gt-xs\:col-span-6 { grid-column: span 6 / span 6 !important; } .gt-xs\:col-span-7 { grid-column: span 7 / span 7 !important; } .gt-xs\:col-span-8 { grid-column: span 8 / span 8 !important; } .gt-xs\:col-span-9 { grid-column: span 9 / span 9 !important; } .gt-xs\:col-span-10 { grid-column: span 10 / span 10 !important; } .gt-xs\:col-span-11 { grid-column: span 11 / span 11 !important; } .gt-xs\:col-span-12 { grid-column: span 12 / span 12 !important; } .gt-xs\:col-start-1 { grid-column-start: 1 !important; } .gt-xs\:col-start-2 { grid-column-start: 2 !important; } .gt-xs\:col-start-3 { grid-column-start: 3 !important; } .gt-xs\:col-start-4 { grid-column-start: 4 !important; } .gt-xs\:col-start-5 { grid-column-start: 5 !important; } .gt-xs\:col-start-6 { grid-column-start: 6 !important; } .gt-xs\:col-start-7 { grid-column-start: 7 !important; } .gt-xs\:col-start-8 { grid-column-start: 8 !important; } .gt-xs\:col-start-9 { grid-column-start: 9 !important; } .gt-xs\:col-start-10 { grid-column-start: 10 !important; } .gt-xs\:col-start-11 { grid-column-start: 11 !important; } .gt-xs\:col-start-12 { grid-column-start: 12 !important; } .gt-xs\:col-start-13 { grid-column-start: 13 !important; } .gt-xs\:col-start-auto { grid-column-start: auto !important; } .gt-xs\:col-end-1 { grid-column-end: 1 !important; } .gt-xs\:col-end-2 { grid-column-end: 2 !important; } .gt-xs\:col-end-3 { grid-column-end: 3 !important; } .gt-xs\:col-end-4 { grid-column-end: 4 !important; } .gt-xs\:col-end-5 { grid-column-end: 5 !important; } .gt-xs\:col-end-6 { grid-column-end: 6 !important; } .gt-xs\:col-end-7 { grid-column-end: 7 !important; } .gt-xs\:col-end-8 { grid-column-end: 8 !important; } .gt-xs\:col-end-9 { grid-column-end: 9 !important; } .gt-xs\:col-end-10 { grid-column-end: 10 !important; } .gt-xs\:col-end-11 { grid-column-end: 11 !important; } .gt-xs\:col-end-12 { grid-column-end: 12 !important; } .gt-xs\:col-end-13 { grid-column-end: 13 !important; } .gt-xs\:col-end-auto { grid-column-end: auto !important; } .gt-xs\:grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)) !important; } .gt-xs\:grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)) !important; } .gt-xs\:grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)) !important; } .gt-xs\:grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)) !important; } .gt-xs\:grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)) !important; } .gt-xs\:grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)) !important; } .gt-xs\:grid-rows-none { grid-template-rows: none !important; } .gt-xs\:row-auto { grid-row: auto !important; } .gt-xs\:row-span-1 { grid-row: span 1 / span 1 !important; } .gt-xs\:row-span-2 { grid-row: span 2 / span 2 !important; } .gt-xs\:row-span-3 { grid-row: span 3 / span 3 !important; } .gt-xs\:row-span-4 { grid-row: span 4 / span 4 !important; } .gt-xs\:row-span-5 { grid-row: span 5 / span 5 !important; } .gt-xs\:row-span-6 { grid-row: span 6 / span 6 !important; } .gt-xs\:row-start-1 { grid-row-start: 1 !important; } .gt-xs\:row-start-2 { grid-row-start: 2 !important; } .gt-xs\:row-start-3 { grid-row-start: 3 !important; } .gt-xs\:row-start-4 { grid-row-start: 4 !important; } .gt-xs\:row-start-5 { grid-row-start: 5 !important; } .gt-xs\:row-start-6 { grid-row-start: 6 !important; } .gt-xs\:row-start-7 { grid-row-start: 7 !important; } .gt-xs\:row-start-auto { grid-row-start: auto !important; } .gt-xs\:row-end-1 { grid-row-end: 1 !important; } .gt-xs\:row-end-2 { grid-row-end: 2 !important; } .gt-xs\:row-end-3 { grid-row-end: 3 !important; } .gt-xs\:row-end-4 { grid-row-end: 4 !important; } .gt-xs\:row-end-5 { grid-row-end: 5 !important; } .gt-xs\:row-end-6 { grid-row-end: 6 !important; } .gt-xs\:row-end-7 { grid-row-end: 7 !important; } .gt-xs\:row-end-auto { grid-row-end: auto !important; } .gt-xs\:transform { --transform-translate-x: 0 !important; --transform-translate-y: 0 !important; --transform-rotate: 0 !important; --transform-skew-x: 0 !important; --transform-skew-y: 0 !important; --transform-scale-x: 1 !important; --transform-scale-y: 1 !important; transform: translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y)) !important; } .gt-xs\:transform-none { transform: none !important; } .gt-xs\:origin-center { transform-origin: center !important; } .gt-xs\:origin-top { transform-origin: top !important; } .gt-xs\:origin-top-right { transform-origin: top right !important; } .gt-xs\:origin-right { transform-origin: right !important; } .gt-xs\:origin-bottom-right { transform-origin: bottom right !important; } .gt-xs\:origin-bottom { transform-origin: bottom !important; } .gt-xs\:origin-bottom-left { transform-origin: bottom left !important; } .gt-xs\:origin-left { transform-origin: left !important; } .gt-xs\:origin-top-left { transform-origin: top left !important; } .gt-xs\:icon-size-12 { width: 12px !important; height: 12px !important; min-width: 12px !important; min-height: 12px !important; font-size: 12px !important; line-height: 12px !important; } .gt-xs\:icon-size-12 svg { width: 12px !important; height: 12px !important; } .gt-xs\:icon-size-14 { width: 14px !important; height: 14px !important; min-width: 14px !important; min-height: 14px !important; font-size: 14px !important; line-height: 14px !important; } .gt-xs\:icon-size-14 svg { width: 14px !important; height: 14px !important; } .gt-xs\:icon-size-16 { width: 16px !important; height: 16px !important; min-width: 16px !important; min-height: 16px !important; font-size: 16px !important; line-height: 16px !important; } .gt-xs\:icon-size-16 svg { width: 16px !important; height: 16px !important; } .gt-xs\:icon-size-18 { width: 18px !important; height: 18px !important; min-width: 18px !important; min-height: 18px !important; font-size: 18px !important; line-height: 18px !important; } .gt-xs\:icon-size-18 svg { width: 18px !important; height: 18px !important; } .gt-xs\:icon-size-20 { width: 20px !important; height: 20px !important; min-width: 20px !important; min-height: 20px !important; font-size: 20px !important; line-height: 20px !important; } .gt-xs\:icon-size-20 svg { width: 20px !important; height: 20px !important; } .gt-xs\:icon-size-24 { width: 24px !important; height: 24px !important; min-width: 24px !important; min-height: 24px !important; font-size: 24px !important; line-height: 24px !important; } .gt-xs\:icon-size-24 svg { width: 24px !important; height: 24px !important; } .gt-xs\:icon-size-32 { width: 32px !important; height: 32px !important; min-width: 32px !important; min-height: 32px !important; font-size: 32px !important; line-height: 32px !important; } .gt-xs\:icon-size-32 svg { width: 32px !important; height: 32px !important; } .gt-xs\:icon-size-40 { width: 40px !important; height: 40px !important; min-width: 40px !important; min-height: 40px !important; font-size: 40px !important; line-height: 40px !important; } .gt-xs\:icon-size-40 svg { width: 40px !important; height: 40px !important; } .gt-xs\:icon-size-48 { width: 48px !important; height: 48px !important; min-width: 48px !important; min-height: 48px !important; font-size: 48px !important; line-height: 48px !important; } .gt-xs\:icon-size-48 svg { width: 48px !important; height: 48px !important; } .gt-xs\:icon-size-56 { width: 56px !important; height: 56px !important; min-width: 56px !important; min-height: 56px !important; font-size: 56px !important; line-height: 56px !important; } .gt-xs\:icon-size-56 svg { width: 56px !important; height: 56px !important; } .gt-xs\:icon-size-64 { width: 64px !important; height: 64px !important; min-width: 64px !important; min-height: 64px !important; font-size: 64px !important; line-height: 64px !important; } .gt-xs\:icon-size-64 svg { width: 64px !important; height: 64px !important; } .gt-xs\:icon-size-72 { width: 72px !important; height: 72px !important; min-width: 72px !important; min-height: 72px !important; font-size: 72px !important; line-height: 72px !important; } .gt-xs\:icon-size-72 svg { width: 72px !important; height: 72px !important; } .gt-xs\:icon-size-80 { width: 80px !important; height: 80px !important; min-width: 80px !important; min-height: 80px !important; font-size: 80px !important; line-height: 80px !important; } .gt-xs\:icon-size-80 svg { width: 80px !important; height: 80px !important; } .gt-xs\:icon-size-88 { width: 88px !important; height: 88px !important; min-width: 88px !important; min-height: 88px !important; font-size: 88px !important; line-height: 88px !important; } .gt-xs\:icon-size-88 svg { width: 88px !important; height: 88px !important; } .gt-xs\:icon-size-96 { width: 96px !important; height: 96px !important; min-width: 96px !important; min-height: 96px !important; font-size: 96px !important; line-height: 96px !important; } .gt-xs\:icon-size-96 svg { width: 96px !important; height: 96px !important; } } @media (min-width: 960px) { .gt-sm\:space-y-0 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0px * var(--space-y-reverse)) !important; } .gt-sm\:space-x-0 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0px * var(--space-x-reverse)) !important; margin-left: calc(0px * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.25rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.25rem * var(--space-x-reverse)) !important; margin-left: calc(0.25rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.5rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.5rem * var(--space-x-reverse)) !important; margin-left: calc(0.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.75rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.75rem * var(--space-x-reverse)) !important; margin-left: calc(0.75rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1rem * var(--space-x-reverse)) !important; margin-left: calc(1rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.25rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.25rem * var(--space-x-reverse)) !important; margin-left: calc(1.25rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.5rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.5rem * var(--space-x-reverse)) !important; margin-left: calc(1.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2rem * var(--space-x-reverse)) !important; margin-left: calc(2rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2.5rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2.5rem * var(--space-x-reverse)) !important; margin-left: calc(2.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3rem * var(--space-x-reverse)) !important; margin-left: calc(3rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3.5rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3.5rem * var(--space-x-reverse)) !important; margin-left: calc(3.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4rem * var(--space-x-reverse)) !important; margin-left: calc(4rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4.5rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4.5rem * var(--space-x-reverse)) !important; margin-left: calc(4.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5rem * var(--space-x-reverse)) !important; margin-left: calc(5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5.5rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5.5rem * var(--space-x-reverse)) !important; margin-left: calc(5.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6rem * var(--space-x-reverse)) !important; margin-left: calc(6rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6.5rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6.5rem * var(--space-x-reverse)) !important; margin-left: calc(6.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7rem * var(--space-x-reverse)) !important; margin-left: calc(7rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7.5rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7.5rem * var(--space-x-reverse)) !important; margin-left: calc(7.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(8rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(8rem * var(--space-x-reverse)) !important; margin-left: calc(8rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(9rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(9rem * var(--space-x-reverse)) !important; margin-left: calc(9rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(10rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(10rem * var(--space-x-reverse)) !important; margin-left: calc(10rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(12rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(12rem * var(--space-x-reverse)) !important; margin-left: calc(12rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(14rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(14rem * var(--space-x-reverse)) !important; margin-left: calc(14rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(16rem * var(--space-y-reverse)) !important; } .gt-sm\:space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(16rem * var(--space-x-reverse)) !important; margin-left: calc(16rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1px * var(--space-y-reverse)) !important; } .gt-sm\:space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1px * var(--space-x-reverse)) !important; margin-left: calc(1px * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2px * var(--space-y-reverse)) !important; } .gt-sm\:space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2px * var(--space-x-reverse)) !important; margin-left: calc(2px * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.25rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.25rem * var(--space-x-reverse)) !important; margin-left: calc(-0.25rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.5rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.5rem * var(--space-x-reverse)) !important; margin-left: calc(-0.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.75rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.75rem * var(--space-x-reverse)) !important; margin-left: calc(-0.75rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1rem * var(--space-x-reverse)) !important; margin-left: calc(-1rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.25rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.25rem * var(--space-x-reverse)) !important; margin-left: calc(-1.25rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.5rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.5rem * var(--space-x-reverse)) !important; margin-left: calc(-1.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2rem * var(--space-x-reverse)) !important; margin-left: calc(-2rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2.5rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2.5rem * var(--space-x-reverse)) !important; margin-left: calc(-2.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3rem * var(--space-x-reverse)) !important; margin-left: calc(-3rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3.5rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3.5rem * var(--space-x-reverse)) !important; margin-left: calc(-3.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4rem * var(--space-x-reverse)) !important; margin-left: calc(-4rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4.5rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4.5rem * var(--space-x-reverse)) !important; margin-left: calc(-4.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5rem * var(--space-x-reverse)) !important; margin-left: calc(-5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5.5rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5.5rem * var(--space-x-reverse)) !important; margin-left: calc(-5.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6rem * var(--space-x-reverse)) !important; margin-left: calc(-6rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6.5rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6.5rem * var(--space-x-reverse)) !important; margin-left: calc(-6.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7rem * var(--space-x-reverse)) !important; margin-left: calc(-7rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7.5rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7.5rem * var(--space-x-reverse)) !important; margin-left: calc(-7.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-8rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-8rem * var(--space-x-reverse)) !important; margin-left: calc(-8rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-9rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-9rem * var(--space-x-reverse)) !important; margin-left: calc(-9rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-10rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-10rem * var(--space-x-reverse)) !important; margin-left: calc(-10rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-12rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-12rem * var(--space-x-reverse)) !important; margin-left: calc(-12rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-14rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-14rem * var(--space-x-reverse)) !important; margin-left: calc(-14rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-16rem * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-16rem * var(--space-x-reverse)) !important; margin-left: calc(-16rem * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1px * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1px * var(--space-x-reverse)) !important; margin-left: calc(-1px * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:-space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2px * var(--space-y-reverse)) !important; } .gt-sm\:-space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2px * var(--space-x-reverse)) !important; margin-left: calc(-2px * calc(1 - var(--space-x-reverse))) !important; } .gt-sm\:space-y-reverse > :not(template) ~ :not(template) { --space-y-reverse: 1 !important; } .gt-sm\:space-x-reverse > :not(template) ~ :not(template) { --space-x-reverse: 1 !important; } .gt-sm\:divide-y-0 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(0px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(0px * var(--divide-y-reverse)) !important; } .gt-sm\:divide-x-0 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(0px * var(--divide-x-reverse)) !important; border-left-width: calc(0px * calc(1 - var(--divide-x-reverse))) !important; } .gt-sm\:divide-y-2 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(2px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(2px * var(--divide-y-reverse)) !important; } .gt-sm\:divide-x-2 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(2px * var(--divide-x-reverse)) !important; border-left-width: calc(2px * calc(1 - var(--divide-x-reverse))) !important; } .gt-sm\:divide-y-4 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(4px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(4px * var(--divide-y-reverse)) !important; } .gt-sm\:divide-x-4 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(4px * var(--divide-x-reverse)) !important; border-left-width: calc(4px * calc(1 - var(--divide-x-reverse))) !important; } .gt-sm\:divide-y-8 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(8px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(8px * var(--divide-y-reverse)) !important; } .gt-sm\:divide-x-8 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(8px * var(--divide-x-reverse)) !important; border-left-width: calc(8px * calc(1 - var(--divide-x-reverse))) !important; } .gt-sm\:divide-y > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(1px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(1px * var(--divide-y-reverse)) !important; } .gt-sm\:divide-x > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(1px * var(--divide-x-reverse)) !important; border-left-width: calc(1px * calc(1 - var(--divide-x-reverse))) !important; } .gt-sm\:divide-y-reverse > :not(template) ~ :not(template) { --divide-y-reverse: 1 !important; } .gt-sm\:divide-x-reverse > :not(template) ~ :not(template) { --divide-x-reverse: 1 !important; } .gt-sm\:divide-current > :not(template) ~ :not(template) { border-color: currentColor !important; } .gt-sm\:divide-transparent > :not(template) ~ :not(template) { border-color: transparent !important; } .gt-sm\:divide-white > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFFFFF !important; border-color: rgba(255, 255, 255, var(--divide-opacity)) !important; } .gt-sm\:divide-black > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #000000 !important; border-color: rgba(0, 0, 0, var(--divide-opacity)) !important; } .gt-sm\:divide-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F9FAFB !important; border-color: rgba(249, 250, 251, var(--divide-opacity)) !important; } .gt-sm\:divide-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F4F5F7 !important; border-color: rgba(244, 245, 247, var(--divide-opacity)) !important; } .gt-sm\:divide-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5E7EB !important; border-color: rgba(229, 231, 235, var(--divide-opacity)) !important; } .gt-sm\:divide-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D2D6DC !important; border-color: rgba(210, 214, 220, var(--divide-opacity)) !important; } .gt-sm\:divide-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9FA6B2 !important; border-color: rgba(159, 166, 178, var(--divide-opacity)) !important; } .gt-sm\:divide-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .gt-sm\:divide-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4B5563 !important; border-color: rgba(75, 85, 99, var(--divide-opacity)) !important; } .gt-sm\:divide-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #374151 !important; border-color: rgba(55, 65, 81, var(--divide-opacity)) !important; } .gt-sm\:divide-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #252F3F !important; border-color: rgba(37, 47, 63, var(--divide-opacity)) !important; } .gt-sm\:divide-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #161E2E !important; border-color: rgba(22, 30, 46, var(--divide-opacity)) !important; } .gt-sm\:divide-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .gt-sm\:divide-cool-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBFDFE !important; border-color: rgba(251, 253, 254, var(--divide-opacity)) !important; } .gt-sm\:divide-cool-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F1F5F9 !important; border-color: rgba(241, 245, 249, var(--divide-opacity)) !important; } .gt-sm\:divide-cool-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E2E8F0 !important; border-color: rgba(226, 232, 240, var(--divide-opacity)) !important; } .gt-sm\:divide-cool-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CFD8E3 !important; border-color: rgba(207, 216, 227, var(--divide-opacity)) !important; } .gt-sm\:divide-cool-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #97A6BA !important; border-color: rgba(151, 166, 186, var(--divide-opacity)) !important; } .gt-sm\:divide-cool-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .gt-sm\:divide-cool-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #475569 !important; border-color: rgba(71, 85, 105, var(--divide-opacity)) !important; } .gt-sm\:divide-cool-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #364152 !important; border-color: rgba(54, 65, 82, var(--divide-opacity)) !important; } .gt-sm\:divide-cool-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #27303F !important; border-color: rgba(39, 48, 63, var(--divide-opacity)) !important; } .gt-sm\:divide-cool-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A202E !important; border-color: rgba(26, 32, 46, var(--divide-opacity)) !important; } .gt-sm\:divide-cool-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .gt-sm\:divide-red-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F2 !important; border-color: rgba(253, 242, 242, var(--divide-opacity)) !important; } .gt-sm\:divide-red-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDE8E8 !important; border-color: rgba(253, 232, 232, var(--divide-opacity)) !important; } .gt-sm\:divide-red-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBD5D5 !important; border-color: rgba(251, 213, 213, var(--divide-opacity)) !important; } .gt-sm\:divide-red-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4B4 !important; border-color: rgba(248, 180, 180, var(--divide-opacity)) !important; } .gt-sm\:divide-red-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F98080 !important; border-color: rgba(249, 128, 128, var(--divide-opacity)) !important; } .gt-sm\:divide-red-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .gt-sm\:divide-red-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E02424 !important; border-color: rgba(224, 36, 36, var(--divide-opacity)) !important; } .gt-sm\:divide-red-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C81E1E !important; border-color: rgba(200, 30, 30, var(--divide-opacity)) !important; } .gt-sm\:divide-red-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9B1C1C !important; border-color: rgba(155, 28, 28, var(--divide-opacity)) !important; } .gt-sm\:divide-red-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .gt-sm\:divide-red > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .gt-sm\:divide-orange-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFF8F1 !important; border-color: rgba(255, 248, 241, var(--divide-opacity)) !important; } .gt-sm\:divide-orange-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FEECDC !important; border-color: rgba(254, 236, 220, var(--divide-opacity)) !important; } .gt-sm\:divide-orange-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCD9BD !important; border-color: rgba(252, 217, 189, var(--divide-opacity)) !important; } .gt-sm\:divide-orange-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDBA8C !important; border-color: rgba(253, 186, 140, var(--divide-opacity)) !important; } .gt-sm\:divide-orange-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF8A4C !important; border-color: rgba(255, 138, 76, var(--divide-opacity)) !important; } .gt-sm\:divide-orange-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .gt-sm\:divide-orange-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D03801 !important; border-color: rgba(208, 56, 1, var(--divide-opacity)) !important; } .gt-sm\:divide-orange-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B43403 !important; border-color: rgba(180, 52, 3, var(--divide-opacity)) !important; } .gt-sm\:divide-orange-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8A2C0D !important; border-color: rgba(138, 44, 13, var(--divide-opacity)) !important; } .gt-sm\:divide-orange-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .gt-sm\:divide-orange > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .gt-sm\:divide-yellow-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDFDEA !important; border-color: rgba(253, 253, 234, var(--divide-opacity)) !important; } .gt-sm\:divide-yellow-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF6B2 !important; border-color: rgba(253, 246, 178, var(--divide-opacity)) !important; } .gt-sm\:divide-yellow-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE96A !important; border-color: rgba(252, 233, 106, var(--divide-opacity)) !important; } .gt-sm\:divide-yellow-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FACA15 !important; border-color: rgba(250, 202, 21, var(--divide-opacity)) !important; } .gt-sm\:divide-yellow-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E3A008 !important; border-color: rgba(227, 160, 8, var(--divide-opacity)) !important; } .gt-sm\:divide-yellow-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .gt-sm\:divide-yellow-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9F580A !important; border-color: rgba(159, 88, 10, var(--divide-opacity)) !important; } .gt-sm\:divide-yellow-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8E4B10 !important; border-color: rgba(142, 75, 16, var(--divide-opacity)) !important; } .gt-sm\:divide-yellow-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #723B13 !important; border-color: rgba(114, 59, 19, var(--divide-opacity)) !important; } .gt-sm\:divide-yellow-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #633112 !important; border-color: rgba(99, 49, 18, var(--divide-opacity)) !important; } .gt-sm\:divide-yellow > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .gt-sm\:divide-green-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F3FAF7 !important; border-color: rgba(243, 250, 247, var(--divide-opacity)) !important; } .gt-sm\:divide-green-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DEF7EC !important; border-color: rgba(222, 247, 236, var(--divide-opacity)) !important; } .gt-sm\:divide-green-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BCF0DA !important; border-color: rgba(188, 240, 218, var(--divide-opacity)) !important; } .gt-sm\:divide-green-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #84E1BC !important; border-color: rgba(132, 225, 188, var(--divide-opacity)) !important; } .gt-sm\:divide-green-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #31C48D !important; border-color: rgba(49, 196, 141, var(--divide-opacity)) !important; } .gt-sm\:divide-green-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .gt-sm\:divide-green-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #057A55 !important; border-color: rgba(5, 122, 85, var(--divide-opacity)) !important; } .gt-sm\:divide-green-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #046C4E !important; border-color: rgba(4, 108, 78, var(--divide-opacity)) !important; } .gt-sm\:divide-green-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #03543F !important; border-color: rgba(3, 84, 63, var(--divide-opacity)) !important; } .gt-sm\:divide-green-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014737 !important; border-color: rgba(1, 71, 55, var(--divide-opacity)) !important; } .gt-sm\:divide-green > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .gt-sm\:divide-teal-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDFAFA !important; border-color: rgba(237, 250, 250, var(--divide-opacity)) !important; } .gt-sm\:divide-teal-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D5F5F6 !important; border-color: rgba(213, 245, 246, var(--divide-opacity)) !important; } .gt-sm\:divide-teal-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AFECEF !important; border-color: rgba(175, 236, 239, var(--divide-opacity)) !important; } .gt-sm\:divide-teal-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7EDCE2 !important; border-color: rgba(126, 220, 226, var(--divide-opacity)) !important; } .gt-sm\:divide-teal-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #16BDCA !important; border-color: rgba(22, 189, 202, var(--divide-opacity)) !important; } .gt-sm\:divide-teal-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .gt-sm\:divide-teal-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #047481 !important; border-color: rgba(4, 116, 129, var(--divide-opacity)) !important; } .gt-sm\:divide-teal-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #036672 !important; border-color: rgba(3, 102, 114, var(--divide-opacity)) !important; } .gt-sm\:divide-teal-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #05505C !important; border-color: rgba(5, 80, 92, var(--divide-opacity)) !important; } .gt-sm\:divide-teal-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014451 !important; border-color: rgba(1, 68, 81, var(--divide-opacity)) !important; } .gt-sm\:divide-teal > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .gt-sm\:divide-blue-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EBF5FF !important; border-color: rgba(235, 245, 255, var(--divide-opacity)) !important; } .gt-sm\:divide-blue-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E1EFFE !important; border-color: rgba(225, 239, 254, var(--divide-opacity)) !important; } .gt-sm\:divide-blue-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C3DDFD !important; border-color: rgba(195, 221, 253, var(--divide-opacity)) !important; } .gt-sm\:divide-blue-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #A4CAFE !important; border-color: rgba(164, 202, 254, var(--divide-opacity)) !important; } .gt-sm\:divide-blue-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #76A9FA !important; border-color: rgba(118, 169, 250, var(--divide-opacity)) !important; } .gt-sm\:divide-blue-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .gt-sm\:divide-blue-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1C64F2 !important; border-color: rgba(28, 100, 242, var(--divide-opacity)) !important; } .gt-sm\:divide-blue-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A56DB !important; border-color: rgba(26, 86, 219, var(--divide-opacity)) !important; } .gt-sm\:divide-blue-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1E429F !important; border-color: rgba(30, 66, 159, var(--divide-opacity)) !important; } .gt-sm\:divide-blue-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #233876 !important; border-color: rgba(35, 56, 118, var(--divide-opacity)) !important; } .gt-sm\:divide-blue > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .gt-sm\:divide-indigo-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F0F5FF !important; border-color: rgba(240, 245, 255, var(--divide-opacity)) !important; } .gt-sm\:divide-indigo-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5EDFF !important; border-color: rgba(229, 237, 255, var(--divide-opacity)) !important; } .gt-sm\:divide-indigo-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CDDBFE !important; border-color: rgba(205, 219, 254, var(--divide-opacity)) !important; } .gt-sm\:divide-indigo-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B4C6FC !important; border-color: rgba(180, 198, 252, var(--divide-opacity)) !important; } .gt-sm\:divide-indigo-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8DA2FB !important; border-color: rgba(141, 162, 251, var(--divide-opacity)) !important; } .gt-sm\:divide-indigo-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .gt-sm\:divide-indigo-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5850EC !important; border-color: rgba(88, 80, 236, var(--divide-opacity)) !important; } .gt-sm\:divide-indigo-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5145CD !important; border-color: rgba(81, 69, 205, var(--divide-opacity)) !important; } .gt-sm\:divide-indigo-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #42389D !important; border-color: rgba(66, 56, 157, var(--divide-opacity)) !important; } .gt-sm\:divide-indigo-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #362F78 !important; border-color: rgba(54, 47, 120, var(--divide-opacity)) !important; } .gt-sm\:divide-indigo > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .gt-sm\:divide-purple-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F6F5FF !important; border-color: rgba(246, 245, 255, var(--divide-opacity)) !important; } .gt-sm\:divide-purple-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDEBFE !important; border-color: rgba(237, 235, 254, var(--divide-opacity)) !important; } .gt-sm\:divide-purple-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DCD7FE !important; border-color: rgba(220, 215, 254, var(--divide-opacity)) !important; } .gt-sm\:divide-purple-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CABFFD !important; border-color: rgba(202, 191, 253, var(--divide-opacity)) !important; } .gt-sm\:divide-purple-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AC94FA !important; border-color: rgba(172, 148, 250, var(--divide-opacity)) !important; } .gt-sm\:divide-purple-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .gt-sm\:divide-purple-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7E3AF2 !important; border-color: rgba(126, 58, 242, var(--divide-opacity)) !important; } .gt-sm\:divide-purple-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6C2BD9 !important; border-color: rgba(108, 43, 217, var(--divide-opacity)) !important; } .gt-sm\:divide-purple-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5521B5 !important; border-color: rgba(85, 33, 181, var(--divide-opacity)) !important; } .gt-sm\:divide-purple-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4A1D96 !important; border-color: rgba(74, 29, 150, var(--divide-opacity)) !important; } .gt-sm\:divide-purple > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .gt-sm\:divide-pink-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F8 !important; border-color: rgba(253, 242, 248, var(--divide-opacity)) !important; } .gt-sm\:divide-pink-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE8F3 !important; border-color: rgba(252, 232, 243, var(--divide-opacity)) !important; } .gt-sm\:divide-pink-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FAD1E8 !important; border-color: rgba(250, 209, 232, var(--divide-opacity)) !important; } .gt-sm\:divide-pink-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4D9 !important; border-color: rgba(248, 180, 217, var(--divide-opacity)) !important; } .gt-sm\:divide-pink-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F17EB8 !important; border-color: rgba(241, 126, 184, var(--divide-opacity)) !important; } .gt-sm\:divide-pink-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .gt-sm\:divide-pink-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D61F69 !important; border-color: rgba(214, 31, 105, var(--divide-opacity)) !important; } .gt-sm\:divide-pink-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BF125D !important; border-color: rgba(191, 18, 93, var(--divide-opacity)) !important; } .gt-sm\:divide-pink-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #99154B !important; border-color: rgba(153, 21, 75, var(--divide-opacity)) !important; } .gt-sm\:divide-pink-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #751A3D !important; border-color: rgba(117, 26, 61, var(--divide-opacity)) !important; } .gt-sm\:divide-pink > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .gt-sm\:divide-opacity-0 > :not(template) ~ :not(template) { --divide-opacity: 0 !important; } .gt-sm\:divide-opacity-12 > :not(template) ~ :not(template) { --divide-opacity: 0.12 !important; } .gt-sm\:divide-opacity-25 > :not(template) ~ :not(template) { --divide-opacity: 0.25 !important; } .gt-sm\:divide-opacity-38 > :not(template) ~ :not(template) { --divide-opacity: 0.38 !important; } .gt-sm\:divide-opacity-50 > :not(template) ~ :not(template) { --divide-opacity: 0.5 !important; } .gt-sm\:divide-opacity-54 > :not(template) ~ :not(template) { --divide-opacity: 0.54 !important; } .gt-sm\:divide-opacity-70 > :not(template) ~ :not(template) { --divide-opacity: 0.70 !important; } .gt-sm\:divide-opacity-75 > :not(template) ~ :not(template) { --divide-opacity: 0.75 !important; } .gt-sm\:divide-opacity-84 > :not(template) ~ :not(template) { --divide-opacity: 0.84 !important; } .gt-sm\:divide-opacity-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; } .gt-sm\:sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .gt-sm\:not-sr-only { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .gt-sm\:focus\:sr-only:focus { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .gt-sm\:focus\:not-sr-only:focus { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .gt-sm\:appearance-none { -webkit-appearance: none !important; -moz-appearance: none !important; appearance: none !important; } .gt-sm\:bg-fixed { background-attachment: fixed !important; } .gt-sm\:bg-local { background-attachment: local !important; } .gt-sm\:bg-scroll { background-attachment: scroll !important; } .gt-sm\:bg-opacity-0 { --bg-opacity: 0 !important; } .gt-sm\:bg-opacity-12 { --bg-opacity: 0.12 !important; } .gt-sm\:bg-opacity-25 { --bg-opacity: 0.25 !important; } .gt-sm\:bg-opacity-38 { --bg-opacity: 0.38 !important; } .gt-sm\:bg-opacity-50 { --bg-opacity: 0.5 !important; } .gt-sm\:bg-opacity-54 { --bg-opacity: 0.54 !important; } .gt-sm\:bg-opacity-70 { --bg-opacity: 0.70 !important; } .gt-sm\:bg-opacity-75 { --bg-opacity: 0.75 !important; } .gt-sm\:bg-opacity-84 { --bg-opacity: 0.84 !important; } .gt-sm\:bg-opacity-100 { --bg-opacity: 1 !important; } .gt-sm\:hover\:bg-opacity-0:hover { --bg-opacity: 0 !important; } .gt-sm\:hover\:bg-opacity-12:hover { --bg-opacity: 0.12 !important; } .gt-sm\:hover\:bg-opacity-25:hover { --bg-opacity: 0.25 !important; } .gt-sm\:hover\:bg-opacity-38:hover { --bg-opacity: 0.38 !important; } .gt-sm\:hover\:bg-opacity-50:hover { --bg-opacity: 0.5 !important; } .gt-sm\:hover\:bg-opacity-54:hover { --bg-opacity: 0.54 !important; } .gt-sm\:hover\:bg-opacity-70:hover { --bg-opacity: 0.70 !important; } .gt-sm\:hover\:bg-opacity-75:hover { --bg-opacity: 0.75 !important; } .gt-sm\:hover\:bg-opacity-84:hover { --bg-opacity: 0.84 !important; } .gt-sm\:hover\:bg-opacity-100:hover { --bg-opacity: 1 !important; } .gt-sm\:focus\:bg-opacity-0:focus { --bg-opacity: 0 !important; } .gt-sm\:focus\:bg-opacity-12:focus { --bg-opacity: 0.12 !important; } .gt-sm\:focus\:bg-opacity-25:focus { --bg-opacity: 0.25 !important; } .gt-sm\:focus\:bg-opacity-38:focus { --bg-opacity: 0.38 !important; } .gt-sm\:focus\:bg-opacity-50:focus { --bg-opacity: 0.5 !important; } .gt-sm\:focus\:bg-opacity-54:focus { --bg-opacity: 0.54 !important; } .gt-sm\:focus\:bg-opacity-70:focus { --bg-opacity: 0.70 !important; } .gt-sm\:focus\:bg-opacity-75:focus { --bg-opacity: 0.75 !important; } .gt-sm\:focus\:bg-opacity-84:focus { --bg-opacity: 0.84 !important; } .gt-sm\:focus\:bg-opacity-100:focus { --bg-opacity: 1 !important; } .gt-sm\:bg-bottom { background-position: bottom !important; } .gt-sm\:bg-center { background-position: center !important; } .gt-sm\:bg-left { background-position: left !important; } .gt-sm\:bg-left-bottom { background-position: left bottom !important; } .gt-sm\:bg-left-top { background-position: left top !important; } .gt-sm\:bg-right { background-position: right !important; } .gt-sm\:bg-right-bottom { background-position: right bottom !important; } .gt-sm\:bg-right-top { background-position: right top !important; } .gt-sm\:bg-top { background-position: top !important; } .gt-sm\:bg-repeat { background-repeat: repeat !important; } .gt-sm\:bg-no-repeat { background-repeat: no-repeat !important; } .gt-sm\:bg-repeat-x { background-repeat: repeat-x !important; } .gt-sm\:bg-repeat-y { background-repeat: repeat-y !important; } .gt-sm\:bg-repeat-round { background-repeat: round !important; } .gt-sm\:bg-repeat-space { background-repeat: space !important; } .gt-sm\:bg-auto { background-size: auto !important; } .gt-sm\:bg-cover { background-size: cover !important; } .gt-sm\:bg-contain { background-size: contain !important; } .gt-sm\:border-collapse { border-collapse: collapse !important; } .gt-sm\:border-separate { border-collapse: separate !important; } .gt-sm\:border-opacity-0 { --border-opacity: 0 !important; } .gt-sm\:border-opacity-12 { --border-opacity: 0.12 !important; } .gt-sm\:border-opacity-25 { --border-opacity: 0.25 !important; } .gt-sm\:border-opacity-38 { --border-opacity: 0.38 !important; } .gt-sm\:border-opacity-50 { --border-opacity: 0.5 !important; } .gt-sm\:border-opacity-54 { --border-opacity: 0.54 !important; } .gt-sm\:border-opacity-70 { --border-opacity: 0.70 !important; } .gt-sm\:border-opacity-75 { --border-opacity: 0.75 !important; } .gt-sm\:border-opacity-84 { --border-opacity: 0.84 !important; } .gt-sm\:border-opacity-100 { --border-opacity: 1 !important; } .gt-sm\:hover\:border-opacity-0:hover { --border-opacity: 0 !important; } .gt-sm\:hover\:border-opacity-12:hover { --border-opacity: 0.12 !important; } .gt-sm\:hover\:border-opacity-25:hover { --border-opacity: 0.25 !important; } .gt-sm\:hover\:border-opacity-38:hover { --border-opacity: 0.38 !important; } .gt-sm\:hover\:border-opacity-50:hover { --border-opacity: 0.5 !important; } .gt-sm\:hover\:border-opacity-54:hover { --border-opacity: 0.54 !important; } .gt-sm\:hover\:border-opacity-70:hover { --border-opacity: 0.70 !important; } .gt-sm\:hover\:border-opacity-75:hover { --border-opacity: 0.75 !important; } .gt-sm\:hover\:border-opacity-84:hover { --border-opacity: 0.84 !important; } .gt-sm\:hover\:border-opacity-100:hover { --border-opacity: 1 !important; } .gt-sm\:focus\:border-opacity-0:focus { --border-opacity: 0 !important; } .gt-sm\:focus\:border-opacity-12:focus { --border-opacity: 0.12 !important; } .gt-sm\:focus\:border-opacity-25:focus { --border-opacity: 0.25 !important; } .gt-sm\:focus\:border-opacity-38:focus { --border-opacity: 0.38 !important; } .gt-sm\:focus\:border-opacity-50:focus { --border-opacity: 0.5 !important; } .gt-sm\:focus\:border-opacity-54:focus { --border-opacity: 0.54 !important; } .gt-sm\:focus\:border-opacity-70:focus { --border-opacity: 0.70 !important; } .gt-sm\:focus\:border-opacity-75:focus { --border-opacity: 0.75 !important; } .gt-sm\:focus\:border-opacity-84:focus { --border-opacity: 0.84 !important; } .gt-sm\:focus\:border-opacity-100:focus { --border-opacity: 1 !important; } .gt-sm\:rounded-none { border-radius: 0 !important; } .gt-sm\:rounded-sm { border-radius: 0.125rem !important; } .gt-sm\:rounded { border-radius: 0.25rem !important; } .gt-sm\:rounded-md { border-radius: 0.375rem !important; } .gt-sm\:rounded-lg { border-radius: 0.5rem !important; } .gt-sm\:rounded-full { border-radius: 9999px !important; } .gt-sm\:rounded-t-none { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } .gt-sm\:rounded-r-none { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } .gt-sm\:rounded-b-none { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } .gt-sm\:rounded-l-none { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; } .gt-sm\:rounded-t-sm { border-top-left-radius: 0.125rem !important; border-top-right-radius: 0.125rem !important; } .gt-sm\:rounded-r-sm { border-top-right-radius: 0.125rem !important; border-bottom-right-radius: 0.125rem !important; } .gt-sm\:rounded-b-sm { border-bottom-right-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .gt-sm\:rounded-l-sm { border-top-left-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .gt-sm\:rounded-t { border-top-left-radius: 0.25rem !important; border-top-right-radius: 0.25rem !important; } .gt-sm\:rounded-r { border-top-right-radius: 0.25rem !important; border-bottom-right-radius: 0.25rem !important; } .gt-sm\:rounded-b { border-bottom-right-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .gt-sm\:rounded-l { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .gt-sm\:rounded-t-md { border-top-left-radius: 0.375rem !important; border-top-right-radius: 0.375rem !important; } .gt-sm\:rounded-r-md { border-top-right-radius: 0.375rem !important; border-bottom-right-radius: 0.375rem !important; } .gt-sm\:rounded-b-md { border-bottom-right-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .gt-sm\:rounded-l-md { border-top-left-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .gt-sm\:rounded-t-lg { border-top-left-radius: 0.5rem !important; border-top-right-radius: 0.5rem !important; } .gt-sm\:rounded-r-lg { border-top-right-radius: 0.5rem !important; border-bottom-right-radius: 0.5rem !important; } .gt-sm\:rounded-b-lg { border-bottom-right-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .gt-sm\:rounded-l-lg { border-top-left-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .gt-sm\:rounded-t-full { border-top-left-radius: 9999px !important; border-top-right-radius: 9999px !important; } .gt-sm\:rounded-r-full { border-top-right-radius: 9999px !important; border-bottom-right-radius: 9999px !important; } .gt-sm\:rounded-b-full { border-bottom-right-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .gt-sm\:rounded-l-full { border-top-left-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .gt-sm\:rounded-tl-none { border-top-left-radius: 0 !important; } .gt-sm\:rounded-tr-none { border-top-right-radius: 0 !important; } .gt-sm\:rounded-br-none { border-bottom-right-radius: 0 !important; } .gt-sm\:rounded-bl-none { border-bottom-left-radius: 0 !important; } .gt-sm\:rounded-tl-sm { border-top-left-radius: 0.125rem !important; } .gt-sm\:rounded-tr-sm { border-top-right-radius: 0.125rem !important; } .gt-sm\:rounded-br-sm { border-bottom-right-radius: 0.125rem !important; } .gt-sm\:rounded-bl-sm { border-bottom-left-radius: 0.125rem !important; } .gt-sm\:rounded-tl { border-top-left-radius: 0.25rem !important; } .gt-sm\:rounded-tr { border-top-right-radius: 0.25rem !important; } .gt-sm\:rounded-br { border-bottom-right-radius: 0.25rem !important; } .gt-sm\:rounded-bl { border-bottom-left-radius: 0.25rem !important; } .gt-sm\:rounded-tl-md { border-top-left-radius: 0.375rem !important; } .gt-sm\:rounded-tr-md { border-top-right-radius: 0.375rem !important; } .gt-sm\:rounded-br-md { border-bottom-right-radius: 0.375rem !important; } .gt-sm\:rounded-bl-md { border-bottom-left-radius: 0.375rem !important; } .gt-sm\:rounded-tl-lg { border-top-left-radius: 0.5rem !important; } .gt-sm\:rounded-tr-lg { border-top-right-radius: 0.5rem !important; } .gt-sm\:rounded-br-lg { border-bottom-right-radius: 0.5rem !important; } .gt-sm\:rounded-bl-lg { border-bottom-left-radius: 0.5rem !important; } .gt-sm\:rounded-tl-full { border-top-left-radius: 9999px !important; } .gt-sm\:rounded-tr-full { border-top-right-radius: 9999px !important; } .gt-sm\:rounded-br-full { border-bottom-right-radius: 9999px !important; } .gt-sm\:rounded-bl-full { border-bottom-left-radius: 9999px !important; } .gt-sm\:border-solid { border-style: solid !important; } .gt-sm\:border-dashed { border-style: dashed !important; } .gt-sm\:border-dotted { border-style: dotted !important; } .gt-sm\:border-double { border-style: double !important; } .gt-sm\:border-none { border-style: none !important; } .gt-sm\:border-0 { border-width: 0 !important; } .gt-sm\:border-2 { border-width: 2px !important; } .gt-sm\:border-4 { border-width: 4px !important; } .gt-sm\:border-8 { border-width: 8px !important; } .gt-sm\:border { border-width: 1px !important; } .gt-sm\:border-t-0 { border-top-width: 0 !important; } .gt-sm\:border-r-0 { border-right-width: 0 !important; } .gt-sm\:border-b-0 { border-bottom-width: 0 !important; } .gt-sm\:border-l-0 { border-left-width: 0 !important; } .gt-sm\:border-t-2 { border-top-width: 2px !important; } .gt-sm\:border-r-2 { border-right-width: 2px !important; } .gt-sm\:border-b-2 { border-bottom-width: 2px !important; } .gt-sm\:border-l-2 { border-left-width: 2px !important; } .gt-sm\:border-t-4 { border-top-width: 4px !important; } .gt-sm\:border-r-4 { border-right-width: 4px !important; } .gt-sm\:border-b-4 { border-bottom-width: 4px !important; } .gt-sm\:border-l-4 { border-left-width: 4px !important; } .gt-sm\:border-t-8 { border-top-width: 8px !important; } .gt-sm\:border-r-8 { border-right-width: 8px !important; } .gt-sm\:border-b-8 { border-bottom-width: 8px !important; } .gt-sm\:border-l-8 { border-left-width: 8px !important; } .gt-sm\:border-t { border-top-width: 1px !important; } .gt-sm\:border-r { border-right-width: 1px !important; } .gt-sm\:border-b { border-bottom-width: 1px !important; } .gt-sm\:border-l { border-left-width: 1px !important; } .gt-sm\:first\:border-0:first-child { border-width: 0 !important; } .gt-sm\:first\:border-2:first-child { border-width: 2px !important; } .gt-sm\:first\:border-4:first-child { border-width: 4px !important; } .gt-sm\:first\:border-8:first-child { border-width: 8px !important; } .gt-sm\:first\:border:first-child { border-width: 1px !important; } .gt-sm\:first\:border-t-0:first-child { border-top-width: 0 !important; } .gt-sm\:first\:border-r-0:first-child { border-right-width: 0 !important; } .gt-sm\:first\:border-b-0:first-child { border-bottom-width: 0 !important; } .gt-sm\:first\:border-l-0:first-child { border-left-width: 0 !important; } .gt-sm\:first\:border-t-2:first-child { border-top-width: 2px !important; } .gt-sm\:first\:border-r-2:first-child { border-right-width: 2px !important; } .gt-sm\:first\:border-b-2:first-child { border-bottom-width: 2px !important; } .gt-sm\:first\:border-l-2:first-child { border-left-width: 2px !important; } .gt-sm\:first\:border-t-4:first-child { border-top-width: 4px !important; } .gt-sm\:first\:border-r-4:first-child { border-right-width: 4px !important; } .gt-sm\:first\:border-b-4:first-child { border-bottom-width: 4px !important; } .gt-sm\:first\:border-l-4:first-child { border-left-width: 4px !important; } .gt-sm\:first\:border-t-8:first-child { border-top-width: 8px !important; } .gt-sm\:first\:border-r-8:first-child { border-right-width: 8px !important; } .gt-sm\:first\:border-b-8:first-child { border-bottom-width: 8px !important; } .gt-sm\:first\:border-l-8:first-child { border-left-width: 8px !important; } .gt-sm\:first\:border-t:first-child { border-top-width: 1px !important; } .gt-sm\:first\:border-r:first-child { border-right-width: 1px !important; } .gt-sm\:first\:border-b:first-child { border-bottom-width: 1px !important; } .gt-sm\:first\:border-l:first-child { border-left-width: 1px !important; } .gt-sm\:last\:border-0:last-child { border-width: 0 !important; } .gt-sm\:last\:border-2:last-child { border-width: 2px !important; } .gt-sm\:last\:border-4:last-child { border-width: 4px !important; } .gt-sm\:last\:border-8:last-child { border-width: 8px !important; } .gt-sm\:last\:border:last-child { border-width: 1px !important; } .gt-sm\:last\:border-t-0:last-child { border-top-width: 0 !important; } .gt-sm\:last\:border-r-0:last-child { border-right-width: 0 !important; } .gt-sm\:last\:border-b-0:last-child { border-bottom-width: 0 !important; } .gt-sm\:last\:border-l-0:last-child { border-left-width: 0 !important; } .gt-sm\:last\:border-t-2:last-child { border-top-width: 2px !important; } .gt-sm\:last\:border-r-2:last-child { border-right-width: 2px !important; } .gt-sm\:last\:border-b-2:last-child { border-bottom-width: 2px !important; } .gt-sm\:last\:border-l-2:last-child { border-left-width: 2px !important; } .gt-sm\:last\:border-t-4:last-child { border-top-width: 4px !important; } .gt-sm\:last\:border-r-4:last-child { border-right-width: 4px !important; } .gt-sm\:last\:border-b-4:last-child { border-bottom-width: 4px !important; } .gt-sm\:last\:border-l-4:last-child { border-left-width: 4px !important; } .gt-sm\:last\:border-t-8:last-child { border-top-width: 8px !important; } .gt-sm\:last\:border-r-8:last-child { border-right-width: 8px !important; } .gt-sm\:last\:border-b-8:last-child { border-bottom-width: 8px !important; } .gt-sm\:last\:border-l-8:last-child { border-left-width: 8px !important; } .gt-sm\:last\:border-t:last-child { border-top-width: 1px !important; } .gt-sm\:last\:border-r:last-child { border-right-width: 1px !important; } .gt-sm\:last\:border-b:last-child { border-bottom-width: 1px !important; } .gt-sm\:last\:border-l:last-child { border-left-width: 1px !important; } .gt-sm\:box-border { box-sizing: border-box !important; } .gt-sm\:box-content { box-sizing: content-box !important; } .gt-sm\:block { display: block !important; } .gt-sm\:inline-block { display: inline-block !important; } .gt-sm\:inline { display: inline !important; } .gt-sm\:flex { display: flex !important; } .gt-sm\:inline-flex { display: inline-flex !important; } .gt-sm\:table { display: table !important; } .gt-sm\:table-caption { display: table-caption !important; } .gt-sm\:table-cell { display: table-cell !important; } .gt-sm\:table-column { display: table-column !important; } .gt-sm\:table-column-group { display: table-column-group !important; } .gt-sm\:table-footer-group { display: table-footer-group !important; } .gt-sm\:table-header-group { display: table-header-group !important; } .gt-sm\:table-row-group { display: table-row-group !important; } .gt-sm\:table-row { display: table-row !important; } .gt-sm\:flow-root { display: flow-root !important; } .gt-sm\:grid { display: grid !important; } .gt-sm\:inline-grid { display: inline-grid !important; } .gt-sm\:hidden { display: none !important; } .gt-sm\:flex-row { flex-direction: row !important; } .gt-sm\:flex-row-reverse { flex-direction: row-reverse !important; } .gt-sm\:flex-col { flex-direction: column !important; } .gt-sm\:flex-col-reverse { flex-direction: column-reverse !important; } .gt-sm\:flex-wrap { flex-wrap: wrap !important; } .gt-sm\:flex-wrap-reverse { flex-wrap: wrap-reverse !important; } .gt-sm\:flex-no-wrap { flex-wrap: nowrap !important; } .gt-sm\:items-start { align-items: flex-start !important; } .gt-sm\:items-end { align-items: flex-end !important; } .gt-sm\:items-center { align-items: center !important; } .gt-sm\:items-baseline { align-items: baseline !important; } .gt-sm\:items-stretch { align-items: stretch !important; } .gt-sm\:self-auto { align-self: auto !important; } .gt-sm\:self-start { align-self: flex-start !important; } .gt-sm\:self-end { align-self: flex-end !important; } .gt-sm\:self-center { align-self: center !important; } .gt-sm\:self-stretch { align-self: stretch !important; } .gt-sm\:justify-start { justify-content: flex-start !important; } .gt-sm\:justify-end { justify-content: flex-end !important; } .gt-sm\:justify-center { justify-content: center !important; } .gt-sm\:justify-between { justify-content: space-between !important; } .gt-sm\:justify-around { justify-content: space-around !important; } .gt-sm\:justify-evenly { justify-content: space-evenly !important; } .gt-sm\:content-center { align-content: center !important; } .gt-sm\:content-start { align-content: flex-start !important; } .gt-sm\:content-end { align-content: flex-end !important; } .gt-sm\:content-between { align-content: space-between !important; } .gt-sm\:content-around { align-content: space-around !important; } .gt-sm\:flex-0 { flex: 0 0 auto !important; } .gt-sm\:flex-1 { flex: 1 1 0% !important; } .gt-sm\:flex-auto { flex: 1 1 auto !important; } .gt-sm\:flex-initial { flex: 0 1 auto !important; } .gt-sm\:flex-none { flex: none !important; } .gt-sm\:flex-grow-0 { flex-grow: 0 !important; } .gt-sm\:flex-grow { flex-grow: 1 !important; } .gt-sm\:flex-shrink-0 { flex-shrink: 0 !important; } .gt-sm\:flex-shrink { flex-shrink: 1 !important; } .gt-sm\:order-1 { order: 1 !important; } .gt-sm\:order-2 { order: 2 !important; } .gt-sm\:order-3 { order: 3 !important; } .gt-sm\:order-4 { order: 4 !important; } .gt-sm\:order-5 { order: 5 !important; } .gt-sm\:order-6 { order: 6 !important; } .gt-sm\:order-7 { order: 7 !important; } .gt-sm\:order-8 { order: 8 !important; } .gt-sm\:order-9 { order: 9 !important; } .gt-sm\:order-10 { order: 10 !important; } .gt-sm\:order-11 { order: 11 !important; } .gt-sm\:order-12 { order: 12 !important; } .gt-sm\:order-first { order: -9999 !important; } .gt-sm\:order-last { order: 9999 !important; } .gt-sm\:order-none { order: 0 !important; } .gt-sm\:font-hairline { font-weight: 100 !important; } .gt-sm\:font-thin { font-weight: 200 !important; } .gt-sm\:font-light { font-weight: 300 !important; } .gt-sm\:font-normal { font-weight: 400 !important; } .gt-sm\:font-medium { font-weight: 500 !important; } .gt-sm\:font-semibold { font-weight: 600 !important; } .gt-sm\:font-bold { font-weight: 700 !important; } .gt-sm\:font-extrabold { font-weight: 800 !important; } .gt-sm\:font-black { font-weight: 900 !important; } .gt-sm\:h-0 { height: 0 !important; } .gt-sm\:h-1 { height: 0.25rem !important; } .gt-sm\:h-2 { height: 0.5rem !important; } .gt-sm\:h-3 { height: 0.75rem !important; } .gt-sm\:h-4 { height: 1rem !important; } .gt-sm\:h-5 { height: 1.25rem !important; } .gt-sm\:h-6 { height: 1.5rem !important; } .gt-sm\:h-8 { height: 2rem !important; } .gt-sm\:h-10 { height: 2.5rem !important; } .gt-sm\:h-12 { height: 3rem !important; } .gt-sm\:h-14 { height: 3.5rem !important; } .gt-sm\:h-16 { height: 4rem !important; } .gt-sm\:h-18 { height: 4.5rem !important; } .gt-sm\:h-20 { height: 5rem !important; } .gt-sm\:h-22 { height: 5.5rem !important; } .gt-sm\:h-24 { height: 6rem !important; } .gt-sm\:h-26 { height: 6.5rem !important; } .gt-sm\:h-28 { height: 7rem !important; } .gt-sm\:h-30 { height: 7.5rem !important; } .gt-sm\:h-32 { height: 8rem !important; } .gt-sm\:h-36 { height: 9rem !important; } .gt-sm\:h-40 { height: 10rem !important; } .gt-sm\:h-48 { height: 12rem !important; } .gt-sm\:h-50 { height: 12.5rem !important; } .gt-sm\:h-56 { height: 14rem !important; } .gt-sm\:h-60 { height: 15rem !important; } .gt-sm\:h-64 { height: 16rem !important; } .gt-sm\:h-80 { height: 20rem !important; } .gt-sm\:h-90 { height: 24rem !important; } .gt-sm\:h-100 { height: 25rem !important; } .gt-sm\:h-120 { height: 30rem !important; } .gt-sm\:h-128 { height: 32rem !important; } .gt-sm\:h-140 { height: 35rem !important; } .gt-sm\:h-160 { height: 40rem !important; } .gt-sm\:h-180 { height: 45rem !important; } .gt-sm\:h-192 { height: 48rem !important; } .gt-sm\:h-200 { height: 50rem !important; } .gt-sm\:h-240 { height: 60rem !important; } .gt-sm\:h-256 { height: 64rem !important; } .gt-sm\:h-280 { height: 70rem !important; } .gt-sm\:h-320 { height: 80rem !important; } .gt-sm\:h-360 { height: 90rem !important; } .gt-sm\:h-400 { height: 100rem !important; } .gt-sm\:h-480 { height: 120rem !important; } .gt-sm\:h-auto { height: auto !important; } .gt-sm\:h-px { height: 1px !important; } .gt-sm\:h-2px { height: 2px !important; } .gt-sm\:h-full { height: 100% !important; } .gt-sm\:h-screen { height: 100vh !important; } .gt-sm\:h-1\/2 { height: 50% !important; } .gt-sm\:h-1\/3 { height: 33.33333% !important; } .gt-sm\:h-2\/3 { height: 66.66667% !important; } .gt-sm\:h-1\/4 { height: 25% !important; } .gt-sm\:h-2\/4 { height: 50% !important; } .gt-sm\:h-3\/4 { height: 75% !important; } .gt-sm\:h-1\/5 { height: 20% !important; } .gt-sm\:h-2\/5 { height: 40% !important; } .gt-sm\:h-3\/5 { height: 60% !important; } .gt-sm\:h-4\/5 { height: 80% !important; } .gt-sm\:h-1\/12 { height: 8.33333% !important; } .gt-sm\:h-2\/12 { height: 16.66667% !important; } .gt-sm\:h-3\/12 { height: 25% !important; } .gt-sm\:h-4\/12 { height: 33.33333% !important; } .gt-sm\:h-5\/12 { height: 41.66667% !important; } .gt-sm\:h-6\/12 { height: 50% !important; } .gt-sm\:h-7\/12 { height: 58.33333% !important; } .gt-sm\:h-8\/12 { height: 66.66667% !important; } .gt-sm\:h-9\/12 { height: 75% !important; } .gt-sm\:h-10\/12 { height: 83.33333% !important; } .gt-sm\:h-11\/12 { height: 91.66667% !important; } .gt-sm\:text-xs { font-size: 0.625rem !important; } .gt-sm\:text-sm { font-size: 0.75rem !important; } .gt-sm\:text-md { font-size: 0.8125rem !important; } .gt-sm\:text-base { font-size: 0.875rem !important; } .gt-sm\:text-lg { font-size: 1rem !important; } .gt-sm\:text-xl { font-size: 1.125rem !important; } .gt-sm\:text-2xl { font-size: 1.25rem !important; } .gt-sm\:text-3xl { font-size: 1.5rem !important; } .gt-sm\:text-4xl { font-size: 2rem !important; } .gt-sm\:text-5xl { font-size: 2.25rem !important; } .gt-sm\:text-6xl { font-size: 2.5rem !important; } .gt-sm\:text-7xl { font-size: 3rem !important; } .gt-sm\:text-8xl { font-size: 4rem !important; } .gt-sm\:text-9xl { font-size: 6rem !important; } .gt-sm\:text-10xl { font-size: 8rem !important; } .gt-sm\:leading-3 { line-height: .75rem !important; } .gt-sm\:leading-4 { line-height: 1rem !important; } .gt-sm\:leading-5 { line-height: 1.25rem !important; } .gt-sm\:leading-6 { line-height: 1.5rem !important; } .gt-sm\:leading-7 { line-height: 1.75rem !important; } .gt-sm\:leading-8 { line-height: 2rem !important; } .gt-sm\:leading-9 { line-height: 2.25rem !important; } .gt-sm\:leading-10 { line-height: 2.5rem !important; } .gt-sm\:leading-none { line-height: 1 !important; } .gt-sm\:leading-tight { line-height: 1.25 !important; } .gt-sm\:leading-snug { line-height: 1.375 !important; } .gt-sm\:leading-normal { line-height: 1.5 !important; } .gt-sm\:leading-relaxed { line-height: 1.625 !important; } .gt-sm\:leading-loose { line-height: 2 !important; } .gt-sm\:list-inside { list-style-position: inside !important; } .gt-sm\:list-outside { list-style-position: outside !important; } .gt-sm\:list-none { list-style-type: none !important; } .gt-sm\:list-disc { list-style-type: disc !important; } .gt-sm\:list-decimal { list-style-type: decimal !important; } .gt-sm\:m-0 { margin: 0 !important; } .gt-sm\:m-1 { margin: 0.25rem !important; } .gt-sm\:m-2 { margin: 0.5rem !important; } .gt-sm\:m-3 { margin: 0.75rem !important; } .gt-sm\:m-4 { margin: 1rem !important; } .gt-sm\:m-5 { margin: 1.25rem !important; } .gt-sm\:m-6 { margin: 1.5rem !important; } .gt-sm\:m-8 { margin: 2rem !important; } .gt-sm\:m-10 { margin: 2.5rem !important; } .gt-sm\:m-12 { margin: 3rem !important; } .gt-sm\:m-14 { margin: 3.5rem !important; } .gt-sm\:m-16 { margin: 4rem !important; } .gt-sm\:m-18 { margin: 4.5rem !important; } .gt-sm\:m-20 { margin: 5rem !important; } .gt-sm\:m-22 { margin: 5.5rem !important; } .gt-sm\:m-24 { margin: 6rem !important; } .gt-sm\:m-26 { margin: 6.5rem !important; } .gt-sm\:m-28 { margin: 7rem !important; } .gt-sm\:m-30 { margin: 7.5rem !important; } .gt-sm\:m-32 { margin: 8rem !important; } .gt-sm\:m-36 { margin: 9rem !important; } .gt-sm\:m-40 { margin: 10rem !important; } .gt-sm\:m-48 { margin: 12rem !important; } .gt-sm\:m-56 { margin: 14rem !important; } .gt-sm\:m-64 { margin: 16rem !important; } .gt-sm\:m-auto { margin: auto !important; } .gt-sm\:m-px { margin: 1px !important; } .gt-sm\:m-2px { margin: 2px !important; } .gt-sm\:-m-1 { margin: -0.25rem !important; } .gt-sm\:-m-2 { margin: -0.5rem !important; } .gt-sm\:-m-3 { margin: -0.75rem !important; } .gt-sm\:-m-4 { margin: -1rem !important; } .gt-sm\:-m-5 { margin: -1.25rem !important; } .gt-sm\:-m-6 { margin: -1.5rem !important; } .gt-sm\:-m-8 { margin: -2rem !important; } .gt-sm\:-m-10 { margin: -2.5rem !important; } .gt-sm\:-m-12 { margin: -3rem !important; } .gt-sm\:-m-14 { margin: -3.5rem !important; } .gt-sm\:-m-16 { margin: -4rem !important; } .gt-sm\:-m-18 { margin: -4.5rem !important; } .gt-sm\:-m-20 { margin: -5rem !important; } .gt-sm\:-m-22 { margin: -5.5rem !important; } .gt-sm\:-m-24 { margin: -6rem !important; } .gt-sm\:-m-26 { margin: -6.5rem !important; } .gt-sm\:-m-28 { margin: -7rem !important; } .gt-sm\:-m-30 { margin: -7.5rem !important; } .gt-sm\:-m-32 { margin: -8rem !important; } .gt-sm\:-m-36 { margin: -9rem !important; } .gt-sm\:-m-40 { margin: -10rem !important; } .gt-sm\:-m-48 { margin: -12rem !important; } .gt-sm\:-m-56 { margin: -14rem !important; } .gt-sm\:-m-64 { margin: -16rem !important; } .gt-sm\:-m-px { margin: -1px !important; } .gt-sm\:-m-2px { margin: -2px !important; } .gt-sm\:my-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .gt-sm\:mx-0 { margin-left: 0 !important; margin-right: 0 !important; } .gt-sm\:my-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .gt-sm\:mx-1 { margin-left: 0.25rem !important; margin-right: 0.25rem !important; } .gt-sm\:my-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .gt-sm\:mx-2 { margin-left: 0.5rem !important; margin-right: 0.5rem !important; } .gt-sm\:my-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .gt-sm\:mx-3 { margin-left: 0.75rem !important; margin-right: 0.75rem !important; } .gt-sm\:my-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .gt-sm\:mx-4 { margin-left: 1rem !important; margin-right: 1rem !important; } .gt-sm\:my-5 { margin-top: 1.25rem !important; margin-bottom: 1.25rem !important; } .gt-sm\:mx-5 { margin-left: 1.25rem !important; margin-right: 1.25rem !important; } .gt-sm\:my-6 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .gt-sm\:mx-6 { margin-left: 1.5rem !important; margin-right: 1.5rem !important; } .gt-sm\:my-8 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .gt-sm\:mx-8 { margin-left: 2rem !important; margin-right: 2rem !important; } .gt-sm\:my-10 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .gt-sm\:mx-10 { margin-left: 2.5rem !important; margin-right: 2.5rem !important; } .gt-sm\:my-12 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .gt-sm\:mx-12 { margin-left: 3rem !important; margin-right: 3rem !important; } .gt-sm\:my-14 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .gt-sm\:mx-14 { margin-left: 3.5rem !important; margin-right: 3.5rem !important; } .gt-sm\:my-16 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .gt-sm\:mx-16 { margin-left: 4rem !important; margin-right: 4rem !important; } .gt-sm\:my-18 { margin-top: 4.5rem !important; margin-bottom: 4.5rem !important; } .gt-sm\:mx-18 { margin-left: 4.5rem !important; margin-right: 4.5rem !important; } .gt-sm\:my-20 { margin-top: 5rem !important; margin-bottom: 5rem !important; } .gt-sm\:mx-20 { margin-left: 5rem !important; margin-right: 5rem !important; } .gt-sm\:my-22 { margin-top: 5.5rem !important; margin-bottom: 5.5rem !important; } .gt-sm\:mx-22 { margin-left: 5.5rem !important; margin-right: 5.5rem !important; } .gt-sm\:my-24 { margin-top: 6rem !important; margin-bottom: 6rem !important; } .gt-sm\:mx-24 { margin-left: 6rem !important; margin-right: 6rem !important; } .gt-sm\:my-26 { margin-top: 6.5rem !important; margin-bottom: 6.5rem !important; } .gt-sm\:mx-26 { margin-left: 6.5rem !important; margin-right: 6.5rem !important; } .gt-sm\:my-28 { margin-top: 7rem !important; margin-bottom: 7rem !important; } .gt-sm\:mx-28 { margin-left: 7rem !important; margin-right: 7rem !important; } .gt-sm\:my-30 { margin-top: 7.5rem !important; margin-bottom: 7.5rem !important; } .gt-sm\:mx-30 { margin-left: 7.5rem !important; margin-right: 7.5rem !important; } .gt-sm\:my-32 { margin-top: 8rem !important; margin-bottom: 8rem !important; } .gt-sm\:mx-32 { margin-left: 8rem !important; margin-right: 8rem !important; } .gt-sm\:my-36 { margin-top: 9rem !important; margin-bottom: 9rem !important; } .gt-sm\:mx-36 { margin-left: 9rem !important; margin-right: 9rem !important; } .gt-sm\:my-40 { margin-top: 10rem !important; margin-bottom: 10rem !important; } .gt-sm\:mx-40 { margin-left: 10rem !important; margin-right: 10rem !important; } .gt-sm\:my-48 { margin-top: 12rem !important; margin-bottom: 12rem !important; } .gt-sm\:mx-48 { margin-left: 12rem !important; margin-right: 12rem !important; } .gt-sm\:my-56 { margin-top: 14rem !important; margin-bottom: 14rem !important; } .gt-sm\:mx-56 { margin-left: 14rem !important; margin-right: 14rem !important; } .gt-sm\:my-64 { margin-top: 16rem !important; margin-bottom: 16rem !important; } .gt-sm\:mx-64 { margin-left: 16rem !important; margin-right: 16rem !important; } .gt-sm\:my-auto { margin-top: auto !important; margin-bottom: auto !important; } .gt-sm\:mx-auto { margin-left: auto !important; margin-right: auto !important; } .gt-sm\:my-px { margin-top: 1px !important; margin-bottom: 1px !important; } .gt-sm\:mx-px { margin-left: 1px !important; margin-right: 1px !important; } .gt-sm\:my-2px { margin-top: 2px !important; margin-bottom: 2px !important; } .gt-sm\:mx-2px { margin-left: 2px !important; margin-right: 2px !important; } .gt-sm\:-my-1 { margin-top: -0.25rem !important; margin-bottom: -0.25rem !important; } .gt-sm\:-mx-1 { margin-left: -0.25rem !important; margin-right: -0.25rem !important; } .gt-sm\:-my-2 { margin-top: -0.5rem !important; margin-bottom: -0.5rem !important; } .gt-sm\:-mx-2 { margin-left: -0.5rem !important; margin-right: -0.5rem !important; } .gt-sm\:-my-3 { margin-top: -0.75rem !important; margin-bottom: -0.75rem !important; } .gt-sm\:-mx-3 { margin-left: -0.75rem !important; margin-right: -0.75rem !important; } .gt-sm\:-my-4 { margin-top: -1rem !important; margin-bottom: -1rem !important; } .gt-sm\:-mx-4 { margin-left: -1rem !important; margin-right: -1rem !important; } .gt-sm\:-my-5 { margin-top: -1.25rem !important; margin-bottom: -1.25rem !important; } .gt-sm\:-mx-5 { margin-left: -1.25rem !important; margin-right: -1.25rem !important; } .gt-sm\:-my-6 { margin-top: -1.5rem !important; margin-bottom: -1.5rem !important; } .gt-sm\:-mx-6 { margin-left: -1.5rem !important; margin-right: -1.5rem !important; } .gt-sm\:-my-8 { margin-top: -2rem !important; margin-bottom: -2rem !important; } .gt-sm\:-mx-8 { margin-left: -2rem !important; margin-right: -2rem !important; } .gt-sm\:-my-10 { margin-top: -2.5rem !important; margin-bottom: -2.5rem !important; } .gt-sm\:-mx-10 { margin-left: -2.5rem !important; margin-right: -2.5rem !important; } .gt-sm\:-my-12 { margin-top: -3rem !important; margin-bottom: -3rem !important; } .gt-sm\:-mx-12 { margin-left: -3rem !important; margin-right: -3rem !important; } .gt-sm\:-my-14 { margin-top: -3.5rem !important; margin-bottom: -3.5rem !important; } .gt-sm\:-mx-14 { margin-left: -3.5rem !important; margin-right: -3.5rem !important; } .gt-sm\:-my-16 { margin-top: -4rem !important; margin-bottom: -4rem !important; } .gt-sm\:-mx-16 { margin-left: -4rem !important; margin-right: -4rem !important; } .gt-sm\:-my-18 { margin-top: -4.5rem !important; margin-bottom: -4.5rem !important; } .gt-sm\:-mx-18 { margin-left: -4.5rem !important; margin-right: -4.5rem !important; } .gt-sm\:-my-20 { margin-top: -5rem !important; margin-bottom: -5rem !important; } .gt-sm\:-mx-20 { margin-left: -5rem !important; margin-right: -5rem !important; } .gt-sm\:-my-22 { margin-top: -5.5rem !important; margin-bottom: -5.5rem !important; } .gt-sm\:-mx-22 { margin-left: -5.5rem !important; margin-right: -5.5rem !important; } .gt-sm\:-my-24 { margin-top: -6rem !important; margin-bottom: -6rem !important; } .gt-sm\:-mx-24 { margin-left: -6rem !important; margin-right: -6rem !important; } .gt-sm\:-my-26 { margin-top: -6.5rem !important; margin-bottom: -6.5rem !important; } .gt-sm\:-mx-26 { margin-left: -6.5rem !important; margin-right: -6.5rem !important; } .gt-sm\:-my-28 { margin-top: -7rem !important; margin-bottom: -7rem !important; } .gt-sm\:-mx-28 { margin-left: -7rem !important; margin-right: -7rem !important; } .gt-sm\:-my-30 { margin-top: -7.5rem !important; margin-bottom: -7.5rem !important; } .gt-sm\:-mx-30 { margin-left: -7.5rem !important; margin-right: -7.5rem !important; } .gt-sm\:-my-32 { margin-top: -8rem !important; margin-bottom: -8rem !important; } .gt-sm\:-mx-32 { margin-left: -8rem !important; margin-right: -8rem !important; } .gt-sm\:-my-36 { margin-top: -9rem !important; margin-bottom: -9rem !important; } .gt-sm\:-mx-36 { margin-left: -9rem !important; margin-right: -9rem !important; } .gt-sm\:-my-40 { margin-top: -10rem !important; margin-bottom: -10rem !important; } .gt-sm\:-mx-40 { margin-left: -10rem !important; margin-right: -10rem !important; } .gt-sm\:-my-48 { margin-top: -12rem !important; margin-bottom: -12rem !important; } .gt-sm\:-mx-48 { margin-left: -12rem !important; margin-right: -12rem !important; } .gt-sm\:-my-56 { margin-top: -14rem !important; margin-bottom: -14rem !important; } .gt-sm\:-mx-56 { margin-left: -14rem !important; margin-right: -14rem !important; } .gt-sm\:-my-64 { margin-top: -16rem !important; margin-bottom: -16rem !important; } .gt-sm\:-mx-64 { margin-left: -16rem !important; margin-right: -16rem !important; } .gt-sm\:-my-px { margin-top: -1px !important; margin-bottom: -1px !important; } .gt-sm\:-mx-px { margin-left: -1px !important; margin-right: -1px !important; } .gt-sm\:-my-2px { margin-top: -2px !important; margin-bottom: -2px !important; } .gt-sm\:-mx-2px { margin-left: -2px !important; margin-right: -2px !important; } .gt-sm\:mt-0 { margin-top: 0 !important; } .gt-sm\:mr-0 { margin-right: 0 !important; } .gt-sm\:mb-0 { margin-bottom: 0 !important; } .gt-sm\:ml-0 { margin-left: 0 !important; } .gt-sm\:mt-1 { margin-top: 0.25rem !important; } .gt-sm\:mr-1 { margin-right: 0.25rem !important; } .gt-sm\:mb-1 { margin-bottom: 0.25rem !important; } .gt-sm\:ml-1 { margin-left: 0.25rem !important; } .gt-sm\:mt-2 { margin-top: 0.5rem !important; } .gt-sm\:mr-2 { margin-right: 0.5rem !important; } .gt-sm\:mb-2 { margin-bottom: 0.5rem !important; } .gt-sm\:ml-2 { margin-left: 0.5rem !important; } .gt-sm\:mt-3 { margin-top: 0.75rem !important; } .gt-sm\:mr-3 { margin-right: 0.75rem !important; } .gt-sm\:mb-3 { margin-bottom: 0.75rem !important; } .gt-sm\:ml-3 { margin-left: 0.75rem !important; } .gt-sm\:mt-4 { margin-top: 1rem !important; } .gt-sm\:mr-4 { margin-right: 1rem !important; } .gt-sm\:mb-4 { margin-bottom: 1rem !important; } .gt-sm\:ml-4 { margin-left: 1rem !important; } .gt-sm\:mt-5 { margin-top: 1.25rem !important; } .gt-sm\:mr-5 { margin-right: 1.25rem !important; } .gt-sm\:mb-5 { margin-bottom: 1.25rem !important; } .gt-sm\:ml-5 { margin-left: 1.25rem !important; } .gt-sm\:mt-6 { margin-top: 1.5rem !important; } .gt-sm\:mr-6 { margin-right: 1.5rem !important; } .gt-sm\:mb-6 { margin-bottom: 1.5rem !important; } .gt-sm\:ml-6 { margin-left: 1.5rem !important; } .gt-sm\:mt-8 { margin-top: 2rem !important; } .gt-sm\:mr-8 { margin-right: 2rem !important; } .gt-sm\:mb-8 { margin-bottom: 2rem !important; } .gt-sm\:ml-8 { margin-left: 2rem !important; } .gt-sm\:mt-10 { margin-top: 2.5rem !important; } .gt-sm\:mr-10 { margin-right: 2.5rem !important; } .gt-sm\:mb-10 { margin-bottom: 2.5rem !important; } .gt-sm\:ml-10 { margin-left: 2.5rem !important; } .gt-sm\:mt-12 { margin-top: 3rem !important; } .gt-sm\:mr-12 { margin-right: 3rem !important; } .gt-sm\:mb-12 { margin-bottom: 3rem !important; } .gt-sm\:ml-12 { margin-left: 3rem !important; } .gt-sm\:mt-14 { margin-top: 3.5rem !important; } .gt-sm\:mr-14 { margin-right: 3.5rem !important; } .gt-sm\:mb-14 { margin-bottom: 3.5rem !important; } .gt-sm\:ml-14 { margin-left: 3.5rem !important; } .gt-sm\:mt-16 { margin-top: 4rem !important; } .gt-sm\:mr-16 { margin-right: 4rem !important; } .gt-sm\:mb-16 { margin-bottom: 4rem !important; } .gt-sm\:ml-16 { margin-left: 4rem !important; } .gt-sm\:mt-18 { margin-top: 4.5rem !important; } .gt-sm\:mr-18 { margin-right: 4.5rem !important; } .gt-sm\:mb-18 { margin-bottom: 4.5rem !important; } .gt-sm\:ml-18 { margin-left: 4.5rem !important; } .gt-sm\:mt-20 { margin-top: 5rem !important; } .gt-sm\:mr-20 { margin-right: 5rem !important; } .gt-sm\:mb-20 { margin-bottom: 5rem !important; } .gt-sm\:ml-20 { margin-left: 5rem !important; } .gt-sm\:mt-22 { margin-top: 5.5rem !important; } .gt-sm\:mr-22 { margin-right: 5.5rem !important; } .gt-sm\:mb-22 { margin-bottom: 5.5rem !important; } .gt-sm\:ml-22 { margin-left: 5.5rem !important; } .gt-sm\:mt-24 { margin-top: 6rem !important; } .gt-sm\:mr-24 { margin-right: 6rem !important; } .gt-sm\:mb-24 { margin-bottom: 6rem !important; } .gt-sm\:ml-24 { margin-left: 6rem !important; } .gt-sm\:mt-26 { margin-top: 6.5rem !important; } .gt-sm\:mr-26 { margin-right: 6.5rem !important; } .gt-sm\:mb-26 { margin-bottom: 6.5rem !important; } .gt-sm\:ml-26 { margin-left: 6.5rem !important; } .gt-sm\:mt-28 { margin-top: 7rem !important; } .gt-sm\:mr-28 { margin-right: 7rem !important; } .gt-sm\:mb-28 { margin-bottom: 7rem !important; } .gt-sm\:ml-28 { margin-left: 7rem !important; } .gt-sm\:mt-30 { margin-top: 7.5rem !important; } .gt-sm\:mr-30 { margin-right: 7.5rem !important; } .gt-sm\:mb-30 { margin-bottom: 7.5rem !important; } .gt-sm\:ml-30 { margin-left: 7.5rem !important; } .gt-sm\:mt-32 { margin-top: 8rem !important; } .gt-sm\:mr-32 { margin-right: 8rem !important; } .gt-sm\:mb-32 { margin-bottom: 8rem !important; } .gt-sm\:ml-32 { margin-left: 8rem !important; } .gt-sm\:mt-36 { margin-top: 9rem !important; } .gt-sm\:mr-36 { margin-right: 9rem !important; } .gt-sm\:mb-36 { margin-bottom: 9rem !important; } .gt-sm\:ml-36 { margin-left: 9rem !important; } .gt-sm\:mt-40 { margin-top: 10rem !important; } .gt-sm\:mr-40 { margin-right: 10rem !important; } .gt-sm\:mb-40 { margin-bottom: 10rem !important; } .gt-sm\:ml-40 { margin-left: 10rem !important; } .gt-sm\:mt-48 { margin-top: 12rem !important; } .gt-sm\:mr-48 { margin-right: 12rem !important; } .gt-sm\:mb-48 { margin-bottom: 12rem !important; } .gt-sm\:ml-48 { margin-left: 12rem !important; } .gt-sm\:mt-56 { margin-top: 14rem !important; } .gt-sm\:mr-56 { margin-right: 14rem !important; } .gt-sm\:mb-56 { margin-bottom: 14rem !important; } .gt-sm\:ml-56 { margin-left: 14rem !important; } .gt-sm\:mt-64 { margin-top: 16rem !important; } .gt-sm\:mr-64 { margin-right: 16rem !important; } .gt-sm\:mb-64 { margin-bottom: 16rem !important; } .gt-sm\:ml-64 { margin-left: 16rem !important; } .gt-sm\:mt-auto { margin-top: auto !important; } .gt-sm\:mr-auto { margin-right: auto !important; } .gt-sm\:mb-auto { margin-bottom: auto !important; } .gt-sm\:ml-auto { margin-left: auto !important; } .gt-sm\:mt-px { margin-top: 1px !important; } .gt-sm\:mr-px { margin-right: 1px !important; } .gt-sm\:mb-px { margin-bottom: 1px !important; } .gt-sm\:ml-px { margin-left: 1px !important; } .gt-sm\:mt-2px { margin-top: 2px !important; } .gt-sm\:mr-2px { margin-right: 2px !important; } .gt-sm\:mb-2px { margin-bottom: 2px !important; } .gt-sm\:ml-2px { margin-left: 2px !important; } .gt-sm\:-mt-1 { margin-top: -0.25rem !important; } .gt-sm\:-mr-1 { margin-right: -0.25rem !important; } .gt-sm\:-mb-1 { margin-bottom: -0.25rem !important; } .gt-sm\:-ml-1 { margin-left: -0.25rem !important; } .gt-sm\:-mt-2 { margin-top: -0.5rem !important; } .gt-sm\:-mr-2 { margin-right: -0.5rem !important; } .gt-sm\:-mb-2 { margin-bottom: -0.5rem !important; } .gt-sm\:-ml-2 { margin-left: -0.5rem !important; } .gt-sm\:-mt-3 { margin-top: -0.75rem !important; } .gt-sm\:-mr-3 { margin-right: -0.75rem !important; } .gt-sm\:-mb-3 { margin-bottom: -0.75rem !important; } .gt-sm\:-ml-3 { margin-left: -0.75rem !important; } .gt-sm\:-mt-4 { margin-top: -1rem !important; } .gt-sm\:-mr-4 { margin-right: -1rem !important; } .gt-sm\:-mb-4 { margin-bottom: -1rem !important; } .gt-sm\:-ml-4 { margin-left: -1rem !important; } .gt-sm\:-mt-5 { margin-top: -1.25rem !important; } .gt-sm\:-mr-5 { margin-right: -1.25rem !important; } .gt-sm\:-mb-5 { margin-bottom: -1.25rem !important; } .gt-sm\:-ml-5 { margin-left: -1.25rem !important; } .gt-sm\:-mt-6 { margin-top: -1.5rem !important; } .gt-sm\:-mr-6 { margin-right: -1.5rem !important; } .gt-sm\:-mb-6 { margin-bottom: -1.5rem !important; } .gt-sm\:-ml-6 { margin-left: -1.5rem !important; } .gt-sm\:-mt-8 { margin-top: -2rem !important; } .gt-sm\:-mr-8 { margin-right: -2rem !important; } .gt-sm\:-mb-8 { margin-bottom: -2rem !important; } .gt-sm\:-ml-8 { margin-left: -2rem !important; } .gt-sm\:-mt-10 { margin-top: -2.5rem !important; } .gt-sm\:-mr-10 { margin-right: -2.5rem !important; } .gt-sm\:-mb-10 { margin-bottom: -2.5rem !important; } .gt-sm\:-ml-10 { margin-left: -2.5rem !important; } .gt-sm\:-mt-12 { margin-top: -3rem !important; } .gt-sm\:-mr-12 { margin-right: -3rem !important; } .gt-sm\:-mb-12 { margin-bottom: -3rem !important; } .gt-sm\:-ml-12 { margin-left: -3rem !important; } .gt-sm\:-mt-14 { margin-top: -3.5rem !important; } .gt-sm\:-mr-14 { margin-right: -3.5rem !important; } .gt-sm\:-mb-14 { margin-bottom: -3.5rem !important; } .gt-sm\:-ml-14 { margin-left: -3.5rem !important; } .gt-sm\:-mt-16 { margin-top: -4rem !important; } .gt-sm\:-mr-16 { margin-right: -4rem !important; } .gt-sm\:-mb-16 { margin-bottom: -4rem !important; } .gt-sm\:-ml-16 { margin-left: -4rem !important; } .gt-sm\:-mt-18 { margin-top: -4.5rem !important; } .gt-sm\:-mr-18 { margin-right: -4.5rem !important; } .gt-sm\:-mb-18 { margin-bottom: -4.5rem !important; } .gt-sm\:-ml-18 { margin-left: -4.5rem !important; } .gt-sm\:-mt-20 { margin-top: -5rem !important; } .gt-sm\:-mr-20 { margin-right: -5rem !important; } .gt-sm\:-mb-20 { margin-bottom: -5rem !important; } .gt-sm\:-ml-20 { margin-left: -5rem !important; } .gt-sm\:-mt-22 { margin-top: -5.5rem !important; } .gt-sm\:-mr-22 { margin-right: -5.5rem !important; } .gt-sm\:-mb-22 { margin-bottom: -5.5rem !important; } .gt-sm\:-ml-22 { margin-left: -5.5rem !important; } .gt-sm\:-mt-24 { margin-top: -6rem !important; } .gt-sm\:-mr-24 { margin-right: -6rem !important; } .gt-sm\:-mb-24 { margin-bottom: -6rem !important; } .gt-sm\:-ml-24 { margin-left: -6rem !important; } .gt-sm\:-mt-26 { margin-top: -6.5rem !important; } .gt-sm\:-mr-26 { margin-right: -6.5rem !important; } .gt-sm\:-mb-26 { margin-bottom: -6.5rem !important; } .gt-sm\:-ml-26 { margin-left: -6.5rem !important; } .gt-sm\:-mt-28 { margin-top: -7rem !important; } .gt-sm\:-mr-28 { margin-right: -7rem !important; } .gt-sm\:-mb-28 { margin-bottom: -7rem !important; } .gt-sm\:-ml-28 { margin-left: -7rem !important; } .gt-sm\:-mt-30 { margin-top: -7.5rem !important; } .gt-sm\:-mr-30 { margin-right: -7.5rem !important; } .gt-sm\:-mb-30 { margin-bottom: -7.5rem !important; } .gt-sm\:-ml-30 { margin-left: -7.5rem !important; } .gt-sm\:-mt-32 { margin-top: -8rem !important; } .gt-sm\:-mr-32 { margin-right: -8rem !important; } .gt-sm\:-mb-32 { margin-bottom: -8rem !important; } .gt-sm\:-ml-32 { margin-left: -8rem !important; } .gt-sm\:-mt-36 { margin-top: -9rem !important; } .gt-sm\:-mr-36 { margin-right: -9rem !important; } .gt-sm\:-mb-36 { margin-bottom: -9rem !important; } .gt-sm\:-ml-36 { margin-left: -9rem !important; } .gt-sm\:-mt-40 { margin-top: -10rem !important; } .gt-sm\:-mr-40 { margin-right: -10rem !important; } .gt-sm\:-mb-40 { margin-bottom: -10rem !important; } .gt-sm\:-ml-40 { margin-left: -10rem !important; } .gt-sm\:-mt-48 { margin-top: -12rem !important; } .gt-sm\:-mr-48 { margin-right: -12rem !important; } .gt-sm\:-mb-48 { margin-bottom: -12rem !important; } .gt-sm\:-ml-48 { margin-left: -12rem !important; } .gt-sm\:-mt-56 { margin-top: -14rem !important; } .gt-sm\:-mr-56 { margin-right: -14rem !important; } .gt-sm\:-mb-56 { margin-bottom: -14rem !important; } .gt-sm\:-ml-56 { margin-left: -14rem !important; } .gt-sm\:-mt-64 { margin-top: -16rem !important; } .gt-sm\:-mr-64 { margin-right: -16rem !important; } .gt-sm\:-mb-64 { margin-bottom: -16rem !important; } .gt-sm\:-ml-64 { margin-left: -16rem !important; } .gt-sm\:-mt-px { margin-top: -1px !important; } .gt-sm\:-mr-px { margin-right: -1px !important; } .gt-sm\:-mb-px { margin-bottom: -1px !important; } .gt-sm\:-ml-px { margin-left: -1px !important; } .gt-sm\:-mt-2px { margin-top: -2px !important; } .gt-sm\:-mr-2px { margin-right: -2px !important; } .gt-sm\:-mb-2px { margin-bottom: -2px !important; } .gt-sm\:-ml-2px { margin-left: -2px !important; } .gt-sm\:max-h-0 { max-height: 0 !important; } .gt-sm\:max-h-1 { max-height: 0.25rem !important; } .gt-sm\:max-h-2 { max-height: 0.5rem !important; } .gt-sm\:max-h-3 { max-height: 0.75rem !important; } .gt-sm\:max-h-4 { max-height: 1rem !important; } .gt-sm\:max-h-5 { max-height: 1.25rem !important; } .gt-sm\:max-h-6 { max-height: 1.5rem !important; } .gt-sm\:max-h-8 { max-height: 2rem !important; } .gt-sm\:max-h-10 { max-height: 2.5rem !important; } .gt-sm\:max-h-12 { max-height: 3rem !important; } .gt-sm\:max-h-14 { max-height: 3.5rem !important; } .gt-sm\:max-h-16 { max-height: 4rem !important; } .gt-sm\:max-h-18 { max-height: 4.5rem !important; } .gt-sm\:max-h-20 { max-height: 5rem !important; } .gt-sm\:max-h-22 { max-height: 5.5rem !important; } .gt-sm\:max-h-24 { max-height: 6rem !important; } .gt-sm\:max-h-26 { max-height: 6.5rem !important; } .gt-sm\:max-h-28 { max-height: 7rem !important; } .gt-sm\:max-h-30 { max-height: 7.5rem !important; } .gt-sm\:max-h-32 { max-height: 8rem !important; } .gt-sm\:max-h-36 { max-height: 9rem !important; } .gt-sm\:max-h-40 { max-height: 10rem !important; } .gt-sm\:max-h-48 { max-height: 12rem !important; } .gt-sm\:max-h-50 { max-height: 12.5rem !important; } .gt-sm\:max-h-56 { max-height: 14rem !important; } .gt-sm\:max-h-60 { max-height: 15rem !important; } .gt-sm\:max-h-64 { max-height: 16rem !important; } .gt-sm\:max-h-80 { max-height: 20rem !important; } .gt-sm\:max-h-90 { max-height: 24rem !important; } .gt-sm\:max-h-100 { max-height: 25rem !important; } .gt-sm\:max-h-120 { max-height: 30rem !important; } .gt-sm\:max-h-128 { max-height: 32rem !important; } .gt-sm\:max-h-140 { max-height: 35rem !important; } .gt-sm\:max-h-160 { max-height: 40rem !important; } .gt-sm\:max-h-180 { max-height: 45rem !important; } .gt-sm\:max-h-192 { max-height: 48rem !important; } .gt-sm\:max-h-200 { max-height: 50rem !important; } .gt-sm\:max-h-240 { max-height: 60rem !important; } .gt-sm\:max-h-256 { max-height: 64rem !important; } .gt-sm\:max-h-280 { max-height: 70rem !important; } .gt-sm\:max-h-320 { max-height: 80rem !important; } .gt-sm\:max-h-360 { max-height: 90rem !important; } .gt-sm\:max-h-400 { max-height: 100rem !important; } .gt-sm\:max-h-480 { max-height: 120rem !important; } .gt-sm\:max-h-full { max-height: 100% !important; } .gt-sm\:max-h-screen { max-height: 100vh !important; } .gt-sm\:max-h-none { max-height: none !important; } .gt-sm\:max-h-px { max-height: 1px !important; } .gt-sm\:max-h-2px { max-height: 2px !important; } .gt-sm\:max-h-1\/2 { max-height: 50% !important; } .gt-sm\:max-h-1\/3 { max-height: 33.33333% !important; } .gt-sm\:max-h-2\/3 { max-height: 66.66667% !important; } .gt-sm\:max-h-1\/4 { max-height: 25% !important; } .gt-sm\:max-h-2\/4 { max-height: 50% !important; } .gt-sm\:max-h-3\/4 { max-height: 75% !important; } .gt-sm\:max-h-1\/5 { max-height: 20% !important; } .gt-sm\:max-h-2\/5 { max-height: 40% !important; } .gt-sm\:max-h-3\/5 { max-height: 60% !important; } .gt-sm\:max-h-4\/5 { max-height: 80% !important; } .gt-sm\:max-h-1\/12 { max-height: 8.33333% !important; } .gt-sm\:max-h-2\/12 { max-height: 16.66667% !important; } .gt-sm\:max-h-3\/12 { max-height: 25% !important; } .gt-sm\:max-h-4\/12 { max-height: 33.33333% !important; } .gt-sm\:max-h-5\/12 { max-height: 41.66667% !important; } .gt-sm\:max-h-6\/12 { max-height: 50% !important; } .gt-sm\:max-h-7\/12 { max-height: 58.33333% !important; } .gt-sm\:max-h-8\/12 { max-height: 66.66667% !important; } .gt-sm\:max-h-9\/12 { max-height: 75% !important; } .gt-sm\:max-h-10\/12 { max-height: 83.33333% !important; } .gt-sm\:max-h-11\/12 { max-height: 91.66667% !important; } .gt-sm\:max-w-0 { max-width: 0 !important; } .gt-sm\:max-w-1 { max-width: 0.25rem !important; } .gt-sm\:max-w-2 { max-width: 0.5rem !important; } .gt-sm\:max-w-3 { max-width: 0.75rem !important; } .gt-sm\:max-w-4 { max-width: 1rem !important; } .gt-sm\:max-w-5 { max-width: 1.25rem !important; } .gt-sm\:max-w-6 { max-width: 1.5rem !important; } .gt-sm\:max-w-8 { max-width: 2rem !important; } .gt-sm\:max-w-10 { max-width: 2.5rem !important; } .gt-sm\:max-w-12 { max-width: 3rem !important; } .gt-sm\:max-w-14 { max-width: 3.5rem !important; } .gt-sm\:max-w-16 { max-width: 4rem !important; } .gt-sm\:max-w-18 { max-width: 4.5rem !important; } .gt-sm\:max-w-20 { max-width: 5rem !important; } .gt-sm\:max-w-22 { max-width: 5.5rem !important; } .gt-sm\:max-w-24 { max-width: 6rem !important; } .gt-sm\:max-w-26 { max-width: 6.5rem !important; } .gt-sm\:max-w-28 { max-width: 7rem !important; } .gt-sm\:max-w-30 { max-width: 7.5rem !important; } .gt-sm\:max-w-32 { max-width: 8rem !important; } .gt-sm\:max-w-36 { max-width: 9rem !important; } .gt-sm\:max-w-40 { max-width: 10rem !important; } .gt-sm\:max-w-48 { max-width: 12rem !important; } .gt-sm\:max-w-50 { max-width: 12.5rem !important; } .gt-sm\:max-w-56 { max-width: 14rem !important; } .gt-sm\:max-w-60 { max-width: 15rem !important; } .gt-sm\:max-w-64 { max-width: 16rem !important; } .gt-sm\:max-w-80 { max-width: 20rem !important; } .gt-sm\:max-w-90 { max-width: 24rem !important; } .gt-sm\:max-w-100 { max-width: 25rem !important; } .gt-sm\:max-w-120 { max-width: 30rem !important; } .gt-sm\:max-w-128 { max-width: 32rem !important; } .gt-sm\:max-w-140 { max-width: 35rem !important; } .gt-sm\:max-w-160 { max-width: 40rem !important; } .gt-sm\:max-w-180 { max-width: 45rem !important; } .gt-sm\:max-w-192 { max-width: 48rem !important; } .gt-sm\:max-w-200 { max-width: 50rem !important; } .gt-sm\:max-w-240 { max-width: 60rem !important; } .gt-sm\:max-w-256 { max-width: 64rem !important; } .gt-sm\:max-w-280 { max-width: 70rem !important; } .gt-sm\:max-w-320 { max-width: 80rem !important; } .gt-sm\:max-w-360 { max-width: 90rem !important; } .gt-sm\:max-w-400 { max-width: 100rem !important; } .gt-sm\:max-w-480 { max-width: 120rem !important; } .gt-sm\:max-w-none { max-width: none !important; } .gt-sm\:max-w-xs { max-width: 20rem !important; } .gt-sm\:max-w-sm { max-width: 24rem !important; } .gt-sm\:max-w-md { max-width: 28rem !important; } .gt-sm\:max-w-lg { max-width: 32rem !important; } .gt-sm\:max-w-xl { max-width: 36rem !important; } .gt-sm\:max-w-2xl { max-width: 42rem !important; } .gt-sm\:max-w-3xl { max-width: 48rem !important; } .gt-sm\:max-w-4xl { max-width: 56rem !important; } .gt-sm\:max-w-5xl { max-width: 64rem !important; } .gt-sm\:max-w-6xl { max-width: 72rem !important; } .gt-sm\:max-w-full { max-width: 100% !important; } .gt-sm\:max-w-screen { max-width: 100vw !important; } .gt-sm\:max-w-px { max-width: 1px !important; } .gt-sm\:max-w-2px { max-width: 2px !important; } .gt-sm\:max-w-1\/2 { max-width: 50% !important; } .gt-sm\:max-w-1\/3 { max-width: 33.33333% !important; } .gt-sm\:max-w-2\/3 { max-width: 66.66667% !important; } .gt-sm\:max-w-1\/4 { max-width: 25% !important; } .gt-sm\:max-w-2\/4 { max-width: 50% !important; } .gt-sm\:max-w-3\/4 { max-width: 75% !important; } .gt-sm\:max-w-1\/5 { max-width: 20% !important; } .gt-sm\:max-w-2\/5 { max-width: 40% !important; } .gt-sm\:max-w-3\/5 { max-width: 60% !important; } .gt-sm\:max-w-4\/5 { max-width: 80% !important; } .gt-sm\:max-w-1\/12 { max-width: 8.33333% !important; } .gt-sm\:max-w-2\/12 { max-width: 16.66667% !important; } .gt-sm\:max-w-3\/12 { max-width: 25% !important; } .gt-sm\:max-w-4\/12 { max-width: 33.33333% !important; } .gt-sm\:max-w-5\/12 { max-width: 41.66667% !important; } .gt-sm\:max-w-6\/12 { max-width: 50% !important; } .gt-sm\:max-w-7\/12 { max-width: 58.33333% !important; } .gt-sm\:max-w-8\/12 { max-width: 66.66667% !important; } .gt-sm\:max-w-9\/12 { max-width: 75% !important; } .gt-sm\:max-w-10\/12 { max-width: 83.33333% !important; } .gt-sm\:max-w-11\/12 { max-width: 91.66667% !important; } .gt-sm\:min-h-0 { min-height: 0 !important; } .gt-sm\:min-h-1 { min-height: 0.25rem !important; } .gt-sm\:min-h-2 { min-height: 0.5rem !important; } .gt-sm\:min-h-3 { min-height: 0.75rem !important; } .gt-sm\:min-h-4 { min-height: 1rem !important; } .gt-sm\:min-h-5 { min-height: 1.25rem !important; } .gt-sm\:min-h-6 { min-height: 1.5rem !important; } .gt-sm\:min-h-8 { min-height: 2rem !important; } .gt-sm\:min-h-10 { min-height: 2.5rem !important; } .gt-sm\:min-h-12 { min-height: 3rem !important; } .gt-sm\:min-h-14 { min-height: 3.5rem !important; } .gt-sm\:min-h-16 { min-height: 4rem !important; } .gt-sm\:min-h-18 { min-height: 4.5rem !important; } .gt-sm\:min-h-20 { min-height: 5rem !important; } .gt-sm\:min-h-22 { min-height: 5.5rem !important; } .gt-sm\:min-h-24 { min-height: 6rem !important; } .gt-sm\:min-h-26 { min-height: 6.5rem !important; } .gt-sm\:min-h-28 { min-height: 7rem !important; } .gt-sm\:min-h-30 { min-height: 7.5rem !important; } .gt-sm\:min-h-32 { min-height: 8rem !important; } .gt-sm\:min-h-36 { min-height: 9rem !important; } .gt-sm\:min-h-40 { min-height: 10rem !important; } .gt-sm\:min-h-48 { min-height: 12rem !important; } .gt-sm\:min-h-50 { min-height: 12.5rem !important; } .gt-sm\:min-h-56 { min-height: 14rem !important; } .gt-sm\:min-h-60 { min-height: 15rem !important; } .gt-sm\:min-h-64 { min-height: 16rem !important; } .gt-sm\:min-h-80 { min-height: 20rem !important; } .gt-sm\:min-h-90 { min-height: 24rem !important; } .gt-sm\:min-h-100 { min-height: 25rem !important; } .gt-sm\:min-h-120 { min-height: 30rem !important; } .gt-sm\:min-h-128 { min-height: 32rem !important; } .gt-sm\:min-h-140 { min-height: 35rem !important; } .gt-sm\:min-h-160 { min-height: 40rem !important; } .gt-sm\:min-h-180 { min-height: 45rem !important; } .gt-sm\:min-h-192 { min-height: 48rem !important; } .gt-sm\:min-h-200 { min-height: 50rem !important; } .gt-sm\:min-h-240 { min-height: 60rem !important; } .gt-sm\:min-h-256 { min-height: 64rem !important; } .gt-sm\:min-h-280 { min-height: 70rem !important; } .gt-sm\:min-h-320 { min-height: 80rem !important; } .gt-sm\:min-h-360 { min-height: 90rem !important; } .gt-sm\:min-h-400 { min-height: 100rem !important; } .gt-sm\:min-h-480 { min-height: 120rem !important; } .gt-sm\:min-h-full { min-height: 100% !important; } .gt-sm\:min-h-screen { min-height: 100vh !important; } .gt-sm\:min-h-px { min-height: 1px !important; } .gt-sm\:min-h-2px { min-height: 2px !important; } .gt-sm\:min-h-1\/2 { min-height: 50% !important; } .gt-sm\:min-h-1\/3 { min-height: 33.33333% !important; } .gt-sm\:min-h-2\/3 { min-height: 66.66667% !important; } .gt-sm\:min-h-1\/4 { min-height: 25% !important; } .gt-sm\:min-h-2\/4 { min-height: 50% !important; } .gt-sm\:min-h-3\/4 { min-height: 75% !important; } .gt-sm\:min-h-1\/5 { min-height: 20% !important; } .gt-sm\:min-h-2\/5 { min-height: 40% !important; } .gt-sm\:min-h-3\/5 { min-height: 60% !important; } .gt-sm\:min-h-4\/5 { min-height: 80% !important; } .gt-sm\:min-h-1\/12 { min-height: 8.33333% !important; } .gt-sm\:min-h-2\/12 { min-height: 16.66667% !important; } .gt-sm\:min-h-3\/12 { min-height: 25% !important; } .gt-sm\:min-h-4\/12 { min-height: 33.33333% !important; } .gt-sm\:min-h-5\/12 { min-height: 41.66667% !important; } .gt-sm\:min-h-6\/12 { min-height: 50% !important; } .gt-sm\:min-h-7\/12 { min-height: 58.33333% !important; } .gt-sm\:min-h-8\/12 { min-height: 66.66667% !important; } .gt-sm\:min-h-9\/12 { min-height: 75% !important; } .gt-sm\:min-h-10\/12 { min-height: 83.33333% !important; } .gt-sm\:min-h-11\/12 { min-height: 91.66667% !important; } .gt-sm\:min-w-0 { min-width: 0 !important; } .gt-sm\:min-w-1 { min-width: 0.25rem !important; } .gt-sm\:min-w-2 { min-width: 0.5rem !important; } .gt-sm\:min-w-3 { min-width: 0.75rem !important; } .gt-sm\:min-w-4 { min-width: 1rem !important; } .gt-sm\:min-w-5 { min-width: 1.25rem !important; } .gt-sm\:min-w-6 { min-width: 1.5rem !important; } .gt-sm\:min-w-8 { min-width: 2rem !important; } .gt-sm\:min-w-10 { min-width: 2.5rem !important; } .gt-sm\:min-w-12 { min-width: 3rem !important; } .gt-sm\:min-w-14 { min-width: 3.5rem !important; } .gt-sm\:min-w-16 { min-width: 4rem !important; } .gt-sm\:min-w-18 { min-width: 4.5rem !important; } .gt-sm\:min-w-20 { min-width: 5rem !important; } .gt-sm\:min-w-22 { min-width: 5.5rem !important; } .gt-sm\:min-w-24 { min-width: 6rem !important; } .gt-sm\:min-w-26 { min-width: 6.5rem !important; } .gt-sm\:min-w-28 { min-width: 7rem !important; } .gt-sm\:min-w-30 { min-width: 7.5rem !important; } .gt-sm\:min-w-32 { min-width: 8rem !important; } .gt-sm\:min-w-36 { min-width: 9rem !important; } .gt-sm\:min-w-40 { min-width: 10rem !important; } .gt-sm\:min-w-48 { min-width: 12rem !important; } .gt-sm\:min-w-50 { min-width: 12.5rem !important; } .gt-sm\:min-w-56 { min-width: 14rem !important; } .gt-sm\:min-w-60 { min-width: 15rem !important; } .gt-sm\:min-w-64 { min-width: 16rem !important; } .gt-sm\:min-w-80 { min-width: 20rem !important; } .gt-sm\:min-w-90 { min-width: 24rem !important; } .gt-sm\:min-w-100 { min-width: 25rem !important; } .gt-sm\:min-w-120 { min-width: 30rem !important; } .gt-sm\:min-w-128 { min-width: 32rem !important; } .gt-sm\:min-w-140 { min-width: 35rem !important; } .gt-sm\:min-w-160 { min-width: 40rem !important; } .gt-sm\:min-w-180 { min-width: 45rem !important; } .gt-sm\:min-w-192 { min-width: 48rem !important; } .gt-sm\:min-w-200 { min-width: 50rem !important; } .gt-sm\:min-w-240 { min-width: 60rem !important; } .gt-sm\:min-w-256 { min-width: 64rem !important; } .gt-sm\:min-w-280 { min-width: 70rem !important; } .gt-sm\:min-w-320 { min-width: 80rem !important; } .gt-sm\:min-w-360 { min-width: 90rem !important; } .gt-sm\:min-w-400 { min-width: 100rem !important; } .gt-sm\:min-w-480 { min-width: 120rem !important; } .gt-sm\:min-w-full { min-width: 100% !important; } .gt-sm\:min-w-screen { min-width: 100vw !important; } .gt-sm\:min-w-px { min-width: 1px !important; } .gt-sm\:min-w-2px { min-width: 2px !important; } .gt-sm\:min-w-1\/2 { min-width: 50% !important; } .gt-sm\:min-w-1\/3 { min-width: 33.33333% !important; } .gt-sm\:min-w-2\/3 { min-width: 66.66667% !important; } .gt-sm\:min-w-1\/4 { min-width: 25% !important; } .gt-sm\:min-w-2\/4 { min-width: 50% !important; } .gt-sm\:min-w-3\/4 { min-width: 75% !important; } .gt-sm\:min-w-1\/5 { min-width: 20% !important; } .gt-sm\:min-w-2\/5 { min-width: 40% !important; } .gt-sm\:min-w-3\/5 { min-width: 60% !important; } .gt-sm\:min-w-4\/5 { min-width: 80% !important; } .gt-sm\:min-w-1\/12 { min-width: 8.33333% !important; } .gt-sm\:min-w-2\/12 { min-width: 16.66667% !important; } .gt-sm\:min-w-3\/12 { min-width: 25% !important; } .gt-sm\:min-w-4\/12 { min-width: 33.33333% !important; } .gt-sm\:min-w-5\/12 { min-width: 41.66667% !important; } .gt-sm\:min-w-6\/12 { min-width: 50% !important; } .gt-sm\:min-w-7\/12 { min-width: 58.33333% !important; } .gt-sm\:min-w-8\/12 { min-width: 66.66667% !important; } .gt-sm\:min-w-9\/12 { min-width: 75% !important; } .gt-sm\:min-w-10\/12 { min-width: 83.33333% !important; } .gt-sm\:min-w-11\/12 { min-width: 91.66667% !important; } .gt-sm\:object-contain { -o-object-fit: contain !important; object-fit: contain !important; } .gt-sm\:object-cover { -o-object-fit: cover !important; object-fit: cover !important; } .gt-sm\:object-fill { -o-object-fit: fill !important; object-fit: fill !important; } .gt-sm\:object-none { -o-object-fit: none !important; object-fit: none !important; } .gt-sm\:object-scale-down { -o-object-fit: scale-down !important; object-fit: scale-down !important; } .gt-sm\:object-bottom { -o-object-position: bottom !important; object-position: bottom !important; } .gt-sm\:object-center { -o-object-position: center !important; object-position: center !important; } .gt-sm\:object-left { -o-object-position: left !important; object-position: left !important; } .gt-sm\:object-left-bottom { -o-object-position: left bottom !important; object-position: left bottom !important; } .gt-sm\:object-left-top { -o-object-position: left top !important; object-position: left top !important; } .gt-sm\:object-right { -o-object-position: right !important; object-position: right !important; } .gt-sm\:object-right-bottom { -o-object-position: right bottom !important; object-position: right bottom !important; } .gt-sm\:object-right-top { -o-object-position: right top !important; object-position: right top !important; } .gt-sm\:object-top { -o-object-position: top !important; object-position: top !important; } .gt-sm\:opacity-0 { opacity: 0 !important; } .gt-sm\:opacity-12 { opacity: 0.12 !important; } .gt-sm\:opacity-25 { opacity: 0.25 !important; } .gt-sm\:opacity-38 { opacity: 0.38 !important; } .gt-sm\:opacity-50 { opacity: 0.5 !important; } .gt-sm\:opacity-54 { opacity: 0.54 !important; } .gt-sm\:opacity-70 { opacity: 0.70 !important; } .gt-sm\:opacity-75 { opacity: 0.75 !important; } .gt-sm\:opacity-84 { opacity: 0.84 !important; } .gt-sm\:opacity-100 { opacity: 1 !important; } .gt-sm\:hover\:opacity-0:hover { opacity: 0 !important; } .gt-sm\:hover\:opacity-12:hover { opacity: 0.12 !important; } .gt-sm\:hover\:opacity-25:hover { opacity: 0.25 !important; } .gt-sm\:hover\:opacity-38:hover { opacity: 0.38 !important; } .gt-sm\:hover\:opacity-50:hover { opacity: 0.5 !important; } .gt-sm\:hover\:opacity-54:hover { opacity: 0.54 !important; } .gt-sm\:hover\:opacity-70:hover { opacity: 0.70 !important; } .gt-sm\:hover\:opacity-75:hover { opacity: 0.75 !important; } .gt-sm\:hover\:opacity-84:hover { opacity: 0.84 !important; } .gt-sm\:hover\:opacity-100:hover { opacity: 1 !important; } .gt-sm\:focus\:opacity-0:focus { opacity: 0 !important; } .gt-sm\:focus\:opacity-12:focus { opacity: 0.12 !important; } .gt-sm\:focus\:opacity-25:focus { opacity: 0.25 !important; } .gt-sm\:focus\:opacity-38:focus { opacity: 0.38 !important; } .gt-sm\:focus\:opacity-50:focus { opacity: 0.5 !important; } .gt-sm\:focus\:opacity-54:focus { opacity: 0.54 !important; } .gt-sm\:focus\:opacity-70:focus { opacity: 0.70 !important; } .gt-sm\:focus\:opacity-75:focus { opacity: 0.75 !important; } .gt-sm\:focus\:opacity-84:focus { opacity: 0.84 !important; } .gt-sm\:focus\:opacity-100:focus { opacity: 1 !important; } .gt-sm\:outline-none { outline: 0 !important; } .gt-sm\:focus\:outline-none:focus { outline: 0 !important; } .gt-sm\:overflow-auto { overflow: auto !important; } .gt-sm\:overflow-hidden { overflow: hidden !important; } .gt-sm\:overflow-visible { overflow: visible !important; } .gt-sm\:overflow-scroll { overflow: scroll !important; } .gt-sm\:overflow-x-auto { overflow-x: auto !important; } .gt-sm\:overflow-y-auto { overflow-y: auto !important; } .gt-sm\:overflow-x-hidden { overflow-x: hidden !important; } .gt-sm\:overflow-y-hidden { overflow-y: hidden !important; } .gt-sm\:overflow-x-visible { overflow-x: visible !important; } .gt-sm\:overflow-y-visible { overflow-y: visible !important; } .gt-sm\:overflow-x-scroll { overflow-x: scroll !important; } .gt-sm\:overflow-y-scroll { overflow-y: scroll !important; } .gt-sm\:scrolling-touch { -webkit-overflow-scrolling: touch !important; } .gt-sm\:scrolling-auto { -webkit-overflow-scrolling: auto !important; } .gt-sm\:p-0 { padding: 0 !important; } .gt-sm\:p-1 { padding: 0.25rem !important; } .gt-sm\:p-2 { padding: 0.5rem !important; } .gt-sm\:p-3 { padding: 0.75rem !important; } .gt-sm\:p-4 { padding: 1rem !important; } .gt-sm\:p-5 { padding: 1.25rem !important; } .gt-sm\:p-6 { padding: 1.5rem !important; } .gt-sm\:p-8 { padding: 2rem !important; } .gt-sm\:p-10 { padding: 2.5rem !important; } .gt-sm\:p-12 { padding: 3rem !important; } .gt-sm\:p-14 { padding: 3.5rem !important; } .gt-sm\:p-16 { padding: 4rem !important; } .gt-sm\:p-18 { padding: 4.5rem !important; } .gt-sm\:p-20 { padding: 5rem !important; } .gt-sm\:p-22 { padding: 5.5rem !important; } .gt-sm\:p-24 { padding: 6rem !important; } .gt-sm\:p-26 { padding: 6.5rem !important; } .gt-sm\:p-28 { padding: 7rem !important; } .gt-sm\:p-30 { padding: 7.5rem !important; } .gt-sm\:p-32 { padding: 8rem !important; } .gt-sm\:p-36 { padding: 9rem !important; } .gt-sm\:p-40 { padding: 10rem !important; } .gt-sm\:p-48 { padding: 12rem !important; } .gt-sm\:p-56 { padding: 14rem !important; } .gt-sm\:p-64 { padding: 16rem !important; } .gt-sm\:p-px { padding: 1px !important; } .gt-sm\:p-2px { padding: 2px !important; } .gt-sm\:py-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .gt-sm\:px-0 { padding-left: 0 !important; padding-right: 0 !important; } .gt-sm\:py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .gt-sm\:px-1 { padding-left: 0.25rem !important; padding-right: 0.25rem !important; } .gt-sm\:py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .gt-sm\:px-2 { padding-left: 0.5rem !important; padding-right: 0.5rem !important; } .gt-sm\:py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .gt-sm\:px-3 { padding-left: 0.75rem !important; padding-right: 0.75rem !important; } .gt-sm\:py-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .gt-sm\:px-4 { padding-left: 1rem !important; padding-right: 1rem !important; } .gt-sm\:py-5 { padding-top: 1.25rem !important; padding-bottom: 1.25rem !important; } .gt-sm\:px-5 { padding-left: 1.25rem !important; padding-right: 1.25rem !important; } .gt-sm\:py-6 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .gt-sm\:px-6 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } .gt-sm\:py-8 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .gt-sm\:px-8 { padding-left: 2rem !important; padding-right: 2rem !important; } .gt-sm\:py-10 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .gt-sm\:px-10 { padding-left: 2.5rem !important; padding-right: 2.5rem !important; } .gt-sm\:py-12 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .gt-sm\:px-12 { padding-left: 3rem !important; padding-right: 3rem !important; } .gt-sm\:py-14 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .gt-sm\:px-14 { padding-left: 3.5rem !important; padding-right: 3.5rem !important; } .gt-sm\:py-16 { padding-top: 4rem !important; padding-bottom: 4rem !important; } .gt-sm\:px-16 { padding-left: 4rem !important; padding-right: 4rem !important; } .gt-sm\:py-18 { padding-top: 4.5rem !important; padding-bottom: 4.5rem !important; } .gt-sm\:px-18 { padding-left: 4.5rem !important; padding-right: 4.5rem !important; } .gt-sm\:py-20 { padding-top: 5rem !important; padding-bottom: 5rem !important; } .gt-sm\:px-20 { padding-left: 5rem !important; padding-right: 5rem !important; } .gt-sm\:py-22 { padding-top: 5.5rem !important; padding-bottom: 5.5rem !important; } .gt-sm\:px-22 { padding-left: 5.5rem !important; padding-right: 5.5rem !important; } .gt-sm\:py-24 { padding-top: 6rem !important; padding-bottom: 6rem !important; } .gt-sm\:px-24 { padding-left: 6rem !important; padding-right: 6rem !important; } .gt-sm\:py-26 { padding-top: 6.5rem !important; padding-bottom: 6.5rem !important; } .gt-sm\:px-26 { padding-left: 6.5rem !important; padding-right: 6.5rem !important; } .gt-sm\:py-28 { padding-top: 7rem !important; padding-bottom: 7rem !important; } .gt-sm\:px-28 { padding-left: 7rem !important; padding-right: 7rem !important; } .gt-sm\:py-30 { padding-top: 7.5rem !important; padding-bottom: 7.5rem !important; } .gt-sm\:px-30 { padding-left: 7.5rem !important; padding-right: 7.5rem !important; } .gt-sm\:py-32 { padding-top: 8rem !important; padding-bottom: 8rem !important; } .gt-sm\:px-32 { padding-left: 8rem !important; padding-right: 8rem !important; } .gt-sm\:py-36 { padding-top: 9rem !important; padding-bottom: 9rem !important; } .gt-sm\:px-36 { padding-left: 9rem !important; padding-right: 9rem !important; } .gt-sm\:py-40 { padding-top: 10rem !important; padding-bottom: 10rem !important; } .gt-sm\:px-40 { padding-left: 10rem !important; padding-right: 10rem !important; } .gt-sm\:py-48 { padding-top: 12rem !important; padding-bottom: 12rem !important; } .gt-sm\:px-48 { padding-left: 12rem !important; padding-right: 12rem !important; } .gt-sm\:py-56 { padding-top: 14rem !important; padding-bottom: 14rem !important; } .gt-sm\:px-56 { padding-left: 14rem !important; padding-right: 14rem !important; } .gt-sm\:py-64 { padding-top: 16rem !important; padding-bottom: 16rem !important; } .gt-sm\:px-64 { padding-left: 16rem !important; padding-right: 16rem !important; } .gt-sm\:py-px { padding-top: 1px !important; padding-bottom: 1px !important; } .gt-sm\:px-px { padding-left: 1px !important; padding-right: 1px !important; } .gt-sm\:py-2px { padding-top: 2px !important; padding-bottom: 2px !important; } .gt-sm\:px-2px { padding-left: 2px !important; padding-right: 2px !important; } .gt-sm\:pt-0 { padding-top: 0 !important; } .gt-sm\:pr-0 { padding-right: 0 !important; } .gt-sm\:pb-0 { padding-bottom: 0 !important; } .gt-sm\:pl-0 { padding-left: 0 !important; } .gt-sm\:pt-1 { padding-top: 0.25rem !important; } .gt-sm\:pr-1 { padding-right: 0.25rem !important; } .gt-sm\:pb-1 { padding-bottom: 0.25rem !important; } .gt-sm\:pl-1 { padding-left: 0.25rem !important; } .gt-sm\:pt-2 { padding-top: 0.5rem !important; } .gt-sm\:pr-2 { padding-right: 0.5rem !important; } .gt-sm\:pb-2 { padding-bottom: 0.5rem !important; } .gt-sm\:pl-2 { padding-left: 0.5rem !important; } .gt-sm\:pt-3 { padding-top: 0.75rem !important; } .gt-sm\:pr-3 { padding-right: 0.75rem !important; } .gt-sm\:pb-3 { padding-bottom: 0.75rem !important; } .gt-sm\:pl-3 { padding-left: 0.75rem !important; } .gt-sm\:pt-4 { padding-top: 1rem !important; } .gt-sm\:pr-4 { padding-right: 1rem !important; } .gt-sm\:pb-4 { padding-bottom: 1rem !important; } .gt-sm\:pl-4 { padding-left: 1rem !important; } .gt-sm\:pt-5 { padding-top: 1.25rem !important; } .gt-sm\:pr-5 { padding-right: 1.25rem !important; } .gt-sm\:pb-5 { padding-bottom: 1.25rem !important; } .gt-sm\:pl-5 { padding-left: 1.25rem !important; } .gt-sm\:pt-6 { padding-top: 1.5rem !important; } .gt-sm\:pr-6 { padding-right: 1.5rem !important; } .gt-sm\:pb-6 { padding-bottom: 1.5rem !important; } .gt-sm\:pl-6 { padding-left: 1.5rem !important; } .gt-sm\:pt-8 { padding-top: 2rem !important; } .gt-sm\:pr-8 { padding-right: 2rem !important; } .gt-sm\:pb-8 { padding-bottom: 2rem !important; } .gt-sm\:pl-8 { padding-left: 2rem !important; } .gt-sm\:pt-10 { padding-top: 2.5rem !important; } .gt-sm\:pr-10 { padding-right: 2.5rem !important; } .gt-sm\:pb-10 { padding-bottom: 2.5rem !important; } .gt-sm\:pl-10 { padding-left: 2.5rem !important; } .gt-sm\:pt-12 { padding-top: 3rem !important; } .gt-sm\:pr-12 { padding-right: 3rem !important; } .gt-sm\:pb-12 { padding-bottom: 3rem !important; } .gt-sm\:pl-12 { padding-left: 3rem !important; } .gt-sm\:pt-14 { padding-top: 3.5rem !important; } .gt-sm\:pr-14 { padding-right: 3.5rem !important; } .gt-sm\:pb-14 { padding-bottom: 3.5rem !important; } .gt-sm\:pl-14 { padding-left: 3.5rem !important; } .gt-sm\:pt-16 { padding-top: 4rem !important; } .gt-sm\:pr-16 { padding-right: 4rem !important; } .gt-sm\:pb-16 { padding-bottom: 4rem !important; } .gt-sm\:pl-16 { padding-left: 4rem !important; } .gt-sm\:pt-18 { padding-top: 4.5rem !important; } .gt-sm\:pr-18 { padding-right: 4.5rem !important; } .gt-sm\:pb-18 { padding-bottom: 4.5rem !important; } .gt-sm\:pl-18 { padding-left: 4.5rem !important; } .gt-sm\:pt-20 { padding-top: 5rem !important; } .gt-sm\:pr-20 { padding-right: 5rem !important; } .gt-sm\:pb-20 { padding-bottom: 5rem !important; } .gt-sm\:pl-20 { padding-left: 5rem !important; } .gt-sm\:pt-22 { padding-top: 5.5rem !important; } .gt-sm\:pr-22 { padding-right: 5.5rem !important; } .gt-sm\:pb-22 { padding-bottom: 5.5rem !important; } .gt-sm\:pl-22 { padding-left: 5.5rem !important; } .gt-sm\:pt-24 { padding-top: 6rem !important; } .gt-sm\:pr-24 { padding-right: 6rem !important; } .gt-sm\:pb-24 { padding-bottom: 6rem !important; } .gt-sm\:pl-24 { padding-left: 6rem !important; } .gt-sm\:pt-26 { padding-top: 6.5rem !important; } .gt-sm\:pr-26 { padding-right: 6.5rem !important; } .gt-sm\:pb-26 { padding-bottom: 6.5rem !important; } .gt-sm\:pl-26 { padding-left: 6.5rem !important; } .gt-sm\:pt-28 { padding-top: 7rem !important; } .gt-sm\:pr-28 { padding-right: 7rem !important; } .gt-sm\:pb-28 { padding-bottom: 7rem !important; } .gt-sm\:pl-28 { padding-left: 7rem !important; } .gt-sm\:pt-30 { padding-top: 7.5rem !important; } .gt-sm\:pr-30 { padding-right: 7.5rem !important; } .gt-sm\:pb-30 { padding-bottom: 7.5rem !important; } .gt-sm\:pl-30 { padding-left: 7.5rem !important; } .gt-sm\:pt-32 { padding-top: 8rem !important; } .gt-sm\:pr-32 { padding-right: 8rem !important; } .gt-sm\:pb-32 { padding-bottom: 8rem !important; } .gt-sm\:pl-32 { padding-left: 8rem !important; } .gt-sm\:pt-36 { padding-top: 9rem !important; } .gt-sm\:pr-36 { padding-right: 9rem !important; } .gt-sm\:pb-36 { padding-bottom: 9rem !important; } .gt-sm\:pl-36 { padding-left: 9rem !important; } .gt-sm\:pt-40 { padding-top: 10rem !important; } .gt-sm\:pr-40 { padding-right: 10rem !important; } .gt-sm\:pb-40 { padding-bottom: 10rem !important; } .gt-sm\:pl-40 { padding-left: 10rem !important; } .gt-sm\:pt-48 { padding-top: 12rem !important; } .gt-sm\:pr-48 { padding-right: 12rem !important; } .gt-sm\:pb-48 { padding-bottom: 12rem !important; } .gt-sm\:pl-48 { padding-left: 12rem !important; } .gt-sm\:pt-56 { padding-top: 14rem !important; } .gt-sm\:pr-56 { padding-right: 14rem !important; } .gt-sm\:pb-56 { padding-bottom: 14rem !important; } .gt-sm\:pl-56 { padding-left: 14rem !important; } .gt-sm\:pt-64 { padding-top: 16rem !important; } .gt-sm\:pr-64 { padding-right: 16rem !important; } .gt-sm\:pb-64 { padding-bottom: 16rem !important; } .gt-sm\:pl-64 { padding-left: 16rem !important; } .gt-sm\:pt-px { padding-top: 1px !important; } .gt-sm\:pr-px { padding-right: 1px !important; } .gt-sm\:pb-px { padding-bottom: 1px !important; } .gt-sm\:pl-px { padding-left: 1px !important; } .gt-sm\:pt-2px { padding-top: 2px !important; } .gt-sm\:pr-2px { padding-right: 2px !important; } .gt-sm\:pb-2px { padding-bottom: 2px !important; } .gt-sm\:pl-2px { padding-left: 2px !important; } .gt-sm\:placeholder-opacity-0::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .gt-sm\:placeholder-opacity-0::-moz-placeholder { --placeholder-opacity: 0 !important; } .gt-sm\:placeholder-opacity-0::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .gt-sm\:placeholder-opacity-0::placeholder { --placeholder-opacity: 0 !important; } .gt-sm\:placeholder-opacity-12::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .gt-sm\:placeholder-opacity-12::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .gt-sm\:placeholder-opacity-12::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .gt-sm\:placeholder-opacity-12::placeholder { --placeholder-opacity: 0.12 !important; } .gt-sm\:placeholder-opacity-25::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .gt-sm\:placeholder-opacity-25::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .gt-sm\:placeholder-opacity-25::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .gt-sm\:placeholder-opacity-25::placeholder { --placeholder-opacity: 0.25 !important; } .gt-sm\:placeholder-opacity-38::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .gt-sm\:placeholder-opacity-38::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .gt-sm\:placeholder-opacity-38::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .gt-sm\:placeholder-opacity-38::placeholder { --placeholder-opacity: 0.38 !important; } .gt-sm\:placeholder-opacity-50::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .gt-sm\:placeholder-opacity-50::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .gt-sm\:placeholder-opacity-50::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .gt-sm\:placeholder-opacity-50::placeholder { --placeholder-opacity: 0.5 !important; } .gt-sm\:placeholder-opacity-54::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .gt-sm\:placeholder-opacity-54::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .gt-sm\:placeholder-opacity-54::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .gt-sm\:placeholder-opacity-54::placeholder { --placeholder-opacity: 0.54 !important; } .gt-sm\:placeholder-opacity-70::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .gt-sm\:placeholder-opacity-70::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .gt-sm\:placeholder-opacity-70::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .gt-sm\:placeholder-opacity-70::placeholder { --placeholder-opacity: 0.70 !important; } .gt-sm\:placeholder-opacity-75::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .gt-sm\:placeholder-opacity-75::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .gt-sm\:placeholder-opacity-75::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .gt-sm\:placeholder-opacity-75::placeholder { --placeholder-opacity: 0.75 !important; } .gt-sm\:placeholder-opacity-84::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .gt-sm\:placeholder-opacity-84::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .gt-sm\:placeholder-opacity-84::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .gt-sm\:placeholder-opacity-84::placeholder { --placeholder-opacity: 0.84 !important; } .gt-sm\:placeholder-opacity-100::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .gt-sm\:placeholder-opacity-100::-moz-placeholder { --placeholder-opacity: 1 !important; } .gt-sm\:placeholder-opacity-100::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .gt-sm\:placeholder-opacity-100::placeholder { --placeholder-opacity: 1 !important; } .gt-sm\:focus\:placeholder-opacity-0:focus::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .gt-sm\:focus\:placeholder-opacity-0:focus::-moz-placeholder { --placeholder-opacity: 0 !important; } .gt-sm\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .gt-sm\:focus\:placeholder-opacity-0:focus::placeholder { --placeholder-opacity: 0 !important; } .gt-sm\:focus\:placeholder-opacity-12:focus::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .gt-sm\:focus\:placeholder-opacity-12:focus::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .gt-sm\:focus\:placeholder-opacity-12:focus::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .gt-sm\:focus\:placeholder-opacity-12:focus::placeholder { --placeholder-opacity: 0.12 !important; } .gt-sm\:focus\:placeholder-opacity-25:focus::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .gt-sm\:focus\:placeholder-opacity-25:focus::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .gt-sm\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .gt-sm\:focus\:placeholder-opacity-25:focus::placeholder { --placeholder-opacity: 0.25 !important; } .gt-sm\:focus\:placeholder-opacity-38:focus::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .gt-sm\:focus\:placeholder-opacity-38:focus::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .gt-sm\:focus\:placeholder-opacity-38:focus::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .gt-sm\:focus\:placeholder-opacity-38:focus::placeholder { --placeholder-opacity: 0.38 !important; } .gt-sm\:focus\:placeholder-opacity-50:focus::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .gt-sm\:focus\:placeholder-opacity-50:focus::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .gt-sm\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .gt-sm\:focus\:placeholder-opacity-50:focus::placeholder { --placeholder-opacity: 0.5 !important; } .gt-sm\:focus\:placeholder-opacity-54:focus::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .gt-sm\:focus\:placeholder-opacity-54:focus::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .gt-sm\:focus\:placeholder-opacity-54:focus::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .gt-sm\:focus\:placeholder-opacity-54:focus::placeholder { --placeholder-opacity: 0.54 !important; } .gt-sm\:focus\:placeholder-opacity-70:focus::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .gt-sm\:focus\:placeholder-opacity-70:focus::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .gt-sm\:focus\:placeholder-opacity-70:focus::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .gt-sm\:focus\:placeholder-opacity-70:focus::placeholder { --placeholder-opacity: 0.70 !important; } .gt-sm\:focus\:placeholder-opacity-75:focus::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .gt-sm\:focus\:placeholder-opacity-75:focus::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .gt-sm\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .gt-sm\:focus\:placeholder-opacity-75:focus::placeholder { --placeholder-opacity: 0.75 !important; } .gt-sm\:focus\:placeholder-opacity-84:focus::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .gt-sm\:focus\:placeholder-opacity-84:focus::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .gt-sm\:focus\:placeholder-opacity-84:focus::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .gt-sm\:focus\:placeholder-opacity-84:focus::placeholder { --placeholder-opacity: 0.84 !important; } .gt-sm\:focus\:placeholder-opacity-100:focus::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .gt-sm\:focus\:placeholder-opacity-100:focus::-moz-placeholder { --placeholder-opacity: 1 !important; } .gt-sm\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .gt-sm\:focus\:placeholder-opacity-100:focus::placeholder { --placeholder-opacity: 1 !important; } .gt-sm\:pointer-events-none { pointer-events: none !important; } .gt-sm\:pointer-events-auto { pointer-events: auto !important; } .gt-sm\:static { position: static !important; } .gt-sm\:fixed { position: fixed !important; } .gt-sm\:absolute { position: absolute !important; } .gt-sm\:relative { position: relative !important; } .gt-sm\:sticky { position: -webkit-sticky !important; position: sticky !important; } .gt-sm\:inset-0 { top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; } .gt-sm\:inset-auto { top: auto !important; right: auto !important; bottom: auto !important; left: auto !important; } .gt-sm\:inset-y-0 { top: 0 !important; bottom: 0 !important; } .gt-sm\:inset-x-0 { right: 0 !important; left: 0 !important; } .gt-sm\:inset-y-auto { top: auto !important; bottom: auto !important; } .gt-sm\:inset-x-auto { right: auto !important; left: auto !important; } .gt-sm\:top-0 { top: 0 !important; } .gt-sm\:right-0 { right: 0 !important; } .gt-sm\:bottom-0 { bottom: 0 !important; } .gt-sm\:left-0 { left: 0 !important; } .gt-sm\:top-auto { top: auto !important; } .gt-sm\:right-auto { right: auto !important; } .gt-sm\:bottom-auto { bottom: auto !important; } .gt-sm\:left-auto { left: auto !important; } .gt-sm\:shadow-xs { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .gt-sm\:shadow-sm { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .gt-sm\:shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .gt-sm\:shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .gt-sm\:shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .gt-sm\:shadow-xl { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .gt-sm\:shadow-2xl { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .gt-sm\:shadow-inner { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .gt-sm\:shadow-outline { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .gt-sm\:shadow-none { box-shadow: none !important; } .gt-sm\:shadow-solid { box-shadow: 0 0 0 2px currentColor !important; } .gt-sm\:hover\:shadow-xs:hover { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .gt-sm\:hover\:shadow-sm:hover { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .gt-sm\:hover\:shadow:hover { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .gt-sm\:hover\:shadow-md:hover { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .gt-sm\:hover\:shadow-lg:hover { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .gt-sm\:hover\:shadow-xl:hover { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .gt-sm\:hover\:shadow-2xl:hover { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .gt-sm\:hover\:shadow-inner:hover { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .gt-sm\:hover\:shadow-outline:hover { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .gt-sm\:hover\:shadow-none:hover { box-shadow: none !important; } .gt-sm\:hover\:shadow-solid:hover { box-shadow: 0 0 0 2px currentColor !important; } .gt-sm\:focus\:shadow-xs:focus { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .gt-sm\:focus\:shadow-sm:focus { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .gt-sm\:focus\:shadow:focus { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .gt-sm\:focus\:shadow-md:focus { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .gt-sm\:focus\:shadow-lg:focus { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .gt-sm\:focus\:shadow-xl:focus { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .gt-sm\:focus\:shadow-2xl:focus { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .gt-sm\:focus\:shadow-inner:focus { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .gt-sm\:focus\:shadow-outline:focus { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .gt-sm\:focus\:shadow-none:focus { box-shadow: none !important; } .gt-sm\:focus\:shadow-solid:focus { box-shadow: 0 0 0 2px currentColor !important; } .gt-sm\:fill-current { fill: currentColor !important; } .gt-sm\:stroke-current { stroke: currentColor !important; } .gt-sm\:stroke-0 { stroke-width: 0 !important; } .gt-sm\:stroke-1 { stroke-width: 1 !important; } .gt-sm\:stroke-2 { stroke-width: 2 !important; } .gt-sm\:table-auto { table-layout: auto !important; } .gt-sm\:table-fixed { table-layout: fixed !important; } .gt-sm\:text-left { text-align: left !important; } .gt-sm\:text-center { text-align: center !important; } .gt-sm\:text-right { text-align: right !important; } .gt-sm\:text-justify { text-align: justify !important; } .gt-sm\:text-opacity-0 { --text-opacity: 0 !important; } .gt-sm\:text-opacity-12 { --text-opacity: 0.12 !important; } .gt-sm\:text-opacity-25 { --text-opacity: 0.25 !important; } .gt-sm\:text-opacity-38 { --text-opacity: 0.38 !important; } .gt-sm\:text-opacity-50 { --text-opacity: 0.5 !important; } .gt-sm\:text-opacity-54 { --text-opacity: 0.54 !important; } .gt-sm\:text-opacity-70 { --text-opacity: 0.70 !important; } .gt-sm\:text-opacity-75 { --text-opacity: 0.75 !important; } .gt-sm\:text-opacity-84 { --text-opacity: 0.84 !important; } .gt-sm\:text-opacity-100 { --text-opacity: 1 !important; } .gt-sm\:hover\:text-opacity-0:hover { --text-opacity: 0 !important; } .gt-sm\:hover\:text-opacity-12:hover { --text-opacity: 0.12 !important; } .gt-sm\:hover\:text-opacity-25:hover { --text-opacity: 0.25 !important; } .gt-sm\:hover\:text-opacity-38:hover { --text-opacity: 0.38 !important; } .gt-sm\:hover\:text-opacity-50:hover { --text-opacity: 0.5 !important; } .gt-sm\:hover\:text-opacity-54:hover { --text-opacity: 0.54 !important; } .gt-sm\:hover\:text-opacity-70:hover { --text-opacity: 0.70 !important; } .gt-sm\:hover\:text-opacity-75:hover { --text-opacity: 0.75 !important; } .gt-sm\:hover\:text-opacity-84:hover { --text-opacity: 0.84 !important; } .gt-sm\:hover\:text-opacity-100:hover { --text-opacity: 1 !important; } .gt-sm\:focus\:text-opacity-0:focus { --text-opacity: 0 !important; } .gt-sm\:focus\:text-opacity-12:focus { --text-opacity: 0.12 !important; } .gt-sm\:focus\:text-opacity-25:focus { --text-opacity: 0.25 !important; } .gt-sm\:focus\:text-opacity-38:focus { --text-opacity: 0.38 !important; } .gt-sm\:focus\:text-opacity-50:focus { --text-opacity: 0.5 !important; } .gt-sm\:focus\:text-opacity-54:focus { --text-opacity: 0.54 !important; } .gt-sm\:focus\:text-opacity-70:focus { --text-opacity: 0.70 !important; } .gt-sm\:focus\:text-opacity-75:focus { --text-opacity: 0.75 !important; } .gt-sm\:focus\:text-opacity-84:focus { --text-opacity: 0.84 !important; } .gt-sm\:focus\:text-opacity-100:focus { --text-opacity: 1 !important; } .gt-sm\:italic { font-style: italic !important; } .gt-sm\:not-italic { font-style: normal !important; } .gt-sm\:uppercase { text-transform: uppercase !important; } .gt-sm\:lowercase { text-transform: lowercase !important; } .gt-sm\:capitalize { text-transform: capitalize !important; } .gt-sm\:normal-case { text-transform: none !important; } .gt-sm\:underline { text-decoration: underline !important; } .gt-sm\:line-through { text-decoration: line-through !important; } .gt-sm\:no-underline { text-decoration: none !important; } .gt-sm\:hover\:underline:hover { text-decoration: underline !important; } .gt-sm\:hover\:line-through:hover { text-decoration: line-through !important; } .gt-sm\:hover\:no-underline:hover { text-decoration: none !important; } .gt-sm\:focus\:underline:focus { text-decoration: underline !important; } .gt-sm\:focus\:line-through:focus { text-decoration: line-through !important; } .gt-sm\:focus\:no-underline:focus { text-decoration: none !important; } .gt-sm\:tracking-tighter { letter-spacing: -0.05em !important; } .gt-sm\:tracking-tight { letter-spacing: -0.025em !important; } .gt-sm\:tracking-normal { letter-spacing: 0 !important; } .gt-sm\:tracking-wide { letter-spacing: 0.025em !important; } .gt-sm\:tracking-wider { letter-spacing: 0.05em !important; } .gt-sm\:tracking-widest { letter-spacing: 0.1em !important; } .gt-sm\:select-none { -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important; } .gt-sm\:select-text { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } .gt-sm\:select-all { -webkit-user-select: all !important; -moz-user-select: all !important; -ms-user-select: all !important; user-select: all !important; } .gt-sm\:select-auto { -webkit-user-select: auto !important; -moz-user-select: auto !important; -ms-user-select: auto !important; user-select: auto !important; } .gt-sm\:align-baseline { vertical-align: baseline !important; } .gt-sm\:align-top { vertical-align: top !important; } .gt-sm\:align-middle { vertical-align: middle !important; } .gt-sm\:align-bottom { vertical-align: bottom !important; } .gt-sm\:align-text-top { vertical-align: text-top !important; } .gt-sm\:align-text-bottom { vertical-align: text-bottom !important; } .gt-sm\:visible { visibility: visible !important; } .gt-sm\:invisible { visibility: hidden !important; } .gt-sm\:whitespace-normal { white-space: normal !important; } .gt-sm\:whitespace-no-wrap { white-space: nowrap !important; } .gt-sm\:whitespace-pre { white-space: pre !important; } .gt-sm\:whitespace-pre-line { white-space: pre-line !important; } .gt-sm\:whitespace-pre-wrap { white-space: pre-wrap !important; } .gt-sm\:break-normal { overflow-wrap: normal !important; word-break: normal !important; } .gt-sm\:break-words { overflow-wrap: break-word !important; } .gt-sm\:break-all { word-break: break-all !important; } .gt-sm\:truncate { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } .gt-sm\:w-0 { width: 0 !important; } .gt-sm\:w-1 { width: 0.25rem !important; } .gt-sm\:w-2 { width: 0.5rem !important; } .gt-sm\:w-3 { width: 0.75rem !important; } .gt-sm\:w-4 { width: 1rem !important; } .gt-sm\:w-5 { width: 1.25rem !important; } .gt-sm\:w-6 { width: 1.5rem !important; } .gt-sm\:w-8 { width: 2rem !important; } .gt-sm\:w-10 { width: 2.5rem !important; } .gt-sm\:w-12 { width: 3rem !important; } .gt-sm\:w-14 { width: 3.5rem !important; } .gt-sm\:w-16 { width: 4rem !important; } .gt-sm\:w-18 { width: 4.5rem !important; } .gt-sm\:w-20 { width: 5rem !important; } .gt-sm\:w-22 { width: 5.5rem !important; } .gt-sm\:w-24 { width: 6rem !important; } .gt-sm\:w-26 { width: 6.5rem !important; } .gt-sm\:w-28 { width: 7rem !important; } .gt-sm\:w-30 { width: 7.5rem !important; } .gt-sm\:w-32 { width: 8rem !important; } .gt-sm\:w-36 { width: 9rem !important; } .gt-sm\:w-40 { width: 10rem !important; } .gt-sm\:w-48 { width: 12rem !important; } .gt-sm\:w-50 { width: 12.5rem !important; } .gt-sm\:w-56 { width: 14rem !important; } .gt-sm\:w-60 { width: 15rem !important; } .gt-sm\:w-64 { width: 16rem !important; } .gt-sm\:w-80 { width: 20rem !important; } .gt-sm\:w-90 { width: 24rem !important; } .gt-sm\:w-100 { width: 25rem !important; } .gt-sm\:w-120 { width: 30rem !important; } .gt-sm\:w-128 { width: 32rem !important; } .gt-sm\:w-140 { width: 35rem !important; } .gt-sm\:w-160 { width: 40rem !important; } .gt-sm\:w-180 { width: 45rem !important; } .gt-sm\:w-192 { width: 48rem !important; } .gt-sm\:w-200 { width: 50rem !important; } .gt-sm\:w-240 { width: 60rem !important; } .gt-sm\:w-256 { width: 64rem !important; } .gt-sm\:w-280 { width: 70rem !important; } .gt-sm\:w-320 { width: 80rem !important; } .gt-sm\:w-360 { width: 90rem !important; } .gt-sm\:w-400 { width: 100rem !important; } .gt-sm\:w-480 { width: 120rem !important; } .gt-sm\:w-auto { width: auto !important; } .gt-sm\:w-px { width: 1px !important; } .gt-sm\:w-2px { width: 2px !important; } .gt-sm\:w-1\/2 { width: 50% !important; } .gt-sm\:w-1\/3 { width: 33.33333% !important; } .gt-sm\:w-2\/3 { width: 66.66667% !important; } .gt-sm\:w-1\/4 { width: 25% !important; } .gt-sm\:w-2\/4 { width: 50% !important; } .gt-sm\:w-3\/4 { width: 75% !important; } .gt-sm\:w-1\/5 { width: 20% !important; } .gt-sm\:w-2\/5 { width: 40% !important; } .gt-sm\:w-3\/5 { width: 60% !important; } .gt-sm\:w-4\/5 { width: 80% !important; } .gt-sm\:w-1\/6 { width: 16.666667% !important; } .gt-sm\:w-2\/6 { width: 33.333333% !important; } .gt-sm\:w-3\/6 { width: 50% !important; } .gt-sm\:w-4\/6 { width: 66.666667% !important; } .gt-sm\:w-5\/6 { width: 83.333333% !important; } .gt-sm\:w-1\/12 { width: 8.33333% !important; } .gt-sm\:w-2\/12 { width: 16.66667% !important; } .gt-sm\:w-3\/12 { width: 25% !important; } .gt-sm\:w-4\/12 { width: 33.33333% !important; } .gt-sm\:w-5\/12 { width: 41.66667% !important; } .gt-sm\:w-6\/12 { width: 50% !important; } .gt-sm\:w-7\/12 { width: 58.33333% !important; } .gt-sm\:w-8\/12 { width: 66.66667% !important; } .gt-sm\:w-9\/12 { width: 75% !important; } .gt-sm\:w-10\/12 { width: 83.33333% !important; } .gt-sm\:w-11\/12 { width: 91.66667% !important; } .gt-sm\:w-full { width: 100% !important; } .gt-sm\:w-screen { width: 100vw !important; } .gt-sm\:z-0 { z-index: 0 !important; } .gt-sm\:z-10 { z-index: 10 !important; } .gt-sm\:z-20 { z-index: 20 !important; } .gt-sm\:z-30 { z-index: 30 !important; } .gt-sm\:z-40 { z-index: 40 !important; } .gt-sm\:z-50 { z-index: 50 !important; } .gt-sm\:z-60 { z-index: 60 !important; } .gt-sm\:z-70 { z-index: 70 !important; } .gt-sm\:z-80 { z-index: 80 !important; } .gt-sm\:z-90 { z-index: 90 !important; } .gt-sm\:z-99 { z-index: 99 !important; } .gt-sm\:z-999 { z-index: 999 !important; } .gt-sm\:z-9999 { z-index: 9999 !important; } .gt-sm\:z-99999 { z-index: 99999 !important; } .gt-sm\:z-auto { z-index: auto !important; } .gt-sm\:-z-1 { z-index: -1 !important; } .gt-sm\:gap-0 { grid-gap: 0 !important; gap: 0 !important; } .gt-sm\:gap-1 { grid-gap: 0.25rem !important; gap: 0.25rem !important; } .gt-sm\:gap-2 { grid-gap: 0.5rem !important; gap: 0.5rem !important; } .gt-sm\:gap-3 { grid-gap: 0.75rem !important; gap: 0.75rem !important; } .gt-sm\:gap-4 { grid-gap: 1rem !important; gap: 1rem !important; } .gt-sm\:gap-5 { grid-gap: 1.25rem !important; gap: 1.25rem !important; } .gt-sm\:gap-6 { grid-gap: 1.5rem !important; gap: 1.5rem !important; } .gt-sm\:gap-8 { grid-gap: 2rem !important; gap: 2rem !important; } .gt-sm\:gap-10 { grid-gap: 2.5rem !important; gap: 2.5rem !important; } .gt-sm\:gap-12 { grid-gap: 3rem !important; gap: 3rem !important; } .gt-sm\:gap-14 { grid-gap: 3.5rem !important; gap: 3.5rem !important; } .gt-sm\:gap-16 { grid-gap: 4rem !important; gap: 4rem !important; } .gt-sm\:gap-18 { grid-gap: 4.5rem !important; gap: 4.5rem !important; } .gt-sm\:gap-20 { grid-gap: 5rem !important; gap: 5rem !important; } .gt-sm\:gap-22 { grid-gap: 5.5rem !important; gap: 5.5rem !important; } .gt-sm\:gap-24 { grid-gap: 6rem !important; gap: 6rem !important; } .gt-sm\:gap-26 { grid-gap: 6.5rem !important; gap: 6.5rem !important; } .gt-sm\:gap-28 { grid-gap: 7rem !important; gap: 7rem !important; } .gt-sm\:gap-30 { grid-gap: 7.5rem !important; gap: 7.5rem !important; } .gt-sm\:gap-32 { grid-gap: 8rem !important; gap: 8rem !important; } .gt-sm\:gap-36 { grid-gap: 9rem !important; gap: 9rem !important; } .gt-sm\:gap-40 { grid-gap: 10rem !important; gap: 10rem !important; } .gt-sm\:gap-48 { grid-gap: 12rem !important; gap: 12rem !important; } .gt-sm\:gap-56 { grid-gap: 14rem !important; gap: 14rem !important; } .gt-sm\:gap-64 { grid-gap: 16rem !important; gap: 16rem !important; } .gt-sm\:gap-px { grid-gap: 1px !important; gap: 1px !important; } .gt-sm\:gap-2px { grid-gap: 2px !important; gap: 2px !important; } .gt-sm\:col-gap-0 { grid-column-gap: 0 !important; -moz-column-gap: 0 !important; column-gap: 0 !important; } .gt-sm\:col-gap-1 { grid-column-gap: 0.25rem !important; -moz-column-gap: 0.25rem !important; column-gap: 0.25rem !important; } .gt-sm\:col-gap-2 { grid-column-gap: 0.5rem !important; -moz-column-gap: 0.5rem !important; column-gap: 0.5rem !important; } .gt-sm\:col-gap-3 { grid-column-gap: 0.75rem !important; -moz-column-gap: 0.75rem !important; column-gap: 0.75rem !important; } .gt-sm\:col-gap-4 { grid-column-gap: 1rem !important; -moz-column-gap: 1rem !important; column-gap: 1rem !important; } .gt-sm\:col-gap-5 { grid-column-gap: 1.25rem !important; -moz-column-gap: 1.25rem !important; column-gap: 1.25rem !important; } .gt-sm\:col-gap-6 { grid-column-gap: 1.5rem !important; -moz-column-gap: 1.5rem !important; column-gap: 1.5rem !important; } .gt-sm\:col-gap-8 { grid-column-gap: 2rem !important; -moz-column-gap: 2rem !important; column-gap: 2rem !important; } .gt-sm\:col-gap-10 { grid-column-gap: 2.5rem !important; -moz-column-gap: 2.5rem !important; column-gap: 2.5rem !important; } .gt-sm\:col-gap-12 { grid-column-gap: 3rem !important; -moz-column-gap: 3rem !important; column-gap: 3rem !important; } .gt-sm\:col-gap-14 { grid-column-gap: 3.5rem !important; -moz-column-gap: 3.5rem !important; column-gap: 3.5rem !important; } .gt-sm\:col-gap-16 { grid-column-gap: 4rem !important; -moz-column-gap: 4rem !important; column-gap: 4rem !important; } .gt-sm\:col-gap-18 { grid-column-gap: 4.5rem !important; -moz-column-gap: 4.5rem !important; column-gap: 4.5rem !important; } .gt-sm\:col-gap-20 { grid-column-gap: 5rem !important; -moz-column-gap: 5rem !important; column-gap: 5rem !important; } .gt-sm\:col-gap-22 { grid-column-gap: 5.5rem !important; -moz-column-gap: 5.5rem !important; column-gap: 5.5rem !important; } .gt-sm\:col-gap-24 { grid-column-gap: 6rem !important; -moz-column-gap: 6rem !important; column-gap: 6rem !important; } .gt-sm\:col-gap-26 { grid-column-gap: 6.5rem !important; -moz-column-gap: 6.5rem !important; column-gap: 6.5rem !important; } .gt-sm\:col-gap-28 { grid-column-gap: 7rem !important; -moz-column-gap: 7rem !important; column-gap: 7rem !important; } .gt-sm\:col-gap-30 { grid-column-gap: 7.5rem !important; -moz-column-gap: 7.5rem !important; column-gap: 7.5rem !important; } .gt-sm\:col-gap-32 { grid-column-gap: 8rem !important; -moz-column-gap: 8rem !important; column-gap: 8rem !important; } .gt-sm\:col-gap-36 { grid-column-gap: 9rem !important; -moz-column-gap: 9rem !important; column-gap: 9rem !important; } .gt-sm\:col-gap-40 { grid-column-gap: 10rem !important; -moz-column-gap: 10rem !important; column-gap: 10rem !important; } .gt-sm\:col-gap-48 { grid-column-gap: 12rem !important; -moz-column-gap: 12rem !important; column-gap: 12rem !important; } .gt-sm\:col-gap-56 { grid-column-gap: 14rem !important; -moz-column-gap: 14rem !important; column-gap: 14rem !important; } .gt-sm\:col-gap-64 { grid-column-gap: 16rem !important; -moz-column-gap: 16rem !important; column-gap: 16rem !important; } .gt-sm\:col-gap-px { grid-column-gap: 1px !important; -moz-column-gap: 1px !important; column-gap: 1px !important; } .gt-sm\:col-gap-2px { grid-column-gap: 2px !important; -moz-column-gap: 2px !important; column-gap: 2px !important; } .gt-sm\:row-gap-0 { grid-row-gap: 0 !important; row-gap: 0 !important; } .gt-sm\:row-gap-1 { grid-row-gap: 0.25rem !important; row-gap: 0.25rem !important; } .gt-sm\:row-gap-2 { grid-row-gap: 0.5rem !important; row-gap: 0.5rem !important; } .gt-sm\:row-gap-3 { grid-row-gap: 0.75rem !important; row-gap: 0.75rem !important; } .gt-sm\:row-gap-4 { grid-row-gap: 1rem !important; row-gap: 1rem !important; } .gt-sm\:row-gap-5 { grid-row-gap: 1.25rem !important; row-gap: 1.25rem !important; } .gt-sm\:row-gap-6 { grid-row-gap: 1.5rem !important; row-gap: 1.5rem !important; } .gt-sm\:row-gap-8 { grid-row-gap: 2rem !important; row-gap: 2rem !important; } .gt-sm\:row-gap-10 { grid-row-gap: 2.5rem !important; row-gap: 2.5rem !important; } .gt-sm\:row-gap-12 { grid-row-gap: 3rem !important; row-gap: 3rem !important; } .gt-sm\:row-gap-14 { grid-row-gap: 3.5rem !important; row-gap: 3.5rem !important; } .gt-sm\:row-gap-16 { grid-row-gap: 4rem !important; row-gap: 4rem !important; } .gt-sm\:row-gap-18 { grid-row-gap: 4.5rem !important; row-gap: 4.5rem !important; } .gt-sm\:row-gap-20 { grid-row-gap: 5rem !important; row-gap: 5rem !important; } .gt-sm\:row-gap-22 { grid-row-gap: 5.5rem !important; row-gap: 5.5rem !important; } .gt-sm\:row-gap-24 { grid-row-gap: 6rem !important; row-gap: 6rem !important; } .gt-sm\:row-gap-26 { grid-row-gap: 6.5rem !important; row-gap: 6.5rem !important; } .gt-sm\:row-gap-28 { grid-row-gap: 7rem !important; row-gap: 7rem !important; } .gt-sm\:row-gap-30 { grid-row-gap: 7.5rem !important; row-gap: 7.5rem !important; } .gt-sm\:row-gap-32 { grid-row-gap: 8rem !important; row-gap: 8rem !important; } .gt-sm\:row-gap-36 { grid-row-gap: 9rem !important; row-gap: 9rem !important; } .gt-sm\:row-gap-40 { grid-row-gap: 10rem !important; row-gap: 10rem !important; } .gt-sm\:row-gap-48 { grid-row-gap: 12rem !important; row-gap: 12rem !important; } .gt-sm\:row-gap-56 { grid-row-gap: 14rem !important; row-gap: 14rem !important; } .gt-sm\:row-gap-64 { grid-row-gap: 16rem !important; row-gap: 16rem !important; } .gt-sm\:row-gap-px { grid-row-gap: 1px !important; row-gap: 1px !important; } .gt-sm\:row-gap-2px { grid-row-gap: 2px !important; row-gap: 2px !important; } .gt-sm\:grid-flow-row { grid-auto-flow: row !important; } .gt-sm\:grid-flow-col { grid-auto-flow: column !important; } .gt-sm\:grid-flow-row-dense { grid-auto-flow: row dense !important; } .gt-sm\:grid-flow-col-dense { grid-auto-flow: column dense !important; } .gt-sm\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; } .gt-sm\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } .gt-sm\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; } .gt-sm\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; } .gt-sm\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; } .gt-sm\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; } .gt-sm\:grid-cols-7 { grid-template-columns: repeat(7, minmax(0, 1fr)) !important; } .gt-sm\:grid-cols-8 { grid-template-columns: repeat(8, minmax(0, 1fr)) !important; } .gt-sm\:grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)) !important; } .gt-sm\:grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)) !important; } .gt-sm\:grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)) !important; } .gt-sm\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)) !important; } .gt-sm\:grid-cols-none { grid-template-columns: none !important; } .gt-sm\:col-auto { grid-column: auto !important; } .gt-sm\:col-span-1 { grid-column: span 1 / span 1 !important; } .gt-sm\:col-span-2 { grid-column: span 2 / span 2 !important; } .gt-sm\:col-span-3 { grid-column: span 3 / span 3 !important; } .gt-sm\:col-span-4 { grid-column: span 4 / span 4 !important; } .gt-sm\:col-span-5 { grid-column: span 5 / span 5 !important; } .gt-sm\:col-span-6 { grid-column: span 6 / span 6 !important; } .gt-sm\:col-span-7 { grid-column: span 7 / span 7 !important; } .gt-sm\:col-span-8 { grid-column: span 8 / span 8 !important; } .gt-sm\:col-span-9 { grid-column: span 9 / span 9 !important; } .gt-sm\:col-span-10 { grid-column: span 10 / span 10 !important; } .gt-sm\:col-span-11 { grid-column: span 11 / span 11 !important; } .gt-sm\:col-span-12 { grid-column: span 12 / span 12 !important; } .gt-sm\:col-start-1 { grid-column-start: 1 !important; } .gt-sm\:col-start-2 { grid-column-start: 2 !important; } .gt-sm\:col-start-3 { grid-column-start: 3 !important; } .gt-sm\:col-start-4 { grid-column-start: 4 !important; } .gt-sm\:col-start-5 { grid-column-start: 5 !important; } .gt-sm\:col-start-6 { grid-column-start: 6 !important; } .gt-sm\:col-start-7 { grid-column-start: 7 !important; } .gt-sm\:col-start-8 { grid-column-start: 8 !important; } .gt-sm\:col-start-9 { grid-column-start: 9 !important; } .gt-sm\:col-start-10 { grid-column-start: 10 !important; } .gt-sm\:col-start-11 { grid-column-start: 11 !important; } .gt-sm\:col-start-12 { grid-column-start: 12 !important; } .gt-sm\:col-start-13 { grid-column-start: 13 !important; } .gt-sm\:col-start-auto { grid-column-start: auto !important; } .gt-sm\:col-end-1 { grid-column-end: 1 !important; } .gt-sm\:col-end-2 { grid-column-end: 2 !important; } .gt-sm\:col-end-3 { grid-column-end: 3 !important; } .gt-sm\:col-end-4 { grid-column-end: 4 !important; } .gt-sm\:col-end-5 { grid-column-end: 5 !important; } .gt-sm\:col-end-6 { grid-column-end: 6 !important; } .gt-sm\:col-end-7 { grid-column-end: 7 !important; } .gt-sm\:col-end-8 { grid-column-end: 8 !important; } .gt-sm\:col-end-9 { grid-column-end: 9 !important; } .gt-sm\:col-end-10 { grid-column-end: 10 !important; } .gt-sm\:col-end-11 { grid-column-end: 11 !important; } .gt-sm\:col-end-12 { grid-column-end: 12 !important; } .gt-sm\:col-end-13 { grid-column-end: 13 !important; } .gt-sm\:col-end-auto { grid-column-end: auto !important; } .gt-sm\:grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)) !important; } .gt-sm\:grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)) !important; } .gt-sm\:grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)) !important; } .gt-sm\:grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)) !important; } .gt-sm\:grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)) !important; } .gt-sm\:grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)) !important; } .gt-sm\:grid-rows-none { grid-template-rows: none !important; } .gt-sm\:row-auto { grid-row: auto !important; } .gt-sm\:row-span-1 { grid-row: span 1 / span 1 !important; } .gt-sm\:row-span-2 { grid-row: span 2 / span 2 !important; } .gt-sm\:row-span-3 { grid-row: span 3 / span 3 !important; } .gt-sm\:row-span-4 { grid-row: span 4 / span 4 !important; } .gt-sm\:row-span-5 { grid-row: span 5 / span 5 !important; } .gt-sm\:row-span-6 { grid-row: span 6 / span 6 !important; } .gt-sm\:row-start-1 { grid-row-start: 1 !important; } .gt-sm\:row-start-2 { grid-row-start: 2 !important; } .gt-sm\:row-start-3 { grid-row-start: 3 !important; } .gt-sm\:row-start-4 { grid-row-start: 4 !important; } .gt-sm\:row-start-5 { grid-row-start: 5 !important; } .gt-sm\:row-start-6 { grid-row-start: 6 !important; } .gt-sm\:row-start-7 { grid-row-start: 7 !important; } .gt-sm\:row-start-auto { grid-row-start: auto !important; } .gt-sm\:row-end-1 { grid-row-end: 1 !important; } .gt-sm\:row-end-2 { grid-row-end: 2 !important; } .gt-sm\:row-end-3 { grid-row-end: 3 !important; } .gt-sm\:row-end-4 { grid-row-end: 4 !important; } .gt-sm\:row-end-5 { grid-row-end: 5 !important; } .gt-sm\:row-end-6 { grid-row-end: 6 !important; } .gt-sm\:row-end-7 { grid-row-end: 7 !important; } .gt-sm\:row-end-auto { grid-row-end: auto !important; } .gt-sm\:transform { --transform-translate-x: 0 !important; --transform-translate-y: 0 !important; --transform-rotate: 0 !important; --transform-skew-x: 0 !important; --transform-skew-y: 0 !important; --transform-scale-x: 1 !important; --transform-scale-y: 1 !important; transform: translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y)) !important; } .gt-sm\:transform-none { transform: none !important; } .gt-sm\:origin-center { transform-origin: center !important; } .gt-sm\:origin-top { transform-origin: top !important; } .gt-sm\:origin-top-right { transform-origin: top right !important; } .gt-sm\:origin-right { transform-origin: right !important; } .gt-sm\:origin-bottom-right { transform-origin: bottom right !important; } .gt-sm\:origin-bottom { transform-origin: bottom !important; } .gt-sm\:origin-bottom-left { transform-origin: bottom left !important; } .gt-sm\:origin-left { transform-origin: left !important; } .gt-sm\:origin-top-left { transform-origin: top left !important; } .gt-sm\:icon-size-12 { width: 12px !important; height: 12px !important; min-width: 12px !important; min-height: 12px !important; font-size: 12px !important; line-height: 12px !important; } .gt-sm\:icon-size-12 svg { width: 12px !important; height: 12px !important; } .gt-sm\:icon-size-14 { width: 14px !important; height: 14px !important; min-width: 14px !important; min-height: 14px !important; font-size: 14px !important; line-height: 14px !important; } .gt-sm\:icon-size-14 svg { width: 14px !important; height: 14px !important; } .gt-sm\:icon-size-16 { width: 16px !important; height: 16px !important; min-width: 16px !important; min-height: 16px !important; font-size: 16px !important; line-height: 16px !important; } .gt-sm\:icon-size-16 svg { width: 16px !important; height: 16px !important; } .gt-sm\:icon-size-18 { width: 18px !important; height: 18px !important; min-width: 18px !important; min-height: 18px !important; font-size: 18px !important; line-height: 18px !important; } .gt-sm\:icon-size-18 svg { width: 18px !important; height: 18px !important; } .gt-sm\:icon-size-20 { width: 20px !important; height: 20px !important; min-width: 20px !important; min-height: 20px !important; font-size: 20px !important; line-height: 20px !important; } .gt-sm\:icon-size-20 svg { width: 20px !important; height: 20px !important; } .gt-sm\:icon-size-24 { width: 24px !important; height: 24px !important; min-width: 24px !important; min-height: 24px !important; font-size: 24px !important; line-height: 24px !important; } .gt-sm\:icon-size-24 svg { width: 24px !important; height: 24px !important; } .gt-sm\:icon-size-32 { width: 32px !important; height: 32px !important; min-width: 32px !important; min-height: 32px !important; font-size: 32px !important; line-height: 32px !important; } .gt-sm\:icon-size-32 svg { width: 32px !important; height: 32px !important; } .gt-sm\:icon-size-40 { width: 40px !important; height: 40px !important; min-width: 40px !important; min-height: 40px !important; font-size: 40px !important; line-height: 40px !important; } .gt-sm\:icon-size-40 svg { width: 40px !important; height: 40px !important; } .gt-sm\:icon-size-48 { width: 48px !important; height: 48px !important; min-width: 48px !important; min-height: 48px !important; font-size: 48px !important; line-height: 48px !important; } .gt-sm\:icon-size-48 svg { width: 48px !important; height: 48px !important; } .gt-sm\:icon-size-56 { width: 56px !important; height: 56px !important; min-width: 56px !important; min-height: 56px !important; font-size: 56px !important; line-height: 56px !important; } .gt-sm\:icon-size-56 svg { width: 56px !important; height: 56px !important; } .gt-sm\:icon-size-64 { width: 64px !important; height: 64px !important; min-width: 64px !important; min-height: 64px !important; font-size: 64px !important; line-height: 64px !important; } .gt-sm\:icon-size-64 svg { width: 64px !important; height: 64px !important; } .gt-sm\:icon-size-72 { width: 72px !important; height: 72px !important; min-width: 72px !important; min-height: 72px !important; font-size: 72px !important; line-height: 72px !important; } .gt-sm\:icon-size-72 svg { width: 72px !important; height: 72px !important; } .gt-sm\:icon-size-80 { width: 80px !important; height: 80px !important; min-width: 80px !important; min-height: 80px !important; font-size: 80px !important; line-height: 80px !important; } .gt-sm\:icon-size-80 svg { width: 80px !important; height: 80px !important; } .gt-sm\:icon-size-88 { width: 88px !important; height: 88px !important; min-width: 88px !important; min-height: 88px !important; font-size: 88px !important; line-height: 88px !important; } .gt-sm\:icon-size-88 svg { width: 88px !important; height: 88px !important; } .gt-sm\:icon-size-96 { width: 96px !important; height: 96px !important; min-width: 96px !important; min-height: 96px !important; font-size: 96px !important; line-height: 96px !important; } .gt-sm\:icon-size-96 svg { width: 96px !important; height: 96px !important; } } @media (min-width: 1280px) { .gt-md\:space-y-0 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0px * var(--space-y-reverse)) !important; } .gt-md\:space-x-0 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0px * var(--space-x-reverse)) !important; margin-left: calc(0px * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.25rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.25rem * var(--space-x-reverse)) !important; margin-left: calc(0.25rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.5rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.5rem * var(--space-x-reverse)) !important; margin-left: calc(0.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(0.75rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(0.75rem * var(--space-x-reverse)) !important; margin-left: calc(0.75rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1rem * var(--space-x-reverse)) !important; margin-left: calc(1rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.25rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.25rem * var(--space-x-reverse)) !important; margin-left: calc(1.25rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1.5rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1.5rem * var(--space-x-reverse)) !important; margin-left: calc(1.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2rem * var(--space-x-reverse)) !important; margin-left: calc(2rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2.5rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2.5rem * var(--space-x-reverse)) !important; margin-left: calc(2.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3rem * var(--space-x-reverse)) !important; margin-left: calc(3rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(3.5rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(3.5rem * var(--space-x-reverse)) !important; margin-left: calc(3.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4rem * var(--space-x-reverse)) !important; margin-left: calc(4rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(4.5rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(4.5rem * var(--space-x-reverse)) !important; margin-left: calc(4.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5rem * var(--space-x-reverse)) !important; margin-left: calc(5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(5.5rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(5.5rem * var(--space-x-reverse)) !important; margin-left: calc(5.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6rem * var(--space-x-reverse)) !important; margin-left: calc(6rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(6.5rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(6.5rem * var(--space-x-reverse)) !important; margin-left: calc(6.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7rem * var(--space-x-reverse)) !important; margin-left: calc(7rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(7.5rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(7.5rem * var(--space-x-reverse)) !important; margin-left: calc(7.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(8rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(8rem * var(--space-x-reverse)) !important; margin-left: calc(8rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(9rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(9rem * var(--space-x-reverse)) !important; margin-left: calc(9rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(10rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(10rem * var(--space-x-reverse)) !important; margin-left: calc(10rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(12rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(12rem * var(--space-x-reverse)) !important; margin-left: calc(12rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(14rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(14rem * var(--space-x-reverse)) !important; margin-left: calc(14rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(16rem * var(--space-y-reverse)) !important; } .gt-md\:space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(16rem * var(--space-x-reverse)) !important; margin-left: calc(16rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(1px * var(--space-y-reverse)) !important; } .gt-md\:space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(1px * var(--space-x-reverse)) !important; margin-left: calc(1px * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(2px * var(--space-y-reverse)) !important; } .gt-md\:space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(2px * var(--space-x-reverse)) !important; margin-left: calc(2px * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-1 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.25rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-1 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.25rem * var(--space-x-reverse)) !important; margin-left: calc(-0.25rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-2 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.5rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-2 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.5rem * var(--space-x-reverse)) !important; margin-left: calc(-0.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-3 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-0.75rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-0.75rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-3 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-0.75rem * var(--space-x-reverse)) !important; margin-left: calc(-0.75rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-4 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-4 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1rem * var(--space-x-reverse)) !important; margin-left: calc(-1rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-5 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.25rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.25rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-5 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.25rem * var(--space-x-reverse)) !important; margin-left: calc(-1.25rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-6 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1.5rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-6 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1.5rem * var(--space-x-reverse)) !important; margin-left: calc(-1.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-8 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-8 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2rem * var(--space-x-reverse)) !important; margin-left: calc(-2rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-10 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2.5rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-10 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2.5rem * var(--space-x-reverse)) !important; margin-left: calc(-2.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-12 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-12 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3rem * var(--space-x-reverse)) !important; margin-left: calc(-3rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-14 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-3.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-3.5rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-14 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-3.5rem * var(--space-x-reverse)) !important; margin-left: calc(-3.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-16 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-16 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4rem * var(--space-x-reverse)) !important; margin-left: calc(-4rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-18 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-4.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-4.5rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-18 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-4.5rem * var(--space-x-reverse)) !important; margin-left: calc(-4.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-20 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-20 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5rem * var(--space-x-reverse)) !important; margin-left: calc(-5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-22 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-5.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-5.5rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-22 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-5.5rem * var(--space-x-reverse)) !important; margin-left: calc(-5.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-24 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-24 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6rem * var(--space-x-reverse)) !important; margin-left: calc(-6rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-26 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-6.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-6.5rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-26 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-6.5rem * var(--space-x-reverse)) !important; margin-left: calc(-6.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-28 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-28 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7rem * var(--space-x-reverse)) !important; margin-left: calc(-7rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-30 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-7.5rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-7.5rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-30 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-7.5rem * var(--space-x-reverse)) !important; margin-left: calc(-7.5rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-32 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-8rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-8rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-32 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-8rem * var(--space-x-reverse)) !important; margin-left: calc(-8rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-36 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-9rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-9rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-36 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-9rem * var(--space-x-reverse)) !important; margin-left: calc(-9rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-40 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-10rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-10rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-40 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-10rem * var(--space-x-reverse)) !important; margin-left: calc(-10rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-48 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-12rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-12rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-48 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-12rem * var(--space-x-reverse)) !important; margin-left: calc(-12rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-56 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-14rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-14rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-56 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-14rem * var(--space-x-reverse)) !important; margin-left: calc(-14rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-64 > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-16rem * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-16rem * var(--space-y-reverse)) !important; } .gt-md\:-space-x-64 > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-16rem * var(--space-x-reverse)) !important; margin-left: calc(-16rem * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-1px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-1px * var(--space-y-reverse)) !important; } .gt-md\:-space-x-px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-1px * var(--space-x-reverse)) !important; margin-left: calc(-1px * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:-space-y-2px > :not(template) ~ :not(template) { --space-y-reverse: 0 !important; margin-top: calc(-2px * calc(1 - var(--space-y-reverse))) !important; margin-bottom: calc(-2px * var(--space-y-reverse)) !important; } .gt-md\:-space-x-2px > :not(template) ~ :not(template) { --space-x-reverse: 0 !important; margin-right: calc(-2px * var(--space-x-reverse)) !important; margin-left: calc(-2px * calc(1 - var(--space-x-reverse))) !important; } .gt-md\:space-y-reverse > :not(template) ~ :not(template) { --space-y-reverse: 1 !important; } .gt-md\:space-x-reverse > :not(template) ~ :not(template) { --space-x-reverse: 1 !important; } .gt-md\:divide-y-0 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(0px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(0px * var(--divide-y-reverse)) !important; } .gt-md\:divide-x-0 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(0px * var(--divide-x-reverse)) !important; border-left-width: calc(0px * calc(1 - var(--divide-x-reverse))) !important; } .gt-md\:divide-y-2 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(2px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(2px * var(--divide-y-reverse)) !important; } .gt-md\:divide-x-2 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(2px * var(--divide-x-reverse)) !important; border-left-width: calc(2px * calc(1 - var(--divide-x-reverse))) !important; } .gt-md\:divide-y-4 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(4px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(4px * var(--divide-y-reverse)) !important; } .gt-md\:divide-x-4 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(4px * var(--divide-x-reverse)) !important; border-left-width: calc(4px * calc(1 - var(--divide-x-reverse))) !important; } .gt-md\:divide-y-8 > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(8px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(8px * var(--divide-y-reverse)) !important; } .gt-md\:divide-x-8 > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(8px * var(--divide-x-reverse)) !important; border-left-width: calc(8px * calc(1 - var(--divide-x-reverse))) !important; } .gt-md\:divide-y > :not(template) ~ :not(template) { --divide-y-reverse: 0 !important; border-top-width: calc(1px * calc(1 - var(--divide-y-reverse))) !important; border-bottom-width: calc(1px * var(--divide-y-reverse)) !important; } .gt-md\:divide-x > :not(template) ~ :not(template) { --divide-x-reverse: 0 !important; border-right-width: calc(1px * var(--divide-x-reverse)) !important; border-left-width: calc(1px * calc(1 - var(--divide-x-reverse))) !important; } .gt-md\:divide-y-reverse > :not(template) ~ :not(template) { --divide-y-reverse: 1 !important; } .gt-md\:divide-x-reverse > :not(template) ~ :not(template) { --divide-x-reverse: 1 !important; } .gt-md\:divide-current > :not(template) ~ :not(template) { border-color: currentColor !important; } .gt-md\:divide-transparent > :not(template) ~ :not(template) { border-color: transparent !important; } .gt-md\:divide-white > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFFFFF !important; border-color: rgba(255, 255, 255, var(--divide-opacity)) !important; } .gt-md\:divide-black > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #000000 !important; border-color: rgba(0, 0, 0, var(--divide-opacity)) !important; } .gt-md\:divide-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F9FAFB !important; border-color: rgba(249, 250, 251, var(--divide-opacity)) !important; } .gt-md\:divide-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F4F5F7 !important; border-color: rgba(244, 245, 247, var(--divide-opacity)) !important; } .gt-md\:divide-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5E7EB !important; border-color: rgba(229, 231, 235, var(--divide-opacity)) !important; } .gt-md\:divide-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D2D6DC !important; border-color: rgba(210, 214, 220, var(--divide-opacity)) !important; } .gt-md\:divide-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9FA6B2 !important; border-color: rgba(159, 166, 178, var(--divide-opacity)) !important; } .gt-md\:divide-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .gt-md\:divide-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4B5563 !important; border-color: rgba(75, 85, 99, var(--divide-opacity)) !important; } .gt-md\:divide-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #374151 !important; border-color: rgba(55, 65, 81, var(--divide-opacity)) !important; } .gt-md\:divide-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #252F3F !important; border-color: rgba(37, 47, 63, var(--divide-opacity)) !important; } .gt-md\:divide-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #161E2E !important; border-color: rgba(22, 30, 46, var(--divide-opacity)) !important; } .gt-md\:divide-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6B7280 !important; border-color: rgba(107, 114, 128, var(--divide-opacity)) !important; } .gt-md\:divide-cool-gray-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBFDFE !important; border-color: rgba(251, 253, 254, var(--divide-opacity)) !important; } .gt-md\:divide-cool-gray-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F1F5F9 !important; border-color: rgba(241, 245, 249, var(--divide-opacity)) !important; } .gt-md\:divide-cool-gray-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E2E8F0 !important; border-color: rgba(226, 232, 240, var(--divide-opacity)) !important; } .gt-md\:divide-cool-gray-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CFD8E3 !important; border-color: rgba(207, 216, 227, var(--divide-opacity)) !important; } .gt-md\:divide-cool-gray-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #97A6BA !important; border-color: rgba(151, 166, 186, var(--divide-opacity)) !important; } .gt-md\:divide-cool-gray-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .gt-md\:divide-cool-gray-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #475569 !important; border-color: rgba(71, 85, 105, var(--divide-opacity)) !important; } .gt-md\:divide-cool-gray-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #364152 !important; border-color: rgba(54, 65, 82, var(--divide-opacity)) !important; } .gt-md\:divide-cool-gray-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #27303F !important; border-color: rgba(39, 48, 63, var(--divide-opacity)) !important; } .gt-md\:divide-cool-gray-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A202E !important; border-color: rgba(26, 32, 46, var(--divide-opacity)) !important; } .gt-md\:divide-cool-gray > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #64748B !important; border-color: rgba(100, 116, 139, var(--divide-opacity)) !important; } .gt-md\:divide-red-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F2 !important; border-color: rgba(253, 242, 242, var(--divide-opacity)) !important; } .gt-md\:divide-red-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDE8E8 !important; border-color: rgba(253, 232, 232, var(--divide-opacity)) !important; } .gt-md\:divide-red-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FBD5D5 !important; border-color: rgba(251, 213, 213, var(--divide-opacity)) !important; } .gt-md\:divide-red-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4B4 !important; border-color: rgba(248, 180, 180, var(--divide-opacity)) !important; } .gt-md\:divide-red-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F98080 !important; border-color: rgba(249, 128, 128, var(--divide-opacity)) !important; } .gt-md\:divide-red-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .gt-md\:divide-red-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E02424 !important; border-color: rgba(224, 36, 36, var(--divide-opacity)) !important; } .gt-md\:divide-red-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C81E1E !important; border-color: rgba(200, 30, 30, var(--divide-opacity)) !important; } .gt-md\:divide-red-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9B1C1C !important; border-color: rgba(155, 28, 28, var(--divide-opacity)) !important; } .gt-md\:divide-red-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .gt-md\:divide-red > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F05252 !important; border-color: rgba(240, 82, 82, var(--divide-opacity)) !important; } .gt-md\:divide-orange-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FFF8F1 !important; border-color: rgba(255, 248, 241, var(--divide-opacity)) !important; } .gt-md\:divide-orange-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FEECDC !important; border-color: rgba(254, 236, 220, var(--divide-opacity)) !important; } .gt-md\:divide-orange-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCD9BD !important; border-color: rgba(252, 217, 189, var(--divide-opacity)) !important; } .gt-md\:divide-orange-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDBA8C !important; border-color: rgba(253, 186, 140, var(--divide-opacity)) !important; } .gt-md\:divide-orange-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF8A4C !important; border-color: rgba(255, 138, 76, var(--divide-opacity)) !important; } .gt-md\:divide-orange-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .gt-md\:divide-orange-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D03801 !important; border-color: rgba(208, 56, 1, var(--divide-opacity)) !important; } .gt-md\:divide-orange-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B43403 !important; border-color: rgba(180, 52, 3, var(--divide-opacity)) !important; } .gt-md\:divide-orange-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8A2C0D !important; border-color: rgba(138, 44, 13, var(--divide-opacity)) !important; } .gt-md\:divide-orange-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #771D1D !important; border-color: rgba(119, 29, 29, var(--divide-opacity)) !important; } .gt-md\:divide-orange > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FF5A1F !important; border-color: rgba(255, 90, 31, var(--divide-opacity)) !important; } .gt-md\:divide-yellow-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDFDEA !important; border-color: rgba(253, 253, 234, var(--divide-opacity)) !important; } .gt-md\:divide-yellow-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF6B2 !important; border-color: rgba(253, 246, 178, var(--divide-opacity)) !important; } .gt-md\:divide-yellow-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE96A !important; border-color: rgba(252, 233, 106, var(--divide-opacity)) !important; } .gt-md\:divide-yellow-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FACA15 !important; border-color: rgba(250, 202, 21, var(--divide-opacity)) !important; } .gt-md\:divide-yellow-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E3A008 !important; border-color: rgba(227, 160, 8, var(--divide-opacity)) !important; } .gt-md\:divide-yellow-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .gt-md\:divide-yellow-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9F580A !important; border-color: rgba(159, 88, 10, var(--divide-opacity)) !important; } .gt-md\:divide-yellow-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8E4B10 !important; border-color: rgba(142, 75, 16, var(--divide-opacity)) !important; } .gt-md\:divide-yellow-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #723B13 !important; border-color: rgba(114, 59, 19, var(--divide-opacity)) !important; } .gt-md\:divide-yellow-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #633112 !important; border-color: rgba(99, 49, 18, var(--divide-opacity)) !important; } .gt-md\:divide-yellow > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C27803 !important; border-color: rgba(194, 120, 3, var(--divide-opacity)) !important; } .gt-md\:divide-green-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F3FAF7 !important; border-color: rgba(243, 250, 247, var(--divide-opacity)) !important; } .gt-md\:divide-green-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DEF7EC !important; border-color: rgba(222, 247, 236, var(--divide-opacity)) !important; } .gt-md\:divide-green-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BCF0DA !important; border-color: rgba(188, 240, 218, var(--divide-opacity)) !important; } .gt-md\:divide-green-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #84E1BC !important; border-color: rgba(132, 225, 188, var(--divide-opacity)) !important; } .gt-md\:divide-green-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #31C48D !important; border-color: rgba(49, 196, 141, var(--divide-opacity)) !important; } .gt-md\:divide-green-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .gt-md\:divide-green-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #057A55 !important; border-color: rgba(5, 122, 85, var(--divide-opacity)) !important; } .gt-md\:divide-green-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #046C4E !important; border-color: rgba(4, 108, 78, var(--divide-opacity)) !important; } .gt-md\:divide-green-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #03543F !important; border-color: rgba(3, 84, 63, var(--divide-opacity)) !important; } .gt-md\:divide-green-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014737 !important; border-color: rgba(1, 71, 55, var(--divide-opacity)) !important; } .gt-md\:divide-green > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0E9F6E !important; border-color: rgba(14, 159, 110, var(--divide-opacity)) !important; } .gt-md\:divide-teal-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDFAFA !important; border-color: rgba(237, 250, 250, var(--divide-opacity)) !important; } .gt-md\:divide-teal-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D5F5F6 !important; border-color: rgba(213, 245, 246, var(--divide-opacity)) !important; } .gt-md\:divide-teal-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AFECEF !important; border-color: rgba(175, 236, 239, var(--divide-opacity)) !important; } .gt-md\:divide-teal-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7EDCE2 !important; border-color: rgba(126, 220, 226, var(--divide-opacity)) !important; } .gt-md\:divide-teal-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #16BDCA !important; border-color: rgba(22, 189, 202, var(--divide-opacity)) !important; } .gt-md\:divide-teal-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .gt-md\:divide-teal-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #047481 !important; border-color: rgba(4, 116, 129, var(--divide-opacity)) !important; } .gt-md\:divide-teal-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #036672 !important; border-color: rgba(3, 102, 114, var(--divide-opacity)) !important; } .gt-md\:divide-teal-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #05505C !important; border-color: rgba(5, 80, 92, var(--divide-opacity)) !important; } .gt-md\:divide-teal-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #014451 !important; border-color: rgba(1, 68, 81, var(--divide-opacity)) !important; } .gt-md\:divide-teal > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #0694A2 !important; border-color: rgba(6, 148, 162, var(--divide-opacity)) !important; } .gt-md\:divide-blue-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EBF5FF !important; border-color: rgba(235, 245, 255, var(--divide-opacity)) !important; } .gt-md\:divide-blue-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E1EFFE !important; border-color: rgba(225, 239, 254, var(--divide-opacity)) !important; } .gt-md\:divide-blue-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #C3DDFD !important; border-color: rgba(195, 221, 253, var(--divide-opacity)) !important; } .gt-md\:divide-blue-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #A4CAFE !important; border-color: rgba(164, 202, 254, var(--divide-opacity)) !important; } .gt-md\:divide-blue-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #76A9FA !important; border-color: rgba(118, 169, 250, var(--divide-opacity)) !important; } .gt-md\:divide-blue-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .gt-md\:divide-blue-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1C64F2 !important; border-color: rgba(28, 100, 242, var(--divide-opacity)) !important; } .gt-md\:divide-blue-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1A56DB !important; border-color: rgba(26, 86, 219, var(--divide-opacity)) !important; } .gt-md\:divide-blue-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #1E429F !important; border-color: rgba(30, 66, 159, var(--divide-opacity)) !important; } .gt-md\:divide-blue-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #233876 !important; border-color: rgba(35, 56, 118, var(--divide-opacity)) !important; } .gt-md\:divide-blue > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #3F83F8 !important; border-color: rgba(63, 131, 248, var(--divide-opacity)) !important; } .gt-md\:divide-indigo-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F0F5FF !important; border-color: rgba(240, 245, 255, var(--divide-opacity)) !important; } .gt-md\:divide-indigo-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E5EDFF !important; border-color: rgba(229, 237, 255, var(--divide-opacity)) !important; } .gt-md\:divide-indigo-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CDDBFE !important; border-color: rgba(205, 219, 254, var(--divide-opacity)) !important; } .gt-md\:divide-indigo-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #B4C6FC !important; border-color: rgba(180, 198, 252, var(--divide-opacity)) !important; } .gt-md\:divide-indigo-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #8DA2FB !important; border-color: rgba(141, 162, 251, var(--divide-opacity)) !important; } .gt-md\:divide-indigo-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .gt-md\:divide-indigo-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5850EC !important; border-color: rgba(88, 80, 236, var(--divide-opacity)) !important; } .gt-md\:divide-indigo-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5145CD !important; border-color: rgba(81, 69, 205, var(--divide-opacity)) !important; } .gt-md\:divide-indigo-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #42389D !important; border-color: rgba(66, 56, 157, var(--divide-opacity)) !important; } .gt-md\:divide-indigo-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #362F78 !important; border-color: rgba(54, 47, 120, var(--divide-opacity)) !important; } .gt-md\:divide-indigo > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6875F5 !important; border-color: rgba(104, 117, 245, var(--divide-opacity)) !important; } .gt-md\:divide-purple-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F6F5FF !important; border-color: rgba(246, 245, 255, var(--divide-opacity)) !important; } .gt-md\:divide-purple-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #EDEBFE !important; border-color: rgba(237, 235, 254, var(--divide-opacity)) !important; } .gt-md\:divide-purple-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #DCD7FE !important; border-color: rgba(220, 215, 254, var(--divide-opacity)) !important; } .gt-md\:divide-purple-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #CABFFD !important; border-color: rgba(202, 191, 253, var(--divide-opacity)) !important; } .gt-md\:divide-purple-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #AC94FA !important; border-color: rgba(172, 148, 250, var(--divide-opacity)) !important; } .gt-md\:divide-purple-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .gt-md\:divide-purple-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #7E3AF2 !important; border-color: rgba(126, 58, 242, var(--divide-opacity)) !important; } .gt-md\:divide-purple-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #6C2BD9 !important; border-color: rgba(108, 43, 217, var(--divide-opacity)) !important; } .gt-md\:divide-purple-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #5521B5 !important; border-color: rgba(85, 33, 181, var(--divide-opacity)) !important; } .gt-md\:divide-purple-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #4A1D96 !important; border-color: rgba(74, 29, 150, var(--divide-opacity)) !important; } .gt-md\:divide-purple > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #9061F9 !important; border-color: rgba(144, 97, 249, var(--divide-opacity)) !important; } .gt-md\:divide-pink-50 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FDF2F8 !important; border-color: rgba(253, 242, 248, var(--divide-opacity)) !important; } .gt-md\:divide-pink-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FCE8F3 !important; border-color: rgba(252, 232, 243, var(--divide-opacity)) !important; } .gt-md\:divide-pink-200 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #FAD1E8 !important; border-color: rgba(250, 209, 232, var(--divide-opacity)) !important; } .gt-md\:divide-pink-300 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F8B4D9 !important; border-color: rgba(248, 180, 217, var(--divide-opacity)) !important; } .gt-md\:divide-pink-400 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #F17EB8 !important; border-color: rgba(241, 126, 184, var(--divide-opacity)) !important; } .gt-md\:divide-pink-500 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .gt-md\:divide-pink-600 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #D61F69 !important; border-color: rgba(214, 31, 105, var(--divide-opacity)) !important; } .gt-md\:divide-pink-700 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #BF125D !important; border-color: rgba(191, 18, 93, var(--divide-opacity)) !important; } .gt-md\:divide-pink-800 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #99154B !important; border-color: rgba(153, 21, 75, var(--divide-opacity)) !important; } .gt-md\:divide-pink-900 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #751A3D !important; border-color: rgba(117, 26, 61, var(--divide-opacity)) !important; } .gt-md\:divide-pink > :not(template) ~ :not(template) { --divide-opacity: 1 !important; border-color: #E74694 !important; border-color: rgba(231, 70, 148, var(--divide-opacity)) !important; } .gt-md\:divide-opacity-0 > :not(template) ~ :not(template) { --divide-opacity: 0 !important; } .gt-md\:divide-opacity-12 > :not(template) ~ :not(template) { --divide-opacity: 0.12 !important; } .gt-md\:divide-opacity-25 > :not(template) ~ :not(template) { --divide-opacity: 0.25 !important; } .gt-md\:divide-opacity-38 > :not(template) ~ :not(template) { --divide-opacity: 0.38 !important; } .gt-md\:divide-opacity-50 > :not(template) ~ :not(template) { --divide-opacity: 0.5 !important; } .gt-md\:divide-opacity-54 > :not(template) ~ :not(template) { --divide-opacity: 0.54 !important; } .gt-md\:divide-opacity-70 > :not(template) ~ :not(template) { --divide-opacity: 0.70 !important; } .gt-md\:divide-opacity-75 > :not(template) ~ :not(template) { --divide-opacity: 0.75 !important; } .gt-md\:divide-opacity-84 > :not(template) ~ :not(template) { --divide-opacity: 0.84 !important; } .gt-md\:divide-opacity-100 > :not(template) ~ :not(template) { --divide-opacity: 1 !important; } .gt-md\:sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .gt-md\:not-sr-only { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .gt-md\:focus\:sr-only:focus { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border-width: 0 !important; } .gt-md\:focus\:not-sr-only:focus { position: static !important; width: auto !important; height: auto !important; padding: 0 !important; margin: 0 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; } .gt-md\:appearance-none { -webkit-appearance: none !important; -moz-appearance: none !important; appearance: none !important; } .gt-md\:bg-fixed { background-attachment: fixed !important; } .gt-md\:bg-local { background-attachment: local !important; } .gt-md\:bg-scroll { background-attachment: scroll !important; } .gt-md\:bg-opacity-0 { --bg-opacity: 0 !important; } .gt-md\:bg-opacity-12 { --bg-opacity: 0.12 !important; } .gt-md\:bg-opacity-25 { --bg-opacity: 0.25 !important; } .gt-md\:bg-opacity-38 { --bg-opacity: 0.38 !important; } .gt-md\:bg-opacity-50 { --bg-opacity: 0.5 !important; } .gt-md\:bg-opacity-54 { --bg-opacity: 0.54 !important; } .gt-md\:bg-opacity-70 { --bg-opacity: 0.70 !important; } .gt-md\:bg-opacity-75 { --bg-opacity: 0.75 !important; } .gt-md\:bg-opacity-84 { --bg-opacity: 0.84 !important; } .gt-md\:bg-opacity-100 { --bg-opacity: 1 !important; } .gt-md\:hover\:bg-opacity-0:hover { --bg-opacity: 0 !important; } .gt-md\:hover\:bg-opacity-12:hover { --bg-opacity: 0.12 !important; } .gt-md\:hover\:bg-opacity-25:hover { --bg-opacity: 0.25 !important; } .gt-md\:hover\:bg-opacity-38:hover { --bg-opacity: 0.38 !important; } .gt-md\:hover\:bg-opacity-50:hover { --bg-opacity: 0.5 !important; } .gt-md\:hover\:bg-opacity-54:hover { --bg-opacity: 0.54 !important; } .gt-md\:hover\:bg-opacity-70:hover { --bg-opacity: 0.70 !important; } .gt-md\:hover\:bg-opacity-75:hover { --bg-opacity: 0.75 !important; } .gt-md\:hover\:bg-opacity-84:hover { --bg-opacity: 0.84 !important; } .gt-md\:hover\:bg-opacity-100:hover { --bg-opacity: 1 !important; } .gt-md\:focus\:bg-opacity-0:focus { --bg-opacity: 0 !important; } .gt-md\:focus\:bg-opacity-12:focus { --bg-opacity: 0.12 !important; } .gt-md\:focus\:bg-opacity-25:focus { --bg-opacity: 0.25 !important; } .gt-md\:focus\:bg-opacity-38:focus { --bg-opacity: 0.38 !important; } .gt-md\:focus\:bg-opacity-50:focus { --bg-opacity: 0.5 !important; } .gt-md\:focus\:bg-opacity-54:focus { --bg-opacity: 0.54 !important; } .gt-md\:focus\:bg-opacity-70:focus { --bg-opacity: 0.70 !important; } .gt-md\:focus\:bg-opacity-75:focus { --bg-opacity: 0.75 !important; } .gt-md\:focus\:bg-opacity-84:focus { --bg-opacity: 0.84 !important; } .gt-md\:focus\:bg-opacity-100:focus { --bg-opacity: 1 !important; } .gt-md\:bg-bottom { background-position: bottom !important; } .gt-md\:bg-center { background-position: center !important; } .gt-md\:bg-left { background-position: left !important; } .gt-md\:bg-left-bottom { background-position: left bottom !important; } .gt-md\:bg-left-top { background-position: left top !important; } .gt-md\:bg-right { background-position: right !important; } .gt-md\:bg-right-bottom { background-position: right bottom !important; } .gt-md\:bg-right-top { background-position: right top !important; } .gt-md\:bg-top { background-position: top !important; } .gt-md\:bg-repeat { background-repeat: repeat !important; } .gt-md\:bg-no-repeat { background-repeat: no-repeat !important; } .gt-md\:bg-repeat-x { background-repeat: repeat-x !important; } .gt-md\:bg-repeat-y { background-repeat: repeat-y !important; } .gt-md\:bg-repeat-round { background-repeat: round !important; } .gt-md\:bg-repeat-space { background-repeat: space !important; } .gt-md\:bg-auto { background-size: auto !important; } .gt-md\:bg-cover { background-size: cover !important; } .gt-md\:bg-contain { background-size: contain !important; } .gt-md\:border-collapse { border-collapse: collapse !important; } .gt-md\:border-separate { border-collapse: separate !important; } .gt-md\:border-opacity-0 { --border-opacity: 0 !important; } .gt-md\:border-opacity-12 { --border-opacity: 0.12 !important; } .gt-md\:border-opacity-25 { --border-opacity: 0.25 !important; } .gt-md\:border-opacity-38 { --border-opacity: 0.38 !important; } .gt-md\:border-opacity-50 { --border-opacity: 0.5 !important; } .gt-md\:border-opacity-54 { --border-opacity: 0.54 !important; } .gt-md\:border-opacity-70 { --border-opacity: 0.70 !important; } .gt-md\:border-opacity-75 { --border-opacity: 0.75 !important; } .gt-md\:border-opacity-84 { --border-opacity: 0.84 !important; } .gt-md\:border-opacity-100 { --border-opacity: 1 !important; } .gt-md\:hover\:border-opacity-0:hover { --border-opacity: 0 !important; } .gt-md\:hover\:border-opacity-12:hover { --border-opacity: 0.12 !important; } .gt-md\:hover\:border-opacity-25:hover { --border-opacity: 0.25 !important; } .gt-md\:hover\:border-opacity-38:hover { --border-opacity: 0.38 !important; } .gt-md\:hover\:border-opacity-50:hover { --border-opacity: 0.5 !important; } .gt-md\:hover\:border-opacity-54:hover { --border-opacity: 0.54 !important; } .gt-md\:hover\:border-opacity-70:hover { --border-opacity: 0.70 !important; } .gt-md\:hover\:border-opacity-75:hover { --border-opacity: 0.75 !important; } .gt-md\:hover\:border-opacity-84:hover { --border-opacity: 0.84 !important; } .gt-md\:hover\:border-opacity-100:hover { --border-opacity: 1 !important; } .gt-md\:focus\:border-opacity-0:focus { --border-opacity: 0 !important; } .gt-md\:focus\:border-opacity-12:focus { --border-opacity: 0.12 !important; } .gt-md\:focus\:border-opacity-25:focus { --border-opacity: 0.25 !important; } .gt-md\:focus\:border-opacity-38:focus { --border-opacity: 0.38 !important; } .gt-md\:focus\:border-opacity-50:focus { --border-opacity: 0.5 !important; } .gt-md\:focus\:border-opacity-54:focus { --border-opacity: 0.54 !important; } .gt-md\:focus\:border-opacity-70:focus { --border-opacity: 0.70 !important; } .gt-md\:focus\:border-opacity-75:focus { --border-opacity: 0.75 !important; } .gt-md\:focus\:border-opacity-84:focus { --border-opacity: 0.84 !important; } .gt-md\:focus\:border-opacity-100:focus { --border-opacity: 1 !important; } .gt-md\:rounded-none { border-radius: 0 !important; } .gt-md\:rounded-sm { border-radius: 0.125rem !important; } .gt-md\:rounded { border-radius: 0.25rem !important; } .gt-md\:rounded-md { border-radius: 0.375rem !important; } .gt-md\:rounded-lg { border-radius: 0.5rem !important; } .gt-md\:rounded-full { border-radius: 9999px !important; } .gt-md\:rounded-t-none { border-top-left-radius: 0 !important; border-top-right-radius: 0 !important; } .gt-md\:rounded-r-none { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; } .gt-md\:rounded-b-none { border-bottom-right-radius: 0 !important; border-bottom-left-radius: 0 !important; } .gt-md\:rounded-l-none { border-top-left-radius: 0 !important; border-bottom-left-radius: 0 !important; } .gt-md\:rounded-t-sm { border-top-left-radius: 0.125rem !important; border-top-right-radius: 0.125rem !important; } .gt-md\:rounded-r-sm { border-top-right-radius: 0.125rem !important; border-bottom-right-radius: 0.125rem !important; } .gt-md\:rounded-b-sm { border-bottom-right-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .gt-md\:rounded-l-sm { border-top-left-radius: 0.125rem !important; border-bottom-left-radius: 0.125rem !important; } .gt-md\:rounded-t { border-top-left-radius: 0.25rem !important; border-top-right-radius: 0.25rem !important; } .gt-md\:rounded-r { border-top-right-radius: 0.25rem !important; border-bottom-right-radius: 0.25rem !important; } .gt-md\:rounded-b { border-bottom-right-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .gt-md\:rounded-l { border-top-left-radius: 0.25rem !important; border-bottom-left-radius: 0.25rem !important; } .gt-md\:rounded-t-md { border-top-left-radius: 0.375rem !important; border-top-right-radius: 0.375rem !important; } .gt-md\:rounded-r-md { border-top-right-radius: 0.375rem !important; border-bottom-right-radius: 0.375rem !important; } .gt-md\:rounded-b-md { border-bottom-right-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .gt-md\:rounded-l-md { border-top-left-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; } .gt-md\:rounded-t-lg { border-top-left-radius: 0.5rem !important; border-top-right-radius: 0.5rem !important; } .gt-md\:rounded-r-lg { border-top-right-radius: 0.5rem !important; border-bottom-right-radius: 0.5rem !important; } .gt-md\:rounded-b-lg { border-bottom-right-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .gt-md\:rounded-l-lg { border-top-left-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; } .gt-md\:rounded-t-full { border-top-left-radius: 9999px !important; border-top-right-radius: 9999px !important; } .gt-md\:rounded-r-full { border-top-right-radius: 9999px !important; border-bottom-right-radius: 9999px !important; } .gt-md\:rounded-b-full { border-bottom-right-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .gt-md\:rounded-l-full { border-top-left-radius: 9999px !important; border-bottom-left-radius: 9999px !important; } .gt-md\:rounded-tl-none { border-top-left-radius: 0 !important; } .gt-md\:rounded-tr-none { border-top-right-radius: 0 !important; } .gt-md\:rounded-br-none { border-bottom-right-radius: 0 !important; } .gt-md\:rounded-bl-none { border-bottom-left-radius: 0 !important; } .gt-md\:rounded-tl-sm { border-top-left-radius: 0.125rem !important; } .gt-md\:rounded-tr-sm { border-top-right-radius: 0.125rem !important; } .gt-md\:rounded-br-sm { border-bottom-right-radius: 0.125rem !important; } .gt-md\:rounded-bl-sm { border-bottom-left-radius: 0.125rem !important; } .gt-md\:rounded-tl { border-top-left-radius: 0.25rem !important; } .gt-md\:rounded-tr { border-top-right-radius: 0.25rem !important; } .gt-md\:rounded-br { border-bottom-right-radius: 0.25rem !important; } .gt-md\:rounded-bl { border-bottom-left-radius: 0.25rem !important; } .gt-md\:rounded-tl-md { border-top-left-radius: 0.375rem !important; } .gt-md\:rounded-tr-md { border-top-right-radius: 0.375rem !important; } .gt-md\:rounded-br-md { border-bottom-right-radius: 0.375rem !important; } .gt-md\:rounded-bl-md { border-bottom-left-radius: 0.375rem !important; } .gt-md\:rounded-tl-lg { border-top-left-radius: 0.5rem !important; } .gt-md\:rounded-tr-lg { border-top-right-radius: 0.5rem !important; } .gt-md\:rounded-br-lg { border-bottom-right-radius: 0.5rem !important; } .gt-md\:rounded-bl-lg { border-bottom-left-radius: 0.5rem !important; } .gt-md\:rounded-tl-full { border-top-left-radius: 9999px !important; } .gt-md\:rounded-tr-full { border-top-right-radius: 9999px !important; } .gt-md\:rounded-br-full { border-bottom-right-radius: 9999px !important; } .gt-md\:rounded-bl-full { border-bottom-left-radius: 9999px !important; } .gt-md\:border-solid { border-style: solid !important; } .gt-md\:border-dashed { border-style: dashed !important; } .gt-md\:border-dotted { border-style: dotted !important; } .gt-md\:border-double { border-style: double !important; } .gt-md\:border-none { border-style: none !important; } .gt-md\:border-0 { border-width: 0 !important; } .gt-md\:border-2 { border-width: 2px !important; } .gt-md\:border-4 { border-width: 4px !important; } .gt-md\:border-8 { border-width: 8px !important; } .gt-md\:border { border-width: 1px !important; } .gt-md\:border-t-0 { border-top-width: 0 !important; } .gt-md\:border-r-0 { border-right-width: 0 !important; } .gt-md\:border-b-0 { border-bottom-width: 0 !important; } .gt-md\:border-l-0 { border-left-width: 0 !important; } .gt-md\:border-t-2 { border-top-width: 2px !important; } .gt-md\:border-r-2 { border-right-width: 2px !important; } .gt-md\:border-b-2 { border-bottom-width: 2px !important; } .gt-md\:border-l-2 { border-left-width: 2px !important; } .gt-md\:border-t-4 { border-top-width: 4px !important; } .gt-md\:border-r-4 { border-right-width: 4px !important; } .gt-md\:border-b-4 { border-bottom-width: 4px !important; } .gt-md\:border-l-4 { border-left-width: 4px !important; } .gt-md\:border-t-8 { border-top-width: 8px !important; } .gt-md\:border-r-8 { border-right-width: 8px !important; } .gt-md\:border-b-8 { border-bottom-width: 8px !important; } .gt-md\:border-l-8 { border-left-width: 8px !important; } .gt-md\:border-t { border-top-width: 1px !important; } .gt-md\:border-r { border-right-width: 1px !important; } .gt-md\:border-b { border-bottom-width: 1px !important; } .gt-md\:border-l { border-left-width: 1px !important; } .gt-md\:first\:border-0:first-child { border-width: 0 !important; } .gt-md\:first\:border-2:first-child { border-width: 2px !important; } .gt-md\:first\:border-4:first-child { border-width: 4px !important; } .gt-md\:first\:border-8:first-child { border-width: 8px !important; } .gt-md\:first\:border:first-child { border-width: 1px !important; } .gt-md\:first\:border-t-0:first-child { border-top-width: 0 !important; } .gt-md\:first\:border-r-0:first-child { border-right-width: 0 !important; } .gt-md\:first\:border-b-0:first-child { border-bottom-width: 0 !important; } .gt-md\:first\:border-l-0:first-child { border-left-width: 0 !important; } .gt-md\:first\:border-t-2:first-child { border-top-width: 2px !important; } .gt-md\:first\:border-r-2:first-child { border-right-width: 2px !important; } .gt-md\:first\:border-b-2:first-child { border-bottom-width: 2px !important; } .gt-md\:first\:border-l-2:first-child { border-left-width: 2px !important; } .gt-md\:first\:border-t-4:first-child { border-top-width: 4px !important; } .gt-md\:first\:border-r-4:first-child { border-right-width: 4px !important; } .gt-md\:first\:border-b-4:first-child { border-bottom-width: 4px !important; } .gt-md\:first\:border-l-4:first-child { border-left-width: 4px !important; } .gt-md\:first\:border-t-8:first-child { border-top-width: 8px !important; } .gt-md\:first\:border-r-8:first-child { border-right-width: 8px !important; } .gt-md\:first\:border-b-8:first-child { border-bottom-width: 8px !important; } .gt-md\:first\:border-l-8:first-child { border-left-width: 8px !important; } .gt-md\:first\:border-t:first-child { border-top-width: 1px !important; } .gt-md\:first\:border-r:first-child { border-right-width: 1px !important; } .gt-md\:first\:border-b:first-child { border-bottom-width: 1px !important; } .gt-md\:first\:border-l:first-child { border-left-width: 1px !important; } .gt-md\:last\:border-0:last-child { border-width: 0 !important; } .gt-md\:last\:border-2:last-child { border-width: 2px !important; } .gt-md\:last\:border-4:last-child { border-width: 4px !important; } .gt-md\:last\:border-8:last-child { border-width: 8px !important; } .gt-md\:last\:border:last-child { border-width: 1px !important; } .gt-md\:last\:border-t-0:last-child { border-top-width: 0 !important; } .gt-md\:last\:border-r-0:last-child { border-right-width: 0 !important; } .gt-md\:last\:border-b-0:last-child { border-bottom-width: 0 !important; } .gt-md\:last\:border-l-0:last-child { border-left-width: 0 !important; } .gt-md\:last\:border-t-2:last-child { border-top-width: 2px !important; } .gt-md\:last\:border-r-2:last-child { border-right-width: 2px !important; } .gt-md\:last\:border-b-2:last-child { border-bottom-width: 2px !important; } .gt-md\:last\:border-l-2:last-child { border-left-width: 2px !important; } .gt-md\:last\:border-t-4:last-child { border-top-width: 4px !important; } .gt-md\:last\:border-r-4:last-child { border-right-width: 4px !important; } .gt-md\:last\:border-b-4:last-child { border-bottom-width: 4px !important; } .gt-md\:last\:border-l-4:last-child { border-left-width: 4px !important; } .gt-md\:last\:border-t-8:last-child { border-top-width: 8px !important; } .gt-md\:last\:border-r-8:last-child { border-right-width: 8px !important; } .gt-md\:last\:border-b-8:last-child { border-bottom-width: 8px !important; } .gt-md\:last\:border-l-8:last-child { border-left-width: 8px !important; } .gt-md\:last\:border-t:last-child { border-top-width: 1px !important; } .gt-md\:last\:border-r:last-child { border-right-width: 1px !important; } .gt-md\:last\:border-b:last-child { border-bottom-width: 1px !important; } .gt-md\:last\:border-l:last-child { border-left-width: 1px !important; } .gt-md\:box-border { box-sizing: border-box !important; } .gt-md\:box-content { box-sizing: content-box !important; } .gt-md\:block { display: block !important; } .gt-md\:inline-block { display: inline-block !important; } .gt-md\:inline { display: inline !important; } .gt-md\:flex { display: flex !important; } .gt-md\:inline-flex { display: inline-flex !important; } .gt-md\:table { display: table !important; } .gt-md\:table-caption { display: table-caption !important; } .gt-md\:table-cell { display: table-cell !important; } .gt-md\:table-column { display: table-column !important; } .gt-md\:table-column-group { display: table-column-group !important; } .gt-md\:table-footer-group { display: table-footer-group !important; } .gt-md\:table-header-group { display: table-header-group !important; } .gt-md\:table-row-group { display: table-row-group !important; } .gt-md\:table-row { display: table-row !important; } .gt-md\:flow-root { display: flow-root !important; } .gt-md\:grid { display: grid !important; } .gt-md\:inline-grid { display: inline-grid !important; } .gt-md\:hidden { display: none !important; } .gt-md\:flex-row { flex-direction: row !important; } .gt-md\:flex-row-reverse { flex-direction: row-reverse !important; } .gt-md\:flex-col { flex-direction: column !important; } .gt-md\:flex-col-reverse { flex-direction: column-reverse !important; } .gt-md\:flex-wrap { flex-wrap: wrap !important; } .gt-md\:flex-wrap-reverse { flex-wrap: wrap-reverse !important; } .gt-md\:flex-no-wrap { flex-wrap: nowrap !important; } .gt-md\:items-start { align-items: flex-start !important; } .gt-md\:items-end { align-items: flex-end !important; } .gt-md\:items-center { align-items: center !important; } .gt-md\:items-baseline { align-items: baseline !important; } .gt-md\:items-stretch { align-items: stretch !important; } .gt-md\:self-auto { align-self: auto !important; } .gt-md\:self-start { align-self: flex-start !important; } .gt-md\:self-end { align-self: flex-end !important; } .gt-md\:self-center { align-self: center !important; } .gt-md\:self-stretch { align-self: stretch !important; } .gt-md\:justify-start { justify-content: flex-start !important; } .gt-md\:justify-end { justify-content: flex-end !important; } .gt-md\:justify-center { justify-content: center !important; } .gt-md\:justify-between { justify-content: space-between !important; } .gt-md\:justify-around { justify-content: space-around !important; } .gt-md\:justify-evenly { justify-content: space-evenly !important; } .gt-md\:content-center { align-content: center !important; } .gt-md\:content-start { align-content: flex-start !important; } .gt-md\:content-end { align-content: flex-end !important; } .gt-md\:content-between { align-content: space-between !important; } .gt-md\:content-around { align-content: space-around !important; } .gt-md\:flex-0 { flex: 0 0 auto !important; } .gt-md\:flex-1 { flex: 1 1 0% !important; } .gt-md\:flex-auto { flex: 1 1 auto !important; } .gt-md\:flex-initial { flex: 0 1 auto !important; } .gt-md\:flex-none { flex: none !important; } .gt-md\:flex-grow-0 { flex-grow: 0 !important; } .gt-md\:flex-grow { flex-grow: 1 !important; } .gt-md\:flex-shrink-0 { flex-shrink: 0 !important; } .gt-md\:flex-shrink { flex-shrink: 1 !important; } .gt-md\:order-1 { order: 1 !important; } .gt-md\:order-2 { order: 2 !important; } .gt-md\:order-3 { order: 3 !important; } .gt-md\:order-4 { order: 4 !important; } .gt-md\:order-5 { order: 5 !important; } .gt-md\:order-6 { order: 6 !important; } .gt-md\:order-7 { order: 7 !important; } .gt-md\:order-8 { order: 8 !important; } .gt-md\:order-9 { order: 9 !important; } .gt-md\:order-10 { order: 10 !important; } .gt-md\:order-11 { order: 11 !important; } .gt-md\:order-12 { order: 12 !important; } .gt-md\:order-first { order: -9999 !important; } .gt-md\:order-last { order: 9999 !important; } .gt-md\:order-none { order: 0 !important; } .gt-md\:font-hairline { font-weight: 100 !important; } .gt-md\:font-thin { font-weight: 200 !important; } .gt-md\:font-light { font-weight: 300 !important; } .gt-md\:font-normal { font-weight: 400 !important; } .gt-md\:font-medium { font-weight: 500 !important; } .gt-md\:font-semibold { font-weight: 600 !important; } .gt-md\:font-bold { font-weight: 700 !important; } .gt-md\:font-extrabold { font-weight: 800 !important; } .gt-md\:font-black { font-weight: 900 !important; } .gt-md\:h-0 { height: 0 !important; } .gt-md\:h-1 { height: 0.25rem !important; } .gt-md\:h-2 { height: 0.5rem !important; } .gt-md\:h-3 { height: 0.75rem !important; } .gt-md\:h-4 { height: 1rem !important; } .gt-md\:h-5 { height: 1.25rem !important; } .gt-md\:h-6 { height: 1.5rem !important; } .gt-md\:h-8 { height: 2rem !important; } .gt-md\:h-10 { height: 2.5rem !important; } .gt-md\:h-12 { height: 3rem !important; } .gt-md\:h-14 { height: 3.5rem !important; } .gt-md\:h-16 { height: 4rem !important; } .gt-md\:h-18 { height: 4.5rem !important; } .gt-md\:h-20 { height: 5rem !important; } .gt-md\:h-22 { height: 5.5rem !important; } .gt-md\:h-24 { height: 6rem !important; } .gt-md\:h-26 { height: 6.5rem !important; } .gt-md\:h-28 { height: 7rem !important; } .gt-md\:h-30 { height: 7.5rem !important; } .gt-md\:h-32 { height: 8rem !important; } .gt-md\:h-36 { height: 9rem !important; } .gt-md\:h-40 { height: 10rem !important; } .gt-md\:h-48 { height: 12rem !important; } .gt-md\:h-50 { height: 12.5rem !important; } .gt-md\:h-56 { height: 14rem !important; } .gt-md\:h-60 { height: 15rem !important; } .gt-md\:h-64 { height: 16rem !important; } .gt-md\:h-80 { height: 20rem !important; } .gt-md\:h-90 { height: 24rem !important; } .gt-md\:h-100 { height: 25rem !important; } .gt-md\:h-120 { height: 30rem !important; } .gt-md\:h-128 { height: 32rem !important; } .gt-md\:h-140 { height: 35rem !important; } .gt-md\:h-160 { height: 40rem !important; } .gt-md\:h-180 { height: 45rem !important; } .gt-md\:h-192 { height: 48rem !important; } .gt-md\:h-200 { height: 50rem !important; } .gt-md\:h-240 { height: 60rem !important; } .gt-md\:h-256 { height: 64rem !important; } .gt-md\:h-280 { height: 70rem !important; } .gt-md\:h-320 { height: 80rem !important; } .gt-md\:h-360 { height: 90rem !important; } .gt-md\:h-400 { height: 100rem !important; } .gt-md\:h-480 { height: 120rem !important; } .gt-md\:h-auto { height: auto !important; } .gt-md\:h-px { height: 1px !important; } .gt-md\:h-2px { height: 2px !important; } .gt-md\:h-full { height: 100% !important; } .gt-md\:h-screen { height: 100vh !important; } .gt-md\:h-1\/2 { height: 50% !important; } .gt-md\:h-1\/3 { height: 33.33333% !important; } .gt-md\:h-2\/3 { height: 66.66667% !important; } .gt-md\:h-1\/4 { height: 25% !important; } .gt-md\:h-2\/4 { height: 50% !important; } .gt-md\:h-3\/4 { height: 75% !important; } .gt-md\:h-1\/5 { height: 20% !important; } .gt-md\:h-2\/5 { height: 40% !important; } .gt-md\:h-3\/5 { height: 60% !important; } .gt-md\:h-4\/5 { height: 80% !important; } .gt-md\:h-1\/12 { height: 8.33333% !important; } .gt-md\:h-2\/12 { height: 16.66667% !important; } .gt-md\:h-3\/12 { height: 25% !important; } .gt-md\:h-4\/12 { height: 33.33333% !important; } .gt-md\:h-5\/12 { height: 41.66667% !important; } .gt-md\:h-6\/12 { height: 50% !important; } .gt-md\:h-7\/12 { height: 58.33333% !important; } .gt-md\:h-8\/12 { height: 66.66667% !important; } .gt-md\:h-9\/12 { height: 75% !important; } .gt-md\:h-10\/12 { height: 83.33333% !important; } .gt-md\:h-11\/12 { height: 91.66667% !important; } .gt-md\:text-xs { font-size: 0.625rem !important; } .gt-md\:text-sm { font-size: 0.75rem !important; } .gt-md\:text-md { font-size: 0.8125rem !important; } .gt-md\:text-base { font-size: 0.875rem !important; } .gt-md\:text-lg { font-size: 1rem !important; } .gt-md\:text-xl { font-size: 1.125rem !important; } .gt-md\:text-2xl { font-size: 1.25rem !important; } .gt-md\:text-3xl { font-size: 1.5rem !important; } .gt-md\:text-4xl { font-size: 2rem !important; } .gt-md\:text-5xl { font-size: 2.25rem !important; } .gt-md\:text-6xl { font-size: 2.5rem !important; } .gt-md\:text-7xl { font-size: 3rem !important; } .gt-md\:text-8xl { font-size: 4rem !important; } .gt-md\:text-9xl { font-size: 6rem !important; } .gt-md\:text-10xl { font-size: 8rem !important; } .gt-md\:leading-3 { line-height: .75rem !important; } .gt-md\:leading-4 { line-height: 1rem !important; } .gt-md\:leading-5 { line-height: 1.25rem !important; } .gt-md\:leading-6 { line-height: 1.5rem !important; } .gt-md\:leading-7 { line-height: 1.75rem !important; } .gt-md\:leading-8 { line-height: 2rem !important; } .gt-md\:leading-9 { line-height: 2.25rem !important; } .gt-md\:leading-10 { line-height: 2.5rem !important; } .gt-md\:leading-none { line-height: 1 !important; } .gt-md\:leading-tight { line-height: 1.25 !important; } .gt-md\:leading-snug { line-height: 1.375 !important; } .gt-md\:leading-normal { line-height: 1.5 !important; } .gt-md\:leading-relaxed { line-height: 1.625 !important; } .gt-md\:leading-loose { line-height: 2 !important; } .gt-md\:list-inside { list-style-position: inside !important; } .gt-md\:list-outside { list-style-position: outside !important; } .gt-md\:list-none { list-style-type: none !important; } .gt-md\:list-disc { list-style-type: disc !important; } .gt-md\:list-decimal { list-style-type: decimal !important; } .gt-md\:m-0 { margin: 0 !important; } .gt-md\:m-1 { margin: 0.25rem !important; } .gt-md\:m-2 { margin: 0.5rem !important; } .gt-md\:m-3 { margin: 0.75rem !important; } .gt-md\:m-4 { margin: 1rem !important; } .gt-md\:m-5 { margin: 1.25rem !important; } .gt-md\:m-6 { margin: 1.5rem !important; } .gt-md\:m-8 { margin: 2rem !important; } .gt-md\:m-10 { margin: 2.5rem !important; } .gt-md\:m-12 { margin: 3rem !important; } .gt-md\:m-14 { margin: 3.5rem !important; } .gt-md\:m-16 { margin: 4rem !important; } .gt-md\:m-18 { margin: 4.5rem !important; } .gt-md\:m-20 { margin: 5rem !important; } .gt-md\:m-22 { margin: 5.5rem !important; } .gt-md\:m-24 { margin: 6rem !important; } .gt-md\:m-26 { margin: 6.5rem !important; } .gt-md\:m-28 { margin: 7rem !important; } .gt-md\:m-30 { margin: 7.5rem !important; } .gt-md\:m-32 { margin: 8rem !important; } .gt-md\:m-36 { margin: 9rem !important; } .gt-md\:m-40 { margin: 10rem !important; } .gt-md\:m-48 { margin: 12rem !important; } .gt-md\:m-56 { margin: 14rem !important; } .gt-md\:m-64 { margin: 16rem !important; } .gt-md\:m-auto { margin: auto !important; } .gt-md\:m-px { margin: 1px !important; } .gt-md\:m-2px { margin: 2px !important; } .gt-md\:-m-1 { margin: -0.25rem !important; } .gt-md\:-m-2 { margin: -0.5rem !important; } .gt-md\:-m-3 { margin: -0.75rem !important; } .gt-md\:-m-4 { margin: -1rem !important; } .gt-md\:-m-5 { margin: -1.25rem !important; } .gt-md\:-m-6 { margin: -1.5rem !important; } .gt-md\:-m-8 { margin: -2rem !important; } .gt-md\:-m-10 { margin: -2.5rem !important; } .gt-md\:-m-12 { margin: -3rem !important; } .gt-md\:-m-14 { margin: -3.5rem !important; } .gt-md\:-m-16 { margin: -4rem !important; } .gt-md\:-m-18 { margin: -4.5rem !important; } .gt-md\:-m-20 { margin: -5rem !important; } .gt-md\:-m-22 { margin: -5.5rem !important; } .gt-md\:-m-24 { margin: -6rem !important; } .gt-md\:-m-26 { margin: -6.5rem !important; } .gt-md\:-m-28 { margin: -7rem !important; } .gt-md\:-m-30 { margin: -7.5rem !important; } .gt-md\:-m-32 { margin: -8rem !important; } .gt-md\:-m-36 { margin: -9rem !important; } .gt-md\:-m-40 { margin: -10rem !important; } .gt-md\:-m-48 { margin: -12rem !important; } .gt-md\:-m-56 { margin: -14rem !important; } .gt-md\:-m-64 { margin: -16rem !important; } .gt-md\:-m-px { margin: -1px !important; } .gt-md\:-m-2px { margin: -2px !important; } .gt-md\:my-0 { margin-top: 0 !important; margin-bottom: 0 !important; } .gt-md\:mx-0 { margin-left: 0 !important; margin-right: 0 !important; } .gt-md\:my-1 { margin-top: 0.25rem !important; margin-bottom: 0.25rem !important; } .gt-md\:mx-1 { margin-left: 0.25rem !important; margin-right: 0.25rem !important; } .gt-md\:my-2 { margin-top: 0.5rem !important; margin-bottom: 0.5rem !important; } .gt-md\:mx-2 { margin-left: 0.5rem !important; margin-right: 0.5rem !important; } .gt-md\:my-3 { margin-top: 0.75rem !important; margin-bottom: 0.75rem !important; } .gt-md\:mx-3 { margin-left: 0.75rem !important; margin-right: 0.75rem !important; } .gt-md\:my-4 { margin-top: 1rem !important; margin-bottom: 1rem !important; } .gt-md\:mx-4 { margin-left: 1rem !important; margin-right: 1rem !important; } .gt-md\:my-5 { margin-top: 1.25rem !important; margin-bottom: 1.25rem !important; } .gt-md\:mx-5 { margin-left: 1.25rem !important; margin-right: 1.25rem !important; } .gt-md\:my-6 { margin-top: 1.5rem !important; margin-bottom: 1.5rem !important; } .gt-md\:mx-6 { margin-left: 1.5rem !important; margin-right: 1.5rem !important; } .gt-md\:my-8 { margin-top: 2rem !important; margin-bottom: 2rem !important; } .gt-md\:mx-8 { margin-left: 2rem !important; margin-right: 2rem !important; } .gt-md\:my-10 { margin-top: 2.5rem !important; margin-bottom: 2.5rem !important; } .gt-md\:mx-10 { margin-left: 2.5rem !important; margin-right: 2.5rem !important; } .gt-md\:my-12 { margin-top: 3rem !important; margin-bottom: 3rem !important; } .gt-md\:mx-12 { margin-left: 3rem !important; margin-right: 3rem !important; } .gt-md\:my-14 { margin-top: 3.5rem !important; margin-bottom: 3.5rem !important; } .gt-md\:mx-14 { margin-left: 3.5rem !important; margin-right: 3.5rem !important; } .gt-md\:my-16 { margin-top: 4rem !important; margin-bottom: 4rem !important; } .gt-md\:mx-16 { margin-left: 4rem !important; margin-right: 4rem !important; } .gt-md\:my-18 { margin-top: 4.5rem !important; margin-bottom: 4.5rem !important; } .gt-md\:mx-18 { margin-left: 4.5rem !important; margin-right: 4.5rem !important; } .gt-md\:my-20 { margin-top: 5rem !important; margin-bottom: 5rem !important; } .gt-md\:mx-20 { margin-left: 5rem !important; margin-right: 5rem !important; } .gt-md\:my-22 { margin-top: 5.5rem !important; margin-bottom: 5.5rem !important; } .gt-md\:mx-22 { margin-left: 5.5rem !important; margin-right: 5.5rem !important; } .gt-md\:my-24 { margin-top: 6rem !important; margin-bottom: 6rem !important; } .gt-md\:mx-24 { margin-left: 6rem !important; margin-right: 6rem !important; } .gt-md\:my-26 { margin-top: 6.5rem !important; margin-bottom: 6.5rem !important; } .gt-md\:mx-26 { margin-left: 6.5rem !important; margin-right: 6.5rem !important; } .gt-md\:my-28 { margin-top: 7rem !important; margin-bottom: 7rem !important; } .gt-md\:mx-28 { margin-left: 7rem !important; margin-right: 7rem !important; } .gt-md\:my-30 { margin-top: 7.5rem !important; margin-bottom: 7.5rem !important; } .gt-md\:mx-30 { margin-left: 7.5rem !important; margin-right: 7.5rem !important; } .gt-md\:my-32 { margin-top: 8rem !important; margin-bottom: 8rem !important; } .gt-md\:mx-32 { margin-left: 8rem !important; margin-right: 8rem !important; } .gt-md\:my-36 { margin-top: 9rem !important; margin-bottom: 9rem !important; } .gt-md\:mx-36 { margin-left: 9rem !important; margin-right: 9rem !important; } .gt-md\:my-40 { margin-top: 10rem !important; margin-bottom: 10rem !important; } .gt-md\:mx-40 { margin-left: 10rem !important; margin-right: 10rem !important; } .gt-md\:my-48 { margin-top: 12rem !important; margin-bottom: 12rem !important; } .gt-md\:mx-48 { margin-left: 12rem !important; margin-right: 12rem !important; } .gt-md\:my-56 { margin-top: 14rem !important; margin-bottom: 14rem !important; } .gt-md\:mx-56 { margin-left: 14rem !important; margin-right: 14rem !important; } .gt-md\:my-64 { margin-top: 16rem !important; margin-bottom: 16rem !important; } .gt-md\:mx-64 { margin-left: 16rem !important; margin-right: 16rem !important; } .gt-md\:my-auto { margin-top: auto !important; margin-bottom: auto !important; } .gt-md\:mx-auto { margin-left: auto !important; margin-right: auto !important; } .gt-md\:my-px { margin-top: 1px !important; margin-bottom: 1px !important; } .gt-md\:mx-px { margin-left: 1px !important; margin-right: 1px !important; } .gt-md\:my-2px { margin-top: 2px !important; margin-bottom: 2px !important; } .gt-md\:mx-2px { margin-left: 2px !important; margin-right: 2px !important; } .gt-md\:-my-1 { margin-top: -0.25rem !important; margin-bottom: -0.25rem !important; } .gt-md\:-mx-1 { margin-left: -0.25rem !important; margin-right: -0.25rem !important; } .gt-md\:-my-2 { margin-top: -0.5rem !important; margin-bottom: -0.5rem !important; } .gt-md\:-mx-2 { margin-left: -0.5rem !important; margin-right: -0.5rem !important; } .gt-md\:-my-3 { margin-top: -0.75rem !important; margin-bottom: -0.75rem !important; } .gt-md\:-mx-3 { margin-left: -0.75rem !important; margin-right: -0.75rem !important; } .gt-md\:-my-4 { margin-top: -1rem !important; margin-bottom: -1rem !important; } .gt-md\:-mx-4 { margin-left: -1rem !important; margin-right: -1rem !important; } .gt-md\:-my-5 { margin-top: -1.25rem !important; margin-bottom: -1.25rem !important; } .gt-md\:-mx-5 { margin-left: -1.25rem !important; margin-right: -1.25rem !important; } .gt-md\:-my-6 { margin-top: -1.5rem !important; margin-bottom: -1.5rem !important; } .gt-md\:-mx-6 { margin-left: -1.5rem !important; margin-right: -1.5rem !important; } .gt-md\:-my-8 { margin-top: -2rem !important; margin-bottom: -2rem !important; } .gt-md\:-mx-8 { margin-left: -2rem !important; margin-right: -2rem !important; } .gt-md\:-my-10 { margin-top: -2.5rem !important; margin-bottom: -2.5rem !important; } .gt-md\:-mx-10 { margin-left: -2.5rem !important; margin-right: -2.5rem !important; } .gt-md\:-my-12 { margin-top: -3rem !important; margin-bottom: -3rem !important; } .gt-md\:-mx-12 { margin-left: -3rem !important; margin-right: -3rem !important; } .gt-md\:-my-14 { margin-top: -3.5rem !important; margin-bottom: -3.5rem !important; } .gt-md\:-mx-14 { margin-left: -3.5rem !important; margin-right: -3.5rem !important; } .gt-md\:-my-16 { margin-top: -4rem !important; margin-bottom: -4rem !important; } .gt-md\:-mx-16 { margin-left: -4rem !important; margin-right: -4rem !important; } .gt-md\:-my-18 { margin-top: -4.5rem !important; margin-bottom: -4.5rem !important; } .gt-md\:-mx-18 { margin-left: -4.5rem !important; margin-right: -4.5rem !important; } .gt-md\:-my-20 { margin-top: -5rem !important; margin-bottom: -5rem !important; } .gt-md\:-mx-20 { margin-left: -5rem !important; margin-right: -5rem !important; } .gt-md\:-my-22 { margin-top: -5.5rem !important; margin-bottom: -5.5rem !important; } .gt-md\:-mx-22 { margin-left: -5.5rem !important; margin-right: -5.5rem !important; } .gt-md\:-my-24 { margin-top: -6rem !important; margin-bottom: -6rem !important; } .gt-md\:-mx-24 { margin-left: -6rem !important; margin-right: -6rem !important; } .gt-md\:-my-26 { margin-top: -6.5rem !important; margin-bottom: -6.5rem !important; } .gt-md\:-mx-26 { margin-left: -6.5rem !important; margin-right: -6.5rem !important; } .gt-md\:-my-28 { margin-top: -7rem !important; margin-bottom: -7rem !important; } .gt-md\:-mx-28 { margin-left: -7rem !important; margin-right: -7rem !important; } .gt-md\:-my-30 { margin-top: -7.5rem !important; margin-bottom: -7.5rem !important; } .gt-md\:-mx-30 { margin-left: -7.5rem !important; margin-right: -7.5rem !important; } .gt-md\:-my-32 { margin-top: -8rem !important; margin-bottom: -8rem !important; } .gt-md\:-mx-32 { margin-left: -8rem !important; margin-right: -8rem !important; } .gt-md\:-my-36 { margin-top: -9rem !important; margin-bottom: -9rem !important; } .gt-md\:-mx-36 { margin-left: -9rem !important; margin-right: -9rem !important; } .gt-md\:-my-40 { margin-top: -10rem !important; margin-bottom: -10rem !important; } .gt-md\:-mx-40 { margin-left: -10rem !important; margin-right: -10rem !important; } .gt-md\:-my-48 { margin-top: -12rem !important; margin-bottom: -12rem !important; } .gt-md\:-mx-48 { margin-left: -12rem !important; margin-right: -12rem !important; } .gt-md\:-my-56 { margin-top: -14rem !important; margin-bottom: -14rem !important; } .gt-md\:-mx-56 { margin-left: -14rem !important; margin-right: -14rem !important; } .gt-md\:-my-64 { margin-top: -16rem !important; margin-bottom: -16rem !important; } .gt-md\:-mx-64 { margin-left: -16rem !important; margin-right: -16rem !important; } .gt-md\:-my-px { margin-top: -1px !important; margin-bottom: -1px !important; } .gt-md\:-mx-px { margin-left: -1px !important; margin-right: -1px !important; } .gt-md\:-my-2px { margin-top: -2px !important; margin-bottom: -2px !important; } .gt-md\:-mx-2px { margin-left: -2px !important; margin-right: -2px !important; } .gt-md\:mt-0 { margin-top: 0 !important; } .gt-md\:mr-0 { margin-right: 0 !important; } .gt-md\:mb-0 { margin-bottom: 0 !important; } .gt-md\:ml-0 { margin-left: 0 !important; } .gt-md\:mt-1 { margin-top: 0.25rem !important; } .gt-md\:mr-1 { margin-right: 0.25rem !important; } .gt-md\:mb-1 { margin-bottom: 0.25rem !important; } .gt-md\:ml-1 { margin-left: 0.25rem !important; } .gt-md\:mt-2 { margin-top: 0.5rem !important; } .gt-md\:mr-2 { margin-right: 0.5rem !important; } .gt-md\:mb-2 { margin-bottom: 0.5rem !important; } .gt-md\:ml-2 { margin-left: 0.5rem !important; } .gt-md\:mt-3 { margin-top: 0.75rem !important; } .gt-md\:mr-3 { margin-right: 0.75rem !important; } .gt-md\:mb-3 { margin-bottom: 0.75rem !important; } .gt-md\:ml-3 { margin-left: 0.75rem !important; } .gt-md\:mt-4 { margin-top: 1rem !important; } .gt-md\:mr-4 { margin-right: 1rem !important; } .gt-md\:mb-4 { margin-bottom: 1rem !important; } .gt-md\:ml-4 { margin-left: 1rem !important; } .gt-md\:mt-5 { margin-top: 1.25rem !important; } .gt-md\:mr-5 { margin-right: 1.25rem !important; } .gt-md\:mb-5 { margin-bottom: 1.25rem !important; } .gt-md\:ml-5 { margin-left: 1.25rem !important; } .gt-md\:mt-6 { margin-top: 1.5rem !important; } .gt-md\:mr-6 { margin-right: 1.5rem !important; } .gt-md\:mb-6 { margin-bottom: 1.5rem !important; } .gt-md\:ml-6 { margin-left: 1.5rem !important; } .gt-md\:mt-8 { margin-top: 2rem !important; } .gt-md\:mr-8 { margin-right: 2rem !important; } .gt-md\:mb-8 { margin-bottom: 2rem !important; } .gt-md\:ml-8 { margin-left: 2rem !important; } .gt-md\:mt-10 { margin-top: 2.5rem !important; } .gt-md\:mr-10 { margin-right: 2.5rem !important; } .gt-md\:mb-10 { margin-bottom: 2.5rem !important; } .gt-md\:ml-10 { margin-left: 2.5rem !important; } .gt-md\:mt-12 { margin-top: 3rem !important; } .gt-md\:mr-12 { margin-right: 3rem !important; } .gt-md\:mb-12 { margin-bottom: 3rem !important; } .gt-md\:ml-12 { margin-left: 3rem !important; } .gt-md\:mt-14 { margin-top: 3.5rem !important; } .gt-md\:mr-14 { margin-right: 3.5rem !important; } .gt-md\:mb-14 { margin-bottom: 3.5rem !important; } .gt-md\:ml-14 { margin-left: 3.5rem !important; } .gt-md\:mt-16 { margin-top: 4rem !important; } .gt-md\:mr-16 { margin-right: 4rem !important; } .gt-md\:mb-16 { margin-bottom: 4rem !important; } .gt-md\:ml-16 { margin-left: 4rem !important; } .gt-md\:mt-18 { margin-top: 4.5rem !important; } .gt-md\:mr-18 { margin-right: 4.5rem !important; } .gt-md\:mb-18 { margin-bottom: 4.5rem !important; } .gt-md\:ml-18 { margin-left: 4.5rem !important; } .gt-md\:mt-20 { margin-top: 5rem !important; } .gt-md\:mr-20 { margin-right: 5rem !important; } .gt-md\:mb-20 { margin-bottom: 5rem !important; } .gt-md\:ml-20 { margin-left: 5rem !important; } .gt-md\:mt-22 { margin-top: 5.5rem !important; } .gt-md\:mr-22 { margin-right: 5.5rem !important; } .gt-md\:mb-22 { margin-bottom: 5.5rem !important; } .gt-md\:ml-22 { margin-left: 5.5rem !important; } .gt-md\:mt-24 { margin-top: 6rem !important; } .gt-md\:mr-24 { margin-right: 6rem !important; } .gt-md\:mb-24 { margin-bottom: 6rem !important; } .gt-md\:ml-24 { margin-left: 6rem !important; } .gt-md\:mt-26 { margin-top: 6.5rem !important; } .gt-md\:mr-26 { margin-right: 6.5rem !important; } .gt-md\:mb-26 { margin-bottom: 6.5rem !important; } .gt-md\:ml-26 { margin-left: 6.5rem !important; } .gt-md\:mt-28 { margin-top: 7rem !important; } .gt-md\:mr-28 { margin-right: 7rem !important; } .gt-md\:mb-28 { margin-bottom: 7rem !important; } .gt-md\:ml-28 { margin-left: 7rem !important; } .gt-md\:mt-30 { margin-top: 7.5rem !important; } .gt-md\:mr-30 { margin-right: 7.5rem !important; } .gt-md\:mb-30 { margin-bottom: 7.5rem !important; } .gt-md\:ml-30 { margin-left: 7.5rem !important; } .gt-md\:mt-32 { margin-top: 8rem !important; } .gt-md\:mr-32 { margin-right: 8rem !important; } .gt-md\:mb-32 { margin-bottom: 8rem !important; } .gt-md\:ml-32 { margin-left: 8rem !important; } .gt-md\:mt-36 { margin-top: 9rem !important; } .gt-md\:mr-36 { margin-right: 9rem !important; } .gt-md\:mb-36 { margin-bottom: 9rem !important; } .gt-md\:ml-36 { margin-left: 9rem !important; } .gt-md\:mt-40 { margin-top: 10rem !important; } .gt-md\:mr-40 { margin-right: 10rem !important; } .gt-md\:mb-40 { margin-bottom: 10rem !important; } .gt-md\:ml-40 { margin-left: 10rem !important; } .gt-md\:mt-48 { margin-top: 12rem !important; } .gt-md\:mr-48 { margin-right: 12rem !important; } .gt-md\:mb-48 { margin-bottom: 12rem !important; } .gt-md\:ml-48 { margin-left: 12rem !important; } .gt-md\:mt-56 { margin-top: 14rem !important; } .gt-md\:mr-56 { margin-right: 14rem !important; } .gt-md\:mb-56 { margin-bottom: 14rem !important; } .gt-md\:ml-56 { margin-left: 14rem !important; } .gt-md\:mt-64 { margin-top: 16rem !important; } .gt-md\:mr-64 { margin-right: 16rem !important; } .gt-md\:mb-64 { margin-bottom: 16rem !important; } .gt-md\:ml-64 { margin-left: 16rem !important; } .gt-md\:mt-auto { margin-top: auto !important; } .gt-md\:mr-auto { margin-right: auto !important; } .gt-md\:mb-auto { margin-bottom: auto !important; } .gt-md\:ml-auto { margin-left: auto !important; } .gt-md\:mt-px { margin-top: 1px !important; } .gt-md\:mr-px { margin-right: 1px !important; } .gt-md\:mb-px { margin-bottom: 1px !important; } .gt-md\:ml-px { margin-left: 1px !important; } .gt-md\:mt-2px { margin-top: 2px !important; } .gt-md\:mr-2px { margin-right: 2px !important; } .gt-md\:mb-2px { margin-bottom: 2px !important; } .gt-md\:ml-2px { margin-left: 2px !important; } .gt-md\:-mt-1 { margin-top: -0.25rem !important; } .gt-md\:-mr-1 { margin-right: -0.25rem !important; } .gt-md\:-mb-1 { margin-bottom: -0.25rem !important; } .gt-md\:-ml-1 { margin-left: -0.25rem !important; } .gt-md\:-mt-2 { margin-top: -0.5rem !important; } .gt-md\:-mr-2 { margin-right: -0.5rem !important; } .gt-md\:-mb-2 { margin-bottom: -0.5rem !important; } .gt-md\:-ml-2 { margin-left: -0.5rem !important; } .gt-md\:-mt-3 { margin-top: -0.75rem !important; } .gt-md\:-mr-3 { margin-right: -0.75rem !important; } .gt-md\:-mb-3 { margin-bottom: -0.75rem !important; } .gt-md\:-ml-3 { margin-left: -0.75rem !important; } .gt-md\:-mt-4 { margin-top: -1rem !important; } .gt-md\:-mr-4 { margin-right: -1rem !important; } .gt-md\:-mb-4 { margin-bottom: -1rem !important; } .gt-md\:-ml-4 { margin-left: -1rem !important; } .gt-md\:-mt-5 { margin-top: -1.25rem !important; } .gt-md\:-mr-5 { margin-right: -1.25rem !important; } .gt-md\:-mb-5 { margin-bottom: -1.25rem !important; } .gt-md\:-ml-5 { margin-left: -1.25rem !important; } .gt-md\:-mt-6 { margin-top: -1.5rem !important; } .gt-md\:-mr-6 { margin-right: -1.5rem !important; } .gt-md\:-mb-6 { margin-bottom: -1.5rem !important; } .gt-md\:-ml-6 { margin-left: -1.5rem !important; } .gt-md\:-mt-8 { margin-top: -2rem !important; } .gt-md\:-mr-8 { margin-right: -2rem !important; } .gt-md\:-mb-8 { margin-bottom: -2rem !important; } .gt-md\:-ml-8 { margin-left: -2rem !important; } .gt-md\:-mt-10 { margin-top: -2.5rem !important; } .gt-md\:-mr-10 { margin-right: -2.5rem !important; } .gt-md\:-mb-10 { margin-bottom: -2.5rem !important; } .gt-md\:-ml-10 { margin-left: -2.5rem !important; } .gt-md\:-mt-12 { margin-top: -3rem !important; } .gt-md\:-mr-12 { margin-right: -3rem !important; } .gt-md\:-mb-12 { margin-bottom: -3rem !important; } .gt-md\:-ml-12 { margin-left: -3rem !important; } .gt-md\:-mt-14 { margin-top: -3.5rem !important; } .gt-md\:-mr-14 { margin-right: -3.5rem !important; } .gt-md\:-mb-14 { margin-bottom: -3.5rem !important; } .gt-md\:-ml-14 { margin-left: -3.5rem !important; } .gt-md\:-mt-16 { margin-top: -4rem !important; } .gt-md\:-mr-16 { margin-right: -4rem !important; } .gt-md\:-mb-16 { margin-bottom: -4rem !important; } .gt-md\:-ml-16 { margin-left: -4rem !important; } .gt-md\:-mt-18 { margin-top: -4.5rem !important; } .gt-md\:-mr-18 { margin-right: -4.5rem !important; } .gt-md\:-mb-18 { margin-bottom: -4.5rem !important; } .gt-md\:-ml-18 { margin-left: -4.5rem !important; } .gt-md\:-mt-20 { margin-top: -5rem !important; } .gt-md\:-mr-20 { margin-right: -5rem !important; } .gt-md\:-mb-20 { margin-bottom: -5rem !important; } .gt-md\:-ml-20 { margin-left: -5rem !important; } .gt-md\:-mt-22 { margin-top: -5.5rem !important; } .gt-md\:-mr-22 { margin-right: -5.5rem !important; } .gt-md\:-mb-22 { margin-bottom: -5.5rem !important; } .gt-md\:-ml-22 { margin-left: -5.5rem !important; } .gt-md\:-mt-24 { margin-top: -6rem !important; } .gt-md\:-mr-24 { margin-right: -6rem !important; } .gt-md\:-mb-24 { margin-bottom: -6rem !important; } .gt-md\:-ml-24 { margin-left: -6rem !important; } .gt-md\:-mt-26 { margin-top: -6.5rem !important; } .gt-md\:-mr-26 { margin-right: -6.5rem !important; } .gt-md\:-mb-26 { margin-bottom: -6.5rem !important; } .gt-md\:-ml-26 { margin-left: -6.5rem !important; } .gt-md\:-mt-28 { margin-top: -7rem !important; } .gt-md\:-mr-28 { margin-right: -7rem !important; } .gt-md\:-mb-28 { margin-bottom: -7rem !important; } .gt-md\:-ml-28 { margin-left: -7rem !important; } .gt-md\:-mt-30 { margin-top: -7.5rem !important; } .gt-md\:-mr-30 { margin-right: -7.5rem !important; } .gt-md\:-mb-30 { margin-bottom: -7.5rem !important; } .gt-md\:-ml-30 { margin-left: -7.5rem !important; } .gt-md\:-mt-32 { margin-top: -8rem !important; } .gt-md\:-mr-32 { margin-right: -8rem !important; } .gt-md\:-mb-32 { margin-bottom: -8rem !important; } .gt-md\:-ml-32 { margin-left: -8rem !important; } .gt-md\:-mt-36 { margin-top: -9rem !important; } .gt-md\:-mr-36 { margin-right: -9rem !important; } .gt-md\:-mb-36 { margin-bottom: -9rem !important; } .gt-md\:-ml-36 { margin-left: -9rem !important; } .gt-md\:-mt-40 { margin-top: -10rem !important; } .gt-md\:-mr-40 { margin-right: -10rem !important; } .gt-md\:-mb-40 { margin-bottom: -10rem !important; } .gt-md\:-ml-40 { margin-left: -10rem !important; } .gt-md\:-mt-48 { margin-top: -12rem !important; } .gt-md\:-mr-48 { margin-right: -12rem !important; } .gt-md\:-mb-48 { margin-bottom: -12rem !important; } .gt-md\:-ml-48 { margin-left: -12rem !important; } .gt-md\:-mt-56 { margin-top: -14rem !important; } .gt-md\:-mr-56 { margin-right: -14rem !important; } .gt-md\:-mb-56 { margin-bottom: -14rem !important; } .gt-md\:-ml-56 { margin-left: -14rem !important; } .gt-md\:-mt-64 { margin-top: -16rem !important; } .gt-md\:-mr-64 { margin-right: -16rem !important; } .gt-md\:-mb-64 { margin-bottom: -16rem !important; } .gt-md\:-ml-64 { margin-left: -16rem !important; } .gt-md\:-mt-px { margin-top: -1px !important; } .gt-md\:-mr-px { margin-right: -1px !important; } .gt-md\:-mb-px { margin-bottom: -1px !important; } .gt-md\:-ml-px { margin-left: -1px !important; } .gt-md\:-mt-2px { margin-top: -2px !important; } .gt-md\:-mr-2px { margin-right: -2px !important; } .gt-md\:-mb-2px { margin-bottom: -2px !important; } .gt-md\:-ml-2px { margin-left: -2px !important; } .gt-md\:max-h-0 { max-height: 0 !important; } .gt-md\:max-h-1 { max-height: 0.25rem !important; } .gt-md\:max-h-2 { max-height: 0.5rem !important; } .gt-md\:max-h-3 { max-height: 0.75rem !important; } .gt-md\:max-h-4 { max-height: 1rem !important; } .gt-md\:max-h-5 { max-height: 1.25rem !important; } .gt-md\:max-h-6 { max-height: 1.5rem !important; } .gt-md\:max-h-8 { max-height: 2rem !important; } .gt-md\:max-h-10 { max-height: 2.5rem !important; } .gt-md\:max-h-12 { max-height: 3rem !important; } .gt-md\:max-h-14 { max-height: 3.5rem !important; } .gt-md\:max-h-16 { max-height: 4rem !important; } .gt-md\:max-h-18 { max-height: 4.5rem !important; } .gt-md\:max-h-20 { max-height: 5rem !important; } .gt-md\:max-h-22 { max-height: 5.5rem !important; } .gt-md\:max-h-24 { max-height: 6rem !important; } .gt-md\:max-h-26 { max-height: 6.5rem !important; } .gt-md\:max-h-28 { max-height: 7rem !important; } .gt-md\:max-h-30 { max-height: 7.5rem !important; } .gt-md\:max-h-32 { max-height: 8rem !important; } .gt-md\:max-h-36 { max-height: 9rem !important; } .gt-md\:max-h-40 { max-height: 10rem !important; } .gt-md\:max-h-48 { max-height: 12rem !important; } .gt-md\:max-h-50 { max-height: 12.5rem !important; } .gt-md\:max-h-56 { max-height: 14rem !important; } .gt-md\:max-h-60 { max-height: 15rem !important; } .gt-md\:max-h-64 { max-height: 16rem !important; } .gt-md\:max-h-80 { max-height: 20rem !important; } .gt-md\:max-h-90 { max-height: 24rem !important; } .gt-md\:max-h-100 { max-height: 25rem !important; } .gt-md\:max-h-120 { max-height: 30rem !important; } .gt-md\:max-h-128 { max-height: 32rem !important; } .gt-md\:max-h-140 { max-height: 35rem !important; } .gt-md\:max-h-160 { max-height: 40rem !important; } .gt-md\:max-h-180 { max-height: 45rem !important; } .gt-md\:max-h-192 { max-height: 48rem !important; } .gt-md\:max-h-200 { max-height: 50rem !important; } .gt-md\:max-h-240 { max-height: 60rem !important; } .gt-md\:max-h-256 { max-height: 64rem !important; } .gt-md\:max-h-280 { max-height: 70rem !important; } .gt-md\:max-h-320 { max-height: 80rem !important; } .gt-md\:max-h-360 { max-height: 90rem !important; } .gt-md\:max-h-400 { max-height: 100rem !important; } .gt-md\:max-h-480 { max-height: 120rem !important; } .gt-md\:max-h-full { max-height: 100% !important; } .gt-md\:max-h-screen { max-height: 100vh !important; } .gt-md\:max-h-none { max-height: none !important; } .gt-md\:max-h-px { max-height: 1px !important; } .gt-md\:max-h-2px { max-height: 2px !important; } .gt-md\:max-h-1\/2 { max-height: 50% !important; } .gt-md\:max-h-1\/3 { max-height: 33.33333% !important; } .gt-md\:max-h-2\/3 { max-height: 66.66667% !important; } .gt-md\:max-h-1\/4 { max-height: 25% !important; } .gt-md\:max-h-2\/4 { max-height: 50% !important; } .gt-md\:max-h-3\/4 { max-height: 75% !important; } .gt-md\:max-h-1\/5 { max-height: 20% !important; } .gt-md\:max-h-2\/5 { max-height: 40% !important; } .gt-md\:max-h-3\/5 { max-height: 60% !important; } .gt-md\:max-h-4\/5 { max-height: 80% !important; } .gt-md\:max-h-1\/12 { max-height: 8.33333% !important; } .gt-md\:max-h-2\/12 { max-height: 16.66667% !important; } .gt-md\:max-h-3\/12 { max-height: 25% !important; } .gt-md\:max-h-4\/12 { max-height: 33.33333% !important; } .gt-md\:max-h-5\/12 { max-height: 41.66667% !important; } .gt-md\:max-h-6\/12 { max-height: 50% !important; } .gt-md\:max-h-7\/12 { max-height: 58.33333% !important; } .gt-md\:max-h-8\/12 { max-height: 66.66667% !important; } .gt-md\:max-h-9\/12 { max-height: 75% !important; } .gt-md\:max-h-10\/12 { max-height: 83.33333% !important; } .gt-md\:max-h-11\/12 { max-height: 91.66667% !important; } .gt-md\:max-w-0 { max-width: 0 !important; } .gt-md\:max-w-1 { max-width: 0.25rem !important; } .gt-md\:max-w-2 { max-width: 0.5rem !important; } .gt-md\:max-w-3 { max-width: 0.75rem !important; } .gt-md\:max-w-4 { max-width: 1rem !important; } .gt-md\:max-w-5 { max-width: 1.25rem !important; } .gt-md\:max-w-6 { max-width: 1.5rem !important; } .gt-md\:max-w-8 { max-width: 2rem !important; } .gt-md\:max-w-10 { max-width: 2.5rem !important; } .gt-md\:max-w-12 { max-width: 3rem !important; } .gt-md\:max-w-14 { max-width: 3.5rem !important; } .gt-md\:max-w-16 { max-width: 4rem !important; } .gt-md\:max-w-18 { max-width: 4.5rem !important; } .gt-md\:max-w-20 { max-width: 5rem !important; } .gt-md\:max-w-22 { max-width: 5.5rem !important; } .gt-md\:max-w-24 { max-width: 6rem !important; } .gt-md\:max-w-26 { max-width: 6.5rem !important; } .gt-md\:max-w-28 { max-width: 7rem !important; } .gt-md\:max-w-30 { max-width: 7.5rem !important; } .gt-md\:max-w-32 { max-width: 8rem !important; } .gt-md\:max-w-36 { max-width: 9rem !important; } .gt-md\:max-w-40 { max-width: 10rem !important; } .gt-md\:max-w-48 { max-width: 12rem !important; } .gt-md\:max-w-50 { max-width: 12.5rem !important; } .gt-md\:max-w-56 { max-width: 14rem !important; } .gt-md\:max-w-60 { max-width: 15rem !important; } .gt-md\:max-w-64 { max-width: 16rem !important; } .gt-md\:max-w-80 { max-width: 20rem !important; } .gt-md\:max-w-90 { max-width: 24rem !important; } .gt-md\:max-w-100 { max-width: 25rem !important; } .gt-md\:max-w-120 { max-width: 30rem !important; } .gt-md\:max-w-128 { max-width: 32rem !important; } .gt-md\:max-w-140 { max-width: 35rem !important; } .gt-md\:max-w-160 { max-width: 40rem !important; } .gt-md\:max-w-180 { max-width: 45rem !important; } .gt-md\:max-w-192 { max-width: 48rem !important; } .gt-md\:max-w-200 { max-width: 50rem !important; } .gt-md\:max-w-240 { max-width: 60rem !important; } .gt-md\:max-w-256 { max-width: 64rem !important; } .gt-md\:max-w-280 { max-width: 70rem !important; } .gt-md\:max-w-320 { max-width: 80rem !important; } .gt-md\:max-w-360 { max-width: 90rem !important; } .gt-md\:max-w-400 { max-width: 100rem !important; } .gt-md\:max-w-480 { max-width: 120rem !important; } .gt-md\:max-w-none { max-width: none !important; } .gt-md\:max-w-xs { max-width: 20rem !important; } .gt-md\:max-w-sm { max-width: 24rem !important; } .gt-md\:max-w-md { max-width: 28rem !important; } .gt-md\:max-w-lg { max-width: 32rem !important; } .gt-md\:max-w-xl { max-width: 36rem !important; } .gt-md\:max-w-2xl { max-width: 42rem !important; } .gt-md\:max-w-3xl { max-width: 48rem !important; } .gt-md\:max-w-4xl { max-width: 56rem !important; } .gt-md\:max-w-5xl { max-width: 64rem !important; } .gt-md\:max-w-6xl { max-width: 72rem !important; } .gt-md\:max-w-full { max-width: 100% !important; } .gt-md\:max-w-screen { max-width: 100vw !important; } .gt-md\:max-w-px { max-width: 1px !important; } .gt-md\:max-w-2px { max-width: 2px !important; } .gt-md\:max-w-1\/2 { max-width: 50% !important; } .gt-md\:max-w-1\/3 { max-width: 33.33333% !important; } .gt-md\:max-w-2\/3 { max-width: 66.66667% !important; } .gt-md\:max-w-1\/4 { max-width: 25% !important; } .gt-md\:max-w-2\/4 { max-width: 50% !important; } .gt-md\:max-w-3\/4 { max-width: 75% !important; } .gt-md\:max-w-1\/5 { max-width: 20% !important; } .gt-md\:max-w-2\/5 { max-width: 40% !important; } .gt-md\:max-w-3\/5 { max-width: 60% !important; } .gt-md\:max-w-4\/5 { max-width: 80% !important; } .gt-md\:max-w-1\/12 { max-width: 8.33333% !important; } .gt-md\:max-w-2\/12 { max-width: 16.66667% !important; } .gt-md\:max-w-3\/12 { max-width: 25% !important; } .gt-md\:max-w-4\/12 { max-width: 33.33333% !important; } .gt-md\:max-w-5\/12 { max-width: 41.66667% !important; } .gt-md\:max-w-6\/12 { max-width: 50% !important; } .gt-md\:max-w-7\/12 { max-width: 58.33333% !important; } .gt-md\:max-w-8\/12 { max-width: 66.66667% !important; } .gt-md\:max-w-9\/12 { max-width: 75% !important; } .gt-md\:max-w-10\/12 { max-width: 83.33333% !important; } .gt-md\:max-w-11\/12 { max-width: 91.66667% !important; } .gt-md\:min-h-0 { min-height: 0 !important; } .gt-md\:min-h-1 { min-height: 0.25rem !important; } .gt-md\:min-h-2 { min-height: 0.5rem !important; } .gt-md\:min-h-3 { min-height: 0.75rem !important; } .gt-md\:min-h-4 { min-height: 1rem !important; } .gt-md\:min-h-5 { min-height: 1.25rem !important; } .gt-md\:min-h-6 { min-height: 1.5rem !important; } .gt-md\:min-h-8 { min-height: 2rem !important; } .gt-md\:min-h-10 { min-height: 2.5rem !important; } .gt-md\:min-h-12 { min-height: 3rem !important; } .gt-md\:min-h-14 { min-height: 3.5rem !important; } .gt-md\:min-h-16 { min-height: 4rem !important; } .gt-md\:min-h-18 { min-height: 4.5rem !important; } .gt-md\:min-h-20 { min-height: 5rem !important; } .gt-md\:min-h-22 { min-height: 5.5rem !important; } .gt-md\:min-h-24 { min-height: 6rem !important; } .gt-md\:min-h-26 { min-height: 6.5rem !important; } .gt-md\:min-h-28 { min-height: 7rem !important; } .gt-md\:min-h-30 { min-height: 7.5rem !important; } .gt-md\:min-h-32 { min-height: 8rem !important; } .gt-md\:min-h-36 { min-height: 9rem !important; } .gt-md\:min-h-40 { min-height: 10rem !important; } .gt-md\:min-h-48 { min-height: 12rem !important; } .gt-md\:min-h-50 { min-height: 12.5rem !important; } .gt-md\:min-h-56 { min-height: 14rem !important; } .gt-md\:min-h-60 { min-height: 15rem !important; } .gt-md\:min-h-64 { min-height: 16rem !important; } .gt-md\:min-h-80 { min-height: 20rem !important; } .gt-md\:min-h-90 { min-height: 24rem !important; } .gt-md\:min-h-100 { min-height: 25rem !important; } .gt-md\:min-h-120 { min-height: 30rem !important; } .gt-md\:min-h-128 { min-height: 32rem !important; } .gt-md\:min-h-140 { min-height: 35rem !important; } .gt-md\:min-h-160 { min-height: 40rem !important; } .gt-md\:min-h-180 { min-height: 45rem !important; } .gt-md\:min-h-192 { min-height: 48rem !important; } .gt-md\:min-h-200 { min-height: 50rem !important; } .gt-md\:min-h-240 { min-height: 60rem !important; } .gt-md\:min-h-256 { min-height: 64rem !important; } .gt-md\:min-h-280 { min-height: 70rem !important; } .gt-md\:min-h-320 { min-height: 80rem !important; } .gt-md\:min-h-360 { min-height: 90rem !important; } .gt-md\:min-h-400 { min-height: 100rem !important; } .gt-md\:min-h-480 { min-height: 120rem !important; } .gt-md\:min-h-full { min-height: 100% !important; } .gt-md\:min-h-screen { min-height: 100vh !important; } .gt-md\:min-h-px { min-height: 1px !important; } .gt-md\:min-h-2px { min-height: 2px !important; } .gt-md\:min-h-1\/2 { min-height: 50% !important; } .gt-md\:min-h-1\/3 { min-height: 33.33333% !important; } .gt-md\:min-h-2\/3 { min-height: 66.66667% !important; } .gt-md\:min-h-1\/4 { min-height: 25% !important; } .gt-md\:min-h-2\/4 { min-height: 50% !important; } .gt-md\:min-h-3\/4 { min-height: 75% !important; } .gt-md\:min-h-1\/5 { min-height: 20% !important; } .gt-md\:min-h-2\/5 { min-height: 40% !important; } .gt-md\:min-h-3\/5 { min-height: 60% !important; } .gt-md\:min-h-4\/5 { min-height: 80% !important; } .gt-md\:min-h-1\/12 { min-height: 8.33333% !important; } .gt-md\:min-h-2\/12 { min-height: 16.66667% !important; } .gt-md\:min-h-3\/12 { min-height: 25% !important; } .gt-md\:min-h-4\/12 { min-height: 33.33333% !important; } .gt-md\:min-h-5\/12 { min-height: 41.66667% !important; } .gt-md\:min-h-6\/12 { min-height: 50% !important; } .gt-md\:min-h-7\/12 { min-height: 58.33333% !important; } .gt-md\:min-h-8\/12 { min-height: 66.66667% !important; } .gt-md\:min-h-9\/12 { min-height: 75% !important; } .gt-md\:min-h-10\/12 { min-height: 83.33333% !important; } .gt-md\:min-h-11\/12 { min-height: 91.66667% !important; } .gt-md\:min-w-0 { min-width: 0 !important; } .gt-md\:min-w-1 { min-width: 0.25rem !important; } .gt-md\:min-w-2 { min-width: 0.5rem !important; } .gt-md\:min-w-3 { min-width: 0.75rem !important; } .gt-md\:min-w-4 { min-width: 1rem !important; } .gt-md\:min-w-5 { min-width: 1.25rem !important; } .gt-md\:min-w-6 { min-width: 1.5rem !important; } .gt-md\:min-w-8 { min-width: 2rem !important; } .gt-md\:min-w-10 { min-width: 2.5rem !important; } .gt-md\:min-w-12 { min-width: 3rem !important; } .gt-md\:min-w-14 { min-width: 3.5rem !important; } .gt-md\:min-w-16 { min-width: 4rem !important; } .gt-md\:min-w-18 { min-width: 4.5rem !important; } .gt-md\:min-w-20 { min-width: 5rem !important; } .gt-md\:min-w-22 { min-width: 5.5rem !important; } .gt-md\:min-w-24 { min-width: 6rem !important; } .gt-md\:min-w-26 { min-width: 6.5rem !important; } .gt-md\:min-w-28 { min-width: 7rem !important; } .gt-md\:min-w-30 { min-width: 7.5rem !important; } .gt-md\:min-w-32 { min-width: 8rem !important; } .gt-md\:min-w-36 { min-width: 9rem !important; } .gt-md\:min-w-40 { min-width: 10rem !important; } .gt-md\:min-w-48 { min-width: 12rem !important; } .gt-md\:min-w-50 { min-width: 12.5rem !important; } .gt-md\:min-w-56 { min-width: 14rem !important; } .gt-md\:min-w-60 { min-width: 15rem !important; } .gt-md\:min-w-64 { min-width: 16rem !important; } .gt-md\:min-w-80 { min-width: 20rem !important; } .gt-md\:min-w-90 { min-width: 24rem !important; } .gt-md\:min-w-100 { min-width: 25rem !important; } .gt-md\:min-w-120 { min-width: 30rem !important; } .gt-md\:min-w-128 { min-width: 32rem !important; } .gt-md\:min-w-140 { min-width: 35rem !important; } .gt-md\:min-w-160 { min-width: 40rem !important; } .gt-md\:min-w-180 { min-width: 45rem !important; } .gt-md\:min-w-192 { min-width: 48rem !important; } .gt-md\:min-w-200 { min-width: 50rem !important; } .gt-md\:min-w-240 { min-width: 60rem !important; } .gt-md\:min-w-256 { min-width: 64rem !important; } .gt-md\:min-w-280 { min-width: 70rem !important; } .gt-md\:min-w-320 { min-width: 80rem !important; } .gt-md\:min-w-360 { min-width: 90rem !important; } .gt-md\:min-w-400 { min-width: 100rem !important; } .gt-md\:min-w-480 { min-width: 120rem !important; } .gt-md\:min-w-full { min-width: 100% !important; } .gt-md\:min-w-screen { min-width: 100vw !important; } .gt-md\:min-w-px { min-width: 1px !important; } .gt-md\:min-w-2px { min-width: 2px !important; } .gt-md\:min-w-1\/2 { min-width: 50% !important; } .gt-md\:min-w-1\/3 { min-width: 33.33333% !important; } .gt-md\:min-w-2\/3 { min-width: 66.66667% !important; } .gt-md\:min-w-1\/4 { min-width: 25% !important; } .gt-md\:min-w-2\/4 { min-width: 50% !important; } .gt-md\:min-w-3\/4 { min-width: 75% !important; } .gt-md\:min-w-1\/5 { min-width: 20% !important; } .gt-md\:min-w-2\/5 { min-width: 40% !important; } .gt-md\:min-w-3\/5 { min-width: 60% !important; } .gt-md\:min-w-4\/5 { min-width: 80% !important; } .gt-md\:min-w-1\/12 { min-width: 8.33333% !important; } .gt-md\:min-w-2\/12 { min-width: 16.66667% !important; } .gt-md\:min-w-3\/12 { min-width: 25% !important; } .gt-md\:min-w-4\/12 { min-width: 33.33333% !important; } .gt-md\:min-w-5\/12 { min-width: 41.66667% !important; } .gt-md\:min-w-6\/12 { min-width: 50% !important; } .gt-md\:min-w-7\/12 { min-width: 58.33333% !important; } .gt-md\:min-w-8\/12 { min-width: 66.66667% !important; } .gt-md\:min-w-9\/12 { min-width: 75% !important; } .gt-md\:min-w-10\/12 { min-width: 83.33333% !important; } .gt-md\:min-w-11\/12 { min-width: 91.66667% !important; } .gt-md\:object-contain { -o-object-fit: contain !important; object-fit: contain !important; } .gt-md\:object-cover { -o-object-fit: cover !important; object-fit: cover !important; } .gt-md\:object-fill { -o-object-fit: fill !important; object-fit: fill !important; } .gt-md\:object-none { -o-object-fit: none !important; object-fit: none !important; } .gt-md\:object-scale-down { -o-object-fit: scale-down !important; object-fit: scale-down !important; } .gt-md\:object-bottom { -o-object-position: bottom !important; object-position: bottom !important; } .gt-md\:object-center { -o-object-position: center !important; object-position: center !important; } .gt-md\:object-left { -o-object-position: left !important; object-position: left !important; } .gt-md\:object-left-bottom { -o-object-position: left bottom !important; object-position: left bottom !important; } .gt-md\:object-left-top { -o-object-position: left top !important; object-position: left top !important; } .gt-md\:object-right { -o-object-position: right !important; object-position: right !important; } .gt-md\:object-right-bottom { -o-object-position: right bottom !important; object-position: right bottom !important; } .gt-md\:object-right-top { -o-object-position: right top !important; object-position: right top !important; } .gt-md\:object-top { -o-object-position: top !important; object-position: top !important; } .gt-md\:opacity-0 { opacity: 0 !important; } .gt-md\:opacity-12 { opacity: 0.12 !important; } .gt-md\:opacity-25 { opacity: 0.25 !important; } .gt-md\:opacity-38 { opacity: 0.38 !important; } .gt-md\:opacity-50 { opacity: 0.5 !important; } .gt-md\:opacity-54 { opacity: 0.54 !important; } .gt-md\:opacity-70 { opacity: 0.70 !important; } .gt-md\:opacity-75 { opacity: 0.75 !important; } .gt-md\:opacity-84 { opacity: 0.84 !important; } .gt-md\:opacity-100 { opacity: 1 !important; } .gt-md\:hover\:opacity-0:hover { opacity: 0 !important; } .gt-md\:hover\:opacity-12:hover { opacity: 0.12 !important; } .gt-md\:hover\:opacity-25:hover { opacity: 0.25 !important; } .gt-md\:hover\:opacity-38:hover { opacity: 0.38 !important; } .gt-md\:hover\:opacity-50:hover { opacity: 0.5 !important; } .gt-md\:hover\:opacity-54:hover { opacity: 0.54 !important; } .gt-md\:hover\:opacity-70:hover { opacity: 0.70 !important; } .gt-md\:hover\:opacity-75:hover { opacity: 0.75 !important; } .gt-md\:hover\:opacity-84:hover { opacity: 0.84 !important; } .gt-md\:hover\:opacity-100:hover { opacity: 1 !important; } .gt-md\:focus\:opacity-0:focus { opacity: 0 !important; } .gt-md\:focus\:opacity-12:focus { opacity: 0.12 !important; } .gt-md\:focus\:opacity-25:focus { opacity: 0.25 !important; } .gt-md\:focus\:opacity-38:focus { opacity: 0.38 !important; } .gt-md\:focus\:opacity-50:focus { opacity: 0.5 !important; } .gt-md\:focus\:opacity-54:focus { opacity: 0.54 !important; } .gt-md\:focus\:opacity-70:focus { opacity: 0.70 !important; } .gt-md\:focus\:opacity-75:focus { opacity: 0.75 !important; } .gt-md\:focus\:opacity-84:focus { opacity: 0.84 !important; } .gt-md\:focus\:opacity-100:focus { opacity: 1 !important; } .gt-md\:outline-none { outline: 0 !important; } .gt-md\:focus\:outline-none:focus { outline: 0 !important; } .gt-md\:overflow-auto { overflow: auto !important; } .gt-md\:overflow-hidden { overflow: hidden !important; } .gt-md\:overflow-visible { overflow: visible !important; } .gt-md\:overflow-scroll { overflow: scroll !important; } .gt-md\:overflow-x-auto { overflow-x: auto !important; } .gt-md\:overflow-y-auto { overflow-y: auto !important; } .gt-md\:overflow-x-hidden { overflow-x: hidden !important; } .gt-md\:overflow-y-hidden { overflow-y: hidden !important; } .gt-md\:overflow-x-visible { overflow-x: visible !important; } .gt-md\:overflow-y-visible { overflow-y: visible !important; } .gt-md\:overflow-x-scroll { overflow-x: scroll !important; } .gt-md\:overflow-y-scroll { overflow-y: scroll !important; } .gt-md\:scrolling-touch { -webkit-overflow-scrolling: touch !important; } .gt-md\:scrolling-auto { -webkit-overflow-scrolling: auto !important; } .gt-md\:p-0 { padding: 0 !important; } .gt-md\:p-1 { padding: 0.25rem !important; } .gt-md\:p-2 { padding: 0.5rem !important; } .gt-md\:p-3 { padding: 0.75rem !important; } .gt-md\:p-4 { padding: 1rem !important; } .gt-md\:p-5 { padding: 1.25rem !important; } .gt-md\:p-6 { padding: 1.5rem !important; } .gt-md\:p-8 { padding: 2rem !important; } .gt-md\:p-10 { padding: 2.5rem !important; } .gt-md\:p-12 { padding: 3rem !important; } .gt-md\:p-14 { padding: 3.5rem !important; } .gt-md\:p-16 { padding: 4rem !important; } .gt-md\:p-18 { padding: 4.5rem !important; } .gt-md\:p-20 { padding: 5rem !important; } .gt-md\:p-22 { padding: 5.5rem !important; } .gt-md\:p-24 { padding: 6rem !important; } .gt-md\:p-26 { padding: 6.5rem !important; } .gt-md\:p-28 { padding: 7rem !important; } .gt-md\:p-30 { padding: 7.5rem !important; } .gt-md\:p-32 { padding: 8rem !important; } .gt-md\:p-36 { padding: 9rem !important; } .gt-md\:p-40 { padding: 10rem !important; } .gt-md\:p-48 { padding: 12rem !important; } .gt-md\:p-56 { padding: 14rem !important; } .gt-md\:p-64 { padding: 16rem !important; } .gt-md\:p-px { padding: 1px !important; } .gt-md\:p-2px { padding: 2px !important; } .gt-md\:py-0 { padding-top: 0 !important; padding-bottom: 0 !important; } .gt-md\:px-0 { padding-left: 0 !important; padding-right: 0 !important; } .gt-md\:py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .gt-md\:px-1 { padding-left: 0.25rem !important; padding-right: 0.25rem !important; } .gt-md\:py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .gt-md\:px-2 { padding-left: 0.5rem !important; padding-right: 0.5rem !important; } .gt-md\:py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .gt-md\:px-3 { padding-left: 0.75rem !important; padding-right: 0.75rem !important; } .gt-md\:py-4 { padding-top: 1rem !important; padding-bottom: 1rem !important; } .gt-md\:px-4 { padding-left: 1rem !important; padding-right: 1rem !important; } .gt-md\:py-5 { padding-top: 1.25rem !important; padding-bottom: 1.25rem !important; } .gt-md\:px-5 { padding-left: 1.25rem !important; padding-right: 1.25rem !important; } .gt-md\:py-6 { padding-top: 1.5rem !important; padding-bottom: 1.5rem !important; } .gt-md\:px-6 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } .gt-md\:py-8 { padding-top: 2rem !important; padding-bottom: 2rem !important; } .gt-md\:px-8 { padding-left: 2rem !important; padding-right: 2rem !important; } .gt-md\:py-10 { padding-top: 2.5rem !important; padding-bottom: 2.5rem !important; } .gt-md\:px-10 { padding-left: 2.5rem !important; padding-right: 2.5rem !important; } .gt-md\:py-12 { padding-top: 3rem !important; padding-bottom: 3rem !important; } .gt-md\:px-12 { padding-left: 3rem !important; padding-right: 3rem !important; } .gt-md\:py-14 { padding-top: 3.5rem !important; padding-bottom: 3.5rem !important; } .gt-md\:px-14 { padding-left: 3.5rem !important; padding-right: 3.5rem !important; } .gt-md\:py-16 { padding-top: 4rem !important; padding-bottom: 4rem !important; } .gt-md\:px-16 { padding-left: 4rem !important; padding-right: 4rem !important; } .gt-md\:py-18 { padding-top: 4.5rem !important; padding-bottom: 4.5rem !important; } .gt-md\:px-18 { padding-left: 4.5rem !important; padding-right: 4.5rem !important; } .gt-md\:py-20 { padding-top: 5rem !important; padding-bottom: 5rem !important; } .gt-md\:px-20 { padding-left: 5rem !important; padding-right: 5rem !important; } .gt-md\:py-22 { padding-top: 5.5rem !important; padding-bottom: 5.5rem !important; } .gt-md\:px-22 { padding-left: 5.5rem !important; padding-right: 5.5rem !important; } .gt-md\:py-24 { padding-top: 6rem !important; padding-bottom: 6rem !important; } .gt-md\:px-24 { padding-left: 6rem !important; padding-right: 6rem !important; } .gt-md\:py-26 { padding-top: 6.5rem !important; padding-bottom: 6.5rem !important; } .gt-md\:px-26 { padding-left: 6.5rem !important; padding-right: 6.5rem !important; } .gt-md\:py-28 { padding-top: 7rem !important; padding-bottom: 7rem !important; } .gt-md\:px-28 { padding-left: 7rem !important; padding-right: 7rem !important; } .gt-md\:py-30 { padding-top: 7.5rem !important; padding-bottom: 7.5rem !important; } .gt-md\:px-30 { padding-left: 7.5rem !important; padding-right: 7.5rem !important; } .gt-md\:py-32 { padding-top: 8rem !important; padding-bottom: 8rem !important; } .gt-md\:px-32 { padding-left: 8rem !important; padding-right: 8rem !important; } .gt-md\:py-36 { padding-top: 9rem !important; padding-bottom: 9rem !important; } .gt-md\:px-36 { padding-left: 9rem !important; padding-right: 9rem !important; } .gt-md\:py-40 { padding-top: 10rem !important; padding-bottom: 10rem !important; } .gt-md\:px-40 { padding-left: 10rem !important; padding-right: 10rem !important; } .gt-md\:py-48 { padding-top: 12rem !important; padding-bottom: 12rem !important; } .gt-md\:px-48 { padding-left: 12rem !important; padding-right: 12rem !important; } .gt-md\:py-56 { padding-top: 14rem !important; padding-bottom: 14rem !important; } .gt-md\:px-56 { padding-left: 14rem !important; padding-right: 14rem !important; } .gt-md\:py-64 { padding-top: 16rem !important; padding-bottom: 16rem !important; } .gt-md\:px-64 { padding-left: 16rem !important; padding-right: 16rem !important; } .gt-md\:py-px { padding-top: 1px !important; padding-bottom: 1px !important; } .gt-md\:px-px { padding-left: 1px !important; padding-right: 1px !important; } .gt-md\:py-2px { padding-top: 2px !important; padding-bottom: 2px !important; } .gt-md\:px-2px { padding-left: 2px !important; padding-right: 2px !important; } .gt-md\:pt-0 { padding-top: 0 !important; } .gt-md\:pr-0 { padding-right: 0 !important; } .gt-md\:pb-0 { padding-bottom: 0 !important; } .gt-md\:pl-0 { padding-left: 0 !important; } .gt-md\:pt-1 { padding-top: 0.25rem !important; } .gt-md\:pr-1 { padding-right: 0.25rem !important; } .gt-md\:pb-1 { padding-bottom: 0.25rem !important; } .gt-md\:pl-1 { padding-left: 0.25rem !important; } .gt-md\:pt-2 { padding-top: 0.5rem !important; } .gt-md\:pr-2 { padding-right: 0.5rem !important; } .gt-md\:pb-2 { padding-bottom: 0.5rem !important; } .gt-md\:pl-2 { padding-left: 0.5rem !important; } .gt-md\:pt-3 { padding-top: 0.75rem !important; } .gt-md\:pr-3 { padding-right: 0.75rem !important; } .gt-md\:pb-3 { padding-bottom: 0.75rem !important; } .gt-md\:pl-3 { padding-left: 0.75rem !important; } .gt-md\:pt-4 { padding-top: 1rem !important; } .gt-md\:pr-4 { padding-right: 1rem !important; } .gt-md\:pb-4 { padding-bottom: 1rem !important; } .gt-md\:pl-4 { padding-left: 1rem !important; } .gt-md\:pt-5 { padding-top: 1.25rem !important; } .gt-md\:pr-5 { padding-right: 1.25rem !important; } .gt-md\:pb-5 { padding-bottom: 1.25rem !important; } .gt-md\:pl-5 { padding-left: 1.25rem !important; } .gt-md\:pt-6 { padding-top: 1.5rem !important; } .gt-md\:pr-6 { padding-right: 1.5rem !important; } .gt-md\:pb-6 { padding-bottom: 1.5rem !important; } .gt-md\:pl-6 { padding-left: 1.5rem !important; } .gt-md\:pt-8 { padding-top: 2rem !important; } .gt-md\:pr-8 { padding-right: 2rem !important; } .gt-md\:pb-8 { padding-bottom: 2rem !important; } .gt-md\:pl-8 { padding-left: 2rem !important; } .gt-md\:pt-10 { padding-top: 2.5rem !important; } .gt-md\:pr-10 { padding-right: 2.5rem !important; } .gt-md\:pb-10 { padding-bottom: 2.5rem !important; } .gt-md\:pl-10 { padding-left: 2.5rem !important; } .gt-md\:pt-12 { padding-top: 3rem !important; } .gt-md\:pr-12 { padding-right: 3rem !important; } .gt-md\:pb-12 { padding-bottom: 3rem !important; } .gt-md\:pl-12 { padding-left: 3rem !important; } .gt-md\:pt-14 { padding-top: 3.5rem !important; } .gt-md\:pr-14 { padding-right: 3.5rem !important; } .gt-md\:pb-14 { padding-bottom: 3.5rem !important; } .gt-md\:pl-14 { padding-left: 3.5rem !important; } .gt-md\:pt-16 { padding-top: 4rem !important; } .gt-md\:pr-16 { padding-right: 4rem !important; } .gt-md\:pb-16 { padding-bottom: 4rem !important; } .gt-md\:pl-16 { padding-left: 4rem !important; } .gt-md\:pt-18 { padding-top: 4.5rem !important; } .gt-md\:pr-18 { padding-right: 4.5rem !important; } .gt-md\:pb-18 { padding-bottom: 4.5rem !important; } .gt-md\:pl-18 { padding-left: 4.5rem !important; } .gt-md\:pt-20 { padding-top: 5rem !important; } .gt-md\:pr-20 { padding-right: 5rem !important; } .gt-md\:pb-20 { padding-bottom: 5rem !important; } .gt-md\:pl-20 { padding-left: 5rem !important; } .gt-md\:pt-22 { padding-top: 5.5rem !important; } .gt-md\:pr-22 { padding-right: 5.5rem !important; } .gt-md\:pb-22 { padding-bottom: 5.5rem !important; } .gt-md\:pl-22 { padding-left: 5.5rem !important; } .gt-md\:pt-24 { padding-top: 6rem !important; } .gt-md\:pr-24 { padding-right: 6rem !important; } .gt-md\:pb-24 { padding-bottom: 6rem !important; } .gt-md\:pl-24 { padding-left: 6rem !important; } .gt-md\:pt-26 { padding-top: 6.5rem !important; } .gt-md\:pr-26 { padding-right: 6.5rem !important; } .gt-md\:pb-26 { padding-bottom: 6.5rem !important; } .gt-md\:pl-26 { padding-left: 6.5rem !important; } .gt-md\:pt-28 { padding-top: 7rem !important; } .gt-md\:pr-28 { padding-right: 7rem !important; } .gt-md\:pb-28 { padding-bottom: 7rem !important; } .gt-md\:pl-28 { padding-left: 7rem !important; } .gt-md\:pt-30 { padding-top: 7.5rem !important; } .gt-md\:pr-30 { padding-right: 7.5rem !important; } .gt-md\:pb-30 { padding-bottom: 7.5rem !important; } .gt-md\:pl-30 { padding-left: 7.5rem !important; } .gt-md\:pt-32 { padding-top: 8rem !important; } .gt-md\:pr-32 { padding-right: 8rem !important; } .gt-md\:pb-32 { padding-bottom: 8rem !important; } .gt-md\:pl-32 { padding-left: 8rem !important; } .gt-md\:pt-36 { padding-top: 9rem !important; } .gt-md\:pr-36 { padding-right: 9rem !important; } .gt-md\:pb-36 { padding-bottom: 9rem !important; } .gt-md\:pl-36 { padding-left: 9rem !important; } .gt-md\:pt-40 { padding-top: 10rem !important; } .gt-md\:pr-40 { padding-right: 10rem !important; } .gt-md\:pb-40 { padding-bottom: 10rem !important; } .gt-md\:pl-40 { padding-left: 10rem !important; } .gt-md\:pt-48 { padding-top: 12rem !important; } .gt-md\:pr-48 { padding-right: 12rem !important; } .gt-md\:pb-48 { padding-bottom: 12rem !important; } .gt-md\:pl-48 { padding-left: 12rem !important; } .gt-md\:pt-56 { padding-top: 14rem !important; } .gt-md\:pr-56 { padding-right: 14rem !important; } .gt-md\:pb-56 { padding-bottom: 14rem !important; } .gt-md\:pl-56 { padding-left: 14rem !important; } .gt-md\:pt-64 { padding-top: 16rem !important; } .gt-md\:pr-64 { padding-right: 16rem !important; } .gt-md\:pb-64 { padding-bottom: 16rem !important; } .gt-md\:pl-64 { padding-left: 16rem !important; } .gt-md\:pt-px { padding-top: 1px !important; } .gt-md\:pr-px { padding-right: 1px !important; } .gt-md\:pb-px { padding-bottom: 1px !important; } .gt-md\:pl-px { padding-left: 1px !important; } .gt-md\:pt-2px { padding-top: 2px !important; } .gt-md\:pr-2px { padding-right: 2px !important; } .gt-md\:pb-2px { padding-bottom: 2px !important; } .gt-md\:pl-2px { padding-left: 2px !important; } .gt-md\:placeholder-opacity-0::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .gt-md\:placeholder-opacity-0::-moz-placeholder { --placeholder-opacity: 0 !important; } .gt-md\:placeholder-opacity-0::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .gt-md\:placeholder-opacity-0::placeholder { --placeholder-opacity: 0 !important; } .gt-md\:placeholder-opacity-12::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .gt-md\:placeholder-opacity-12::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .gt-md\:placeholder-opacity-12::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .gt-md\:placeholder-opacity-12::placeholder { --placeholder-opacity: 0.12 !important; } .gt-md\:placeholder-opacity-25::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .gt-md\:placeholder-opacity-25::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .gt-md\:placeholder-opacity-25::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .gt-md\:placeholder-opacity-25::placeholder { --placeholder-opacity: 0.25 !important; } .gt-md\:placeholder-opacity-38::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .gt-md\:placeholder-opacity-38::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .gt-md\:placeholder-opacity-38::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .gt-md\:placeholder-opacity-38::placeholder { --placeholder-opacity: 0.38 !important; } .gt-md\:placeholder-opacity-50::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .gt-md\:placeholder-opacity-50::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .gt-md\:placeholder-opacity-50::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .gt-md\:placeholder-opacity-50::placeholder { --placeholder-opacity: 0.5 !important; } .gt-md\:placeholder-opacity-54::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .gt-md\:placeholder-opacity-54::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .gt-md\:placeholder-opacity-54::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .gt-md\:placeholder-opacity-54::placeholder { --placeholder-opacity: 0.54 !important; } .gt-md\:placeholder-opacity-70::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .gt-md\:placeholder-opacity-70::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .gt-md\:placeholder-opacity-70::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .gt-md\:placeholder-opacity-70::placeholder { --placeholder-opacity: 0.70 !important; } .gt-md\:placeholder-opacity-75::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .gt-md\:placeholder-opacity-75::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .gt-md\:placeholder-opacity-75::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .gt-md\:placeholder-opacity-75::placeholder { --placeholder-opacity: 0.75 !important; } .gt-md\:placeholder-opacity-84::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .gt-md\:placeholder-opacity-84::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .gt-md\:placeholder-opacity-84::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .gt-md\:placeholder-opacity-84::placeholder { --placeholder-opacity: 0.84 !important; } .gt-md\:placeholder-opacity-100::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .gt-md\:placeholder-opacity-100::-moz-placeholder { --placeholder-opacity: 1 !important; } .gt-md\:placeholder-opacity-100::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .gt-md\:placeholder-opacity-100::placeholder { --placeholder-opacity: 1 !important; } .gt-md\:focus\:placeholder-opacity-0:focus::-webkit-input-placeholder { --placeholder-opacity: 0 !important; } .gt-md\:focus\:placeholder-opacity-0:focus::-moz-placeholder { --placeholder-opacity: 0 !important; } .gt-md\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder { --placeholder-opacity: 0 !important; } .gt-md\:focus\:placeholder-opacity-0:focus::placeholder { --placeholder-opacity: 0 !important; } .gt-md\:focus\:placeholder-opacity-12:focus::-webkit-input-placeholder { --placeholder-opacity: 0.12 !important; } .gt-md\:focus\:placeholder-opacity-12:focus::-moz-placeholder { --placeholder-opacity: 0.12 !important; } .gt-md\:focus\:placeholder-opacity-12:focus::-ms-input-placeholder { --placeholder-opacity: 0.12 !important; } .gt-md\:focus\:placeholder-opacity-12:focus::placeholder { --placeholder-opacity: 0.12 !important; } .gt-md\:focus\:placeholder-opacity-25:focus::-webkit-input-placeholder { --placeholder-opacity: 0.25 !important; } .gt-md\:focus\:placeholder-opacity-25:focus::-moz-placeholder { --placeholder-opacity: 0.25 !important; } .gt-md\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder { --placeholder-opacity: 0.25 !important; } .gt-md\:focus\:placeholder-opacity-25:focus::placeholder { --placeholder-opacity: 0.25 !important; } .gt-md\:focus\:placeholder-opacity-38:focus::-webkit-input-placeholder { --placeholder-opacity: 0.38 !important; } .gt-md\:focus\:placeholder-opacity-38:focus::-moz-placeholder { --placeholder-opacity: 0.38 !important; } .gt-md\:focus\:placeholder-opacity-38:focus::-ms-input-placeholder { --placeholder-opacity: 0.38 !important; } .gt-md\:focus\:placeholder-opacity-38:focus::placeholder { --placeholder-opacity: 0.38 !important; } .gt-md\:focus\:placeholder-opacity-50:focus::-webkit-input-placeholder { --placeholder-opacity: 0.5 !important; } .gt-md\:focus\:placeholder-opacity-50:focus::-moz-placeholder { --placeholder-opacity: 0.5 !important; } .gt-md\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder { --placeholder-opacity: 0.5 !important; } .gt-md\:focus\:placeholder-opacity-50:focus::placeholder { --placeholder-opacity: 0.5 !important; } .gt-md\:focus\:placeholder-opacity-54:focus::-webkit-input-placeholder { --placeholder-opacity: 0.54 !important; } .gt-md\:focus\:placeholder-opacity-54:focus::-moz-placeholder { --placeholder-opacity: 0.54 !important; } .gt-md\:focus\:placeholder-opacity-54:focus::-ms-input-placeholder { --placeholder-opacity: 0.54 !important; } .gt-md\:focus\:placeholder-opacity-54:focus::placeholder { --placeholder-opacity: 0.54 !important; } .gt-md\:focus\:placeholder-opacity-70:focus::-webkit-input-placeholder { --placeholder-opacity: 0.70 !important; } .gt-md\:focus\:placeholder-opacity-70:focus::-moz-placeholder { --placeholder-opacity: 0.70 !important; } .gt-md\:focus\:placeholder-opacity-70:focus::-ms-input-placeholder { --placeholder-opacity: 0.70 !important; } .gt-md\:focus\:placeholder-opacity-70:focus::placeholder { --placeholder-opacity: 0.70 !important; } .gt-md\:focus\:placeholder-opacity-75:focus::-webkit-input-placeholder { --placeholder-opacity: 0.75 !important; } .gt-md\:focus\:placeholder-opacity-75:focus::-moz-placeholder { --placeholder-opacity: 0.75 !important; } .gt-md\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder { --placeholder-opacity: 0.75 !important; } .gt-md\:focus\:placeholder-opacity-75:focus::placeholder { --placeholder-opacity: 0.75 !important; } .gt-md\:focus\:placeholder-opacity-84:focus::-webkit-input-placeholder { --placeholder-opacity: 0.84 !important; } .gt-md\:focus\:placeholder-opacity-84:focus::-moz-placeholder { --placeholder-opacity: 0.84 !important; } .gt-md\:focus\:placeholder-opacity-84:focus::-ms-input-placeholder { --placeholder-opacity: 0.84 !important; } .gt-md\:focus\:placeholder-opacity-84:focus::placeholder { --placeholder-opacity: 0.84 !important; } .gt-md\:focus\:placeholder-opacity-100:focus::-webkit-input-placeholder { --placeholder-opacity: 1 !important; } .gt-md\:focus\:placeholder-opacity-100:focus::-moz-placeholder { --placeholder-opacity: 1 !important; } .gt-md\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder { --placeholder-opacity: 1 !important; } .gt-md\:focus\:placeholder-opacity-100:focus::placeholder { --placeholder-opacity: 1 !important; } .gt-md\:pointer-events-none { pointer-events: none !important; } .gt-md\:pointer-events-auto { pointer-events: auto !important; } .gt-md\:static { position: static !important; } .gt-md\:fixed { position: fixed !important; } .gt-md\:absolute { position: absolute !important; } .gt-md\:relative { position: relative !important; } .gt-md\:sticky { position: -webkit-sticky !important; position: sticky !important; } .gt-md\:inset-0 { top: 0 !important; right: 0 !important; bottom: 0 !important; left: 0 !important; } .gt-md\:inset-auto { top: auto !important; right: auto !important; bottom: auto !important; left: auto !important; } .gt-md\:inset-y-0 { top: 0 !important; bottom: 0 !important; } .gt-md\:inset-x-0 { right: 0 !important; left: 0 !important; } .gt-md\:inset-y-auto { top: auto !important; bottom: auto !important; } .gt-md\:inset-x-auto { right: auto !important; left: auto !important; } .gt-md\:top-0 { top: 0 !important; } .gt-md\:right-0 { right: 0 !important; } .gt-md\:bottom-0 { bottom: 0 !important; } .gt-md\:left-0 { left: 0 !important; } .gt-md\:top-auto { top: auto !important; } .gt-md\:right-auto { right: auto !important; } .gt-md\:bottom-auto { bottom: auto !important; } .gt-md\:left-auto { left: auto !important; } .gt-md\:shadow-xs { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .gt-md\:shadow-sm { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .gt-md\:shadow { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .gt-md\:shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .gt-md\:shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .gt-md\:shadow-xl { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .gt-md\:shadow-2xl { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .gt-md\:shadow-inner { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .gt-md\:shadow-outline { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .gt-md\:shadow-none { box-shadow: none !important; } .gt-md\:shadow-solid { box-shadow: 0 0 0 2px currentColor !important; } .gt-md\:hover\:shadow-xs:hover { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .gt-md\:hover\:shadow-sm:hover { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .gt-md\:hover\:shadow:hover { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .gt-md\:hover\:shadow-md:hover { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .gt-md\:hover\:shadow-lg:hover { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .gt-md\:hover\:shadow-xl:hover { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .gt-md\:hover\:shadow-2xl:hover { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .gt-md\:hover\:shadow-inner:hover { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .gt-md\:hover\:shadow-outline:hover { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .gt-md\:hover\:shadow-none:hover { box-shadow: none !important; } .gt-md\:hover\:shadow-solid:hover { box-shadow: 0 0 0 2px currentColor !important; } .gt-md\:focus\:shadow-xs:focus { box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.05) !important; } .gt-md\:focus\:shadow-sm:focus { box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important; } .gt-md\:focus\:shadow:focus { box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06) !important; } .gt-md\:focus\:shadow-md:focus { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; } .gt-md\:focus\:shadow-lg:focus { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05) !important; } .gt-md\:focus\:shadow-xl:focus { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04) !important; } .gt-md\:focus\:shadow-2xl:focus { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25) !important; } .gt-md\:focus\:shadow-inner:focus { box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.06) !important; } .gt-md\:focus\:shadow-outline:focus { box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.5) !important; } .gt-md\:focus\:shadow-none:focus { box-shadow: none !important; } .gt-md\:focus\:shadow-solid:focus { box-shadow: 0 0 0 2px currentColor !important; } .gt-md\:fill-current { fill: currentColor !important; } .gt-md\:stroke-current { stroke: currentColor !important; } .gt-md\:stroke-0 { stroke-width: 0 !important; } .gt-md\:stroke-1 { stroke-width: 1 !important; } .gt-md\:stroke-2 { stroke-width: 2 !important; } .gt-md\:table-auto { table-layout: auto !important; } .gt-md\:table-fixed { table-layout: fixed !important; } .gt-md\:text-left { text-align: left !important; } .gt-md\:text-center { text-align: center !important; } .gt-md\:text-right { text-align: right !important; } .gt-md\:text-justify { text-align: justify !important; } .gt-md\:text-opacity-0 { --text-opacity: 0 !important; } .gt-md\:text-opacity-12 { --text-opacity: 0.12 !important; } .gt-md\:text-opacity-25 { --text-opacity: 0.25 !important; } .gt-md\:text-opacity-38 { --text-opacity: 0.38 !important; } .gt-md\:text-opacity-50 { --text-opacity: 0.5 !important; } .gt-md\:text-opacity-54 { --text-opacity: 0.54 !important; } .gt-md\:text-opacity-70 { --text-opacity: 0.70 !important; } .gt-md\:text-opacity-75 { --text-opacity: 0.75 !important; } .gt-md\:text-opacity-84 { --text-opacity: 0.84 !important; } .gt-md\:text-opacity-100 { --text-opacity: 1 !important; } .gt-md\:hover\:text-opacity-0:hover { --text-opacity: 0 !important; } .gt-md\:hover\:text-opacity-12:hover { --text-opacity: 0.12 !important; } .gt-md\:hover\:text-opacity-25:hover { --text-opacity: 0.25 !important; } .gt-md\:hover\:text-opacity-38:hover { --text-opacity: 0.38 !important; } .gt-md\:hover\:text-opacity-50:hover { --text-opacity: 0.5 !important; } .gt-md\:hover\:text-opacity-54:hover { --text-opacity: 0.54 !important; } .gt-md\:hover\:text-opacity-70:hover { --text-opacity: 0.70 !important; } .gt-md\:hover\:text-opacity-75:hover { --text-opacity: 0.75 !important; } .gt-md\:hover\:text-opacity-84:hover { --text-opacity: 0.84 !important; } .gt-md\:hover\:text-opacity-100:hover { --text-opacity: 1 !important; } .gt-md\:focus\:text-opacity-0:focus { --text-opacity: 0 !important; } .gt-md\:focus\:text-opacity-12:focus { --text-opacity: 0.12 !important; } .gt-md\:focus\:text-opacity-25:focus { --text-opacity: 0.25 !important; } .gt-md\:focus\:text-opacity-38:focus { --text-opacity: 0.38 !important; } .gt-md\:focus\:text-opacity-50:focus { --text-opacity: 0.5 !important; } .gt-md\:focus\:text-opacity-54:focus { --text-opacity: 0.54 !important; } .gt-md\:focus\:text-opacity-70:focus { --text-opacity: 0.70 !important; } .gt-md\:focus\:text-opacity-75:focus { --text-opacity: 0.75 !important; } .gt-md\:focus\:text-opacity-84:focus { --text-opacity: 0.84 !important; } .gt-md\:focus\:text-opacity-100:focus { --text-opacity: 1 !important; } .gt-md\:italic { font-style: italic !important; } .gt-md\:not-italic { font-style: normal !important; } .gt-md\:uppercase { text-transform: uppercase !important; } .gt-md\:lowercase { text-transform: lowercase !important; } .gt-md\:capitalize { text-transform: capitalize !important; } .gt-md\:normal-case { text-transform: none !important; } .gt-md\:underline { text-decoration: underline !important; } .gt-md\:line-through { text-decoration: line-through !important; } .gt-md\:no-underline { text-decoration: none !important; } .gt-md\:hover\:underline:hover { text-decoration: underline !important; } .gt-md\:hover\:line-through:hover { text-decoration: line-through !important; } .gt-md\:hover\:no-underline:hover { text-decoration: none !important; } .gt-md\:focus\:underline:focus { text-decoration: underline !important; } .gt-md\:focus\:line-through:focus { text-decoration: line-through !important; } .gt-md\:focus\:no-underline:focus { text-decoration: none !important; } .gt-md\:tracking-tighter { letter-spacing: -0.05em !important; } .gt-md\:tracking-tight { letter-spacing: -0.025em !important; } .gt-md\:tracking-normal { letter-spacing: 0 !important; } .gt-md\:tracking-wide { letter-spacing: 0.025em !important; } .gt-md\:tracking-wider { letter-spacing: 0.05em !important; } .gt-md\:tracking-widest { letter-spacing: 0.1em !important; } .gt-md\:select-none { -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important; } .gt-md\:select-text { -webkit-user-select: text !important; -moz-user-select: text !important; -ms-user-select: text !important; user-select: text !important; } .gt-md\:select-all { -webkit-user-select: all !important; -moz-user-select: all !important; -ms-user-select: all !important; user-select: all !important; } .gt-md\:select-auto { -webkit-user-select: auto !important; -moz-user-select: auto !important; -ms-user-select: auto !important; user-select: auto !important; } .gt-md\:align-baseline { vertical-align: baseline !important; } .gt-md\:align-top { vertical-align: top !important; } .gt-md\:align-middle { vertical-align: middle !important; } .gt-md\:align-bottom { vertical-align: bottom !important; } .gt-md\:align-text-top { vertical-align: text-top !important; } .gt-md\:align-text-bottom { vertical-align: text-bottom !important; } .gt-md\:visible { visibility: visible !important; } .gt-md\:invisible { visibility: hidden !important; } .gt-md\:whitespace-normal { white-space: normal !important; } .gt-md\:whitespace-no-wrap { white-space: nowrap !important; } .gt-md\:whitespace-pre { white-space: pre !important; } .gt-md\:whitespace-pre-line { white-space: pre-line !important; } .gt-md\:whitespace-pre-wrap { white-space: pre-wrap !important; } .gt-md\:break-normal { overflow-wrap: normal !important; word-break: normal !important; } .gt-md\:break-words { overflow-wrap: break-word !important; } .gt-md\:break-all { word-break: break-all !important; } .gt-md\:truncate { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } .gt-md\:w-0 { width: 0 !important; } .gt-md\:w-1 { width: 0.25rem !important; } .gt-md\:w-2 { width: 0.5rem !important; } .gt-md\:w-3 { width: 0.75rem !important; } .gt-md\:w-4 { width: 1rem !important; } .gt-md\:w-5 { width: 1.25rem !important; } .gt-md\:w-6 { width: 1.5rem !important; } .gt-md\:w-8 { width: 2rem !important; } .gt-md\:w-10 { width: 2.5rem !important; } .gt-md\:w-12 { width: 3rem !important; } .gt-md\:w-14 { width: 3.5rem !important; } .gt-md\:w-16 { width: 4rem !important; } .gt-md\:w-18 { width: 4.5rem !important; } .gt-md\:w-20 { width: 5rem !important; } .gt-md\:w-22 { width: 5.5rem !important; } .gt-md\:w-24 { width: 6rem !important; } .gt-md\:w-26 { width: 6.5rem !important; } .gt-md\:w-28 { width: 7rem !important; } .gt-md\:w-30 { width: 7.5rem !important; } .gt-md\:w-32 { width: 8rem !important; } .gt-md\:w-36 { width: 9rem !important; } .gt-md\:w-40 { width: 10rem !important; } .gt-md\:w-48 { width: 12rem !important; } .gt-md\:w-50 { width: 12.5rem !important; } .gt-md\:w-56 { width: 14rem !important; } .gt-md\:w-60 { width: 15rem !important; } .gt-md\:w-64 { width: 16rem !important; } .gt-md\:w-80 { width: 20rem !important; } .gt-md\:w-90 { width: 24rem !important; } .gt-md\:w-100 { width: 25rem !important; } .gt-md\:w-120 { width: 30rem !important; } .gt-md\:w-128 { width: 32rem !important; } .gt-md\:w-140 { width: 35rem !important; } .gt-md\:w-160 { width: 40rem !important; } .gt-md\:w-180 { width: 45rem !important; } .gt-md\:w-192 { width: 48rem !important; } .gt-md\:w-200 { width: 50rem !important; } .gt-md\:w-240 { width: 60rem !important; } .gt-md\:w-256 { width: 64rem !important; } .gt-md\:w-280 { width: 70rem !important; } .gt-md\:w-320 { width: 80rem !important; } .gt-md\:w-360 { width: 90rem !important; } .gt-md\:w-400 { width: 100rem !important; } .gt-md\:w-480 { width: 120rem !important; } .gt-md\:w-auto { width: auto !important; } .gt-md\:w-px { width: 1px !important; } .gt-md\:w-2px { width: 2px !important; } .gt-md\:w-1\/2 { width: 50% !important; } .gt-md\:w-1\/3 { width: 33.33333% !important; } .gt-md\:w-2\/3 { width: 66.66667% !important; } .gt-md\:w-1\/4 { width: 25% !important; } .gt-md\:w-2\/4 { width: 50% !important; } .gt-md\:w-3\/4 { width: 75% !important; } .gt-md\:w-1\/5 { width: 20% !important; } .gt-md\:w-2\/5 { width: 40% !important; } .gt-md\:w-3\/5 { width: 60% !important; } .gt-md\:w-4\/5 { width: 80% !important; } .gt-md\:w-1\/6 { width: 16.666667% !important; } .gt-md\:w-2\/6 { width: 33.333333% !important; } .gt-md\:w-3\/6 { width: 50% !important; } .gt-md\:w-4\/6 { width: 66.666667% !important; } .gt-md\:w-5\/6 { width: 83.333333% !important; } .gt-md\:w-1\/12 { width: 8.33333% !important; } .gt-md\:w-2\/12 { width: 16.66667% !important; } .gt-md\:w-3\/12 { width: 25% !important; } .gt-md\:w-4\/12 { width: 33.33333% !important; } .gt-md\:w-5\/12 { width: 41.66667% !important; } .gt-md\:w-6\/12 { width: 50% !important; } .gt-md\:w-7\/12 { width: 58.33333% !important; } .gt-md\:w-8\/12 { width: 66.66667% !important; } .gt-md\:w-9\/12 { width: 75% !important; } .gt-md\:w-10\/12 { width: 83.33333% !important; } .gt-md\:w-11\/12 { width: 91.66667% !important; } .gt-md\:w-full { width: 100% !important; } .gt-md\:w-screen { width: 100vw !important; } .gt-md\:z-0 { z-index: 0 !important; } .gt-md\:z-10 { z-index: 10 !important; } .gt-md\:z-20 { z-index: 20 !important; } .gt-md\:z-30 { z-index: 30 !important; } .gt-md\:z-40 { z-index: 40 !important; } .gt-md\:z-50 { z-index: 50 !important; } .gt-md\:z-60 { z-index: 60 !important; } .gt-md\:z-70 { z-index: 70 !important; } .gt-md\:z-80 { z-index: 80 !important; } .gt-md\:z-90 { z-index: 90 !important; } .gt-md\:z-99 { z-index: 99 !important; } .gt-md\:z-999 { z-index: 999 !important; } .gt-md\:z-9999 { z-index: 9999 !important; } .gt-md\:z-99999 { z-index: 99999 !important; } .gt-md\:z-auto { z-index: auto !important; } .gt-md\:-z-1 { z-index: -1 !important; } .gt-md\:gap-0 { grid-gap: 0 !important; gap: 0 !important; } .gt-md\:gap-1 { grid-gap: 0.25rem !important; gap: 0.25rem !important; } .gt-md\:gap-2 { grid-gap: 0.5rem !important; gap: 0.5rem !important; } .gt-md\:gap-3 { grid-gap: 0.75rem !important; gap: 0.75rem !important; } .gt-md\:gap-4 { grid-gap: 1rem !important; gap: 1rem !important; } .gt-md\:gap-5 { grid-gap: 1.25rem !important; gap: 1.25rem !important; } .gt-md\:gap-6 { grid-gap: 1.5rem !important; gap: 1.5rem !important; } .gt-md\:gap-8 { grid-gap: 2rem !important; gap: 2rem !important; } .gt-md\:gap-10 { grid-gap: 2.5rem !important; gap: 2.5rem !important; } .gt-md\:gap-12 { grid-gap: 3rem !important; gap: 3rem !important; } .gt-md\:gap-14 { grid-gap: 3.5rem !important; gap: 3.5rem !important; } .gt-md\:gap-16 { grid-gap: 4rem !important; gap: 4rem !important; } .gt-md\:gap-18 { grid-gap: 4.5rem !important; gap: 4.5rem !important; } .gt-md\:gap-20 { grid-gap: 5rem !important; gap: 5rem !important; } .gt-md\:gap-22 { grid-gap: 5.5rem !important; gap: 5.5rem !important; } .gt-md\:gap-24 { grid-gap: 6rem !important; gap: 6rem !important; } .gt-md\:gap-26 { grid-gap: 6.5rem !important; gap: 6.5rem !important; } .gt-md\:gap-28 { grid-gap: 7rem !important; gap: 7rem !important; } .gt-md\:gap-30 { grid-gap: 7.5rem !important; gap: 7.5rem !important; } .gt-md\:gap-32 { grid-gap: 8rem !important; gap: 8rem !important; } .gt-md\:gap-36 { grid-gap: 9rem !important; gap: 9rem !important; } .gt-md\:gap-40 { grid-gap: 10rem !important; gap: 10rem !important; } .gt-md\:gap-48 { grid-gap: 12rem !important; gap: 12rem !important; } .gt-md\:gap-56 { grid-gap: 14rem !important; gap: 14rem !important; } .gt-md\:gap-64 { grid-gap: 16rem !important; gap: 16rem !important; } .gt-md\:gap-px { grid-gap: 1px !important; gap: 1px !important; } .gt-md\:gap-2px { grid-gap: 2px !important; gap: 2px !important; } .gt-md\:col-gap-0 { grid-column-gap: 0 !important; -moz-column-gap: 0 !important; column-gap: 0 !important; } .gt-md\:col-gap-1 { grid-column-gap: 0.25rem !important; -moz-column-gap: 0.25rem !important; column-gap: 0.25rem !important; } .gt-md\:col-gap-2 { grid-column-gap: 0.5rem !important; -moz-column-gap: 0.5rem !important; column-gap: 0.5rem !important; } .gt-md\:col-gap-3 { grid-column-gap: 0.75rem !important; -moz-column-gap: 0.75rem !important; column-gap: 0.75rem !important; } .gt-md\:col-gap-4 { grid-column-gap: 1rem !important; -moz-column-gap: 1rem !important; column-gap: 1rem !important; } .gt-md\:col-gap-5 { grid-column-gap: 1.25rem !important; -moz-column-gap: 1.25rem !important; column-gap: 1.25rem !important; } .gt-md\:col-gap-6 { grid-column-gap: 1.5rem !important; -moz-column-gap: 1.5rem !important; column-gap: 1.5rem !important; } .gt-md\:col-gap-8 { grid-column-gap: 2rem !important; -moz-column-gap: 2rem !important; column-gap: 2rem !important; } .gt-md\:col-gap-10 { grid-column-gap: 2.5rem !important; -moz-column-gap: 2.5rem !important; column-gap: 2.5rem !important; } .gt-md\:col-gap-12 { grid-column-gap: 3rem !important; -moz-column-gap: 3rem !important; column-gap: 3rem !important; } .gt-md\:col-gap-14 { grid-column-gap: 3.5rem !important; -moz-column-gap: 3.5rem !important; column-gap: 3.5rem !important; } .gt-md\:col-gap-16 { grid-column-gap: 4rem !important; -moz-column-gap: 4rem !important; column-gap: 4rem !important; } .gt-md\:col-gap-18 { grid-column-gap: 4.5rem !important; -moz-column-gap: 4.5rem !important; column-gap: 4.5rem !important; } .gt-md\:col-gap-20 { grid-column-gap: 5rem !important; -moz-column-gap: 5rem !important; column-gap: 5rem !important; } .gt-md\:col-gap-22 { grid-column-gap: 5.5rem !important; -moz-column-gap: 5.5rem !important; column-gap: 5.5rem !important; } .gt-md\:col-gap-24 { grid-column-gap: 6rem !important; -moz-column-gap: 6rem !important; column-gap: 6rem !important; } .gt-md\:col-gap-26 { grid-column-gap: 6.5rem !important; -moz-column-gap: 6.5rem !important; column-gap: 6.5rem !important; } .gt-md\:col-gap-28 { grid-column-gap: 7rem !important; -moz-column-gap: 7rem !important; column-gap: 7rem !important; } .gt-md\:col-gap-30 { grid-column-gap: 7.5rem !important; -moz-column-gap: 7.5rem !important; column-gap: 7.5rem !important; } .gt-md\:col-gap-32 { grid-column-gap: 8rem !important; -moz-column-gap: 8rem !important; column-gap: 8rem !important; } .gt-md\:col-gap-36 { grid-column-gap: 9rem !important; -moz-column-gap: 9rem !important; column-gap: 9rem !important; } .gt-md\:col-gap-40 { grid-column-gap: 10rem !important; -moz-column-gap: 10rem !important; column-gap: 10rem !important; } .gt-md\:col-gap-48 { grid-column-gap: 12rem !important; -moz-column-gap: 12rem !important; column-gap: 12rem !important; } .gt-md\:col-gap-56 { grid-column-gap: 14rem !important; -moz-column-gap: 14rem !important; column-gap: 14rem !important; } .gt-md\:col-gap-64 { grid-column-gap: 16rem !important; -moz-column-gap: 16rem !important; column-gap: 16rem !important; } .gt-md\:col-gap-px { grid-column-gap: 1px !important; -moz-column-gap: 1px !important; column-gap: 1px !important; } .gt-md\:col-gap-2px { grid-column-gap: 2px !important; -moz-column-gap: 2px !important; column-gap: 2px !important; } .gt-md\:row-gap-0 { grid-row-gap: 0 !important; row-gap: 0 !important; } .gt-md\:row-gap-1 { grid-row-gap: 0.25rem !important; row-gap: 0.25rem !important; } .gt-md\:row-gap-2 { grid-row-gap: 0.5rem !important; row-gap: 0.5rem !important; } .gt-md\:row-gap-3 { grid-row-gap: 0.75rem !important; row-gap: 0.75rem !important; } .gt-md\:row-gap-4 { grid-row-gap: 1rem !important; row-gap: 1rem !important; } .gt-md\:row-gap-5 { grid-row-gap: 1.25rem !important; row-gap: 1.25rem !important; } .gt-md\:row-gap-6 { grid-row-gap: 1.5rem !important; row-gap: 1.5rem !important; } .gt-md\:row-gap-8 { grid-row-gap: 2rem !important; row-gap: 2rem !important; } .gt-md\:row-gap-10 { grid-row-gap: 2.5rem !important; row-gap: 2.5rem !important; } .gt-md\:row-gap-12 { grid-row-gap: 3rem !important; row-gap: 3rem !important; } .gt-md\:row-gap-14 { grid-row-gap: 3.5rem !important; row-gap: 3.5rem !important; } .gt-md\:row-gap-16 { grid-row-gap: 4rem !important; row-gap: 4rem !important; } .gt-md\:row-gap-18 { grid-row-gap: 4.5rem !important; row-gap: 4.5rem !important; } .gt-md\:row-gap-20 { grid-row-gap: 5rem !important; row-gap: 5rem !important; } .gt-md\:row-gap-22 { grid-row-gap: 5.5rem !important; row-gap: 5.5rem !important; } .gt-md\:row-gap-24 { grid-row-gap: 6rem !important; row-gap: 6rem !important; } .gt-md\:row-gap-26 { grid-row-gap: 6.5rem !important; row-gap: 6.5rem !important; } .gt-md\:row-gap-28 { grid-row-gap: 7rem !important; row-gap: 7rem !important; } .gt-md\:row-gap-30 { grid-row-gap: 7.5rem !important; row-gap: 7.5rem !important; } .gt-md\:row-gap-32 { grid-row-gap: 8rem !important; row-gap: 8rem !important; } .gt-md\:row-gap-36 { grid-row-gap: 9rem !important; row-gap: 9rem !important; } .gt-md\:row-gap-40 { grid-row-gap: 10rem !important; row-gap: 10rem !important; } .gt-md\:row-gap-48 { grid-row-gap: 12rem !important; row-gap: 12rem !important; } .gt-md\:row-gap-56 { grid-row-gap: 14rem !important; row-gap: 14rem !important; } .gt-md\:row-gap-64 { grid-row-gap: 16rem !important; row-gap: 16rem !important; } .gt-md\:row-gap-px { grid-row-gap: 1px !important; row-gap: 1px !important; } .gt-md\:row-gap-2px { grid-row-gap: 2px !important; row-gap: 2px !important; } .gt-md\:grid-flow-row { grid-auto-flow: row !important; } .gt-md\:grid-flow-col { grid-auto-flow: column !important; } .gt-md\:grid-flow-row-dense { grid-auto-flow: row dense !important; } .gt-md\:grid-flow-col-dense { grid-auto-flow: column dense !important; } .gt-md\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; } .gt-md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } .gt-md\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; } .gt-md\:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; } .gt-md\:grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; } .gt-md\:grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; } .gt-md\:grid-cols-7 { grid-template-columns: repeat(7, minmax(0, 1fr)) !important; } .gt-md\:grid-cols-8 { grid-template-columns: repeat(8, minmax(0, 1fr)) !important; } .gt-md\:grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)) !important; } .gt-md\:grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)) !important; } .gt-md\:grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)) !important; } .gt-md\:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)) !important; } .gt-md\:grid-cols-none { grid-template-columns: none !important; } .gt-md\:col-auto { grid-column: auto !important; } .gt-md\:col-span-1 { grid-column: span 1 / span 1 !important; } .gt-md\:col-span-2 { grid-column: span 2 / span 2 !important; } .gt-md\:col-span-3 { grid-column: span 3 / span 3 !important; } .gt-md\:col-span-4 { grid-column: span 4 / span 4 !important; } .gt-md\:col-span-5 { grid-column: span 5 / span 5 !important; } .gt-md\:col-span-6 { grid-column: span 6 / span 6 !important; } .gt-md\:col-span-7 { grid-column: span 7 / span 7 !important; } .gt-md\:col-span-8 { grid-column: span 8 / span 8 !important; } .gt-md\:col-span-9 { grid-column: span 9 / span 9 !important; } .gt-md\:col-span-10 { grid-column: span 10 / span 10 !important; } .gt-md\:col-span-11 { grid-column: span 11 / span 11 !important; } .gt-md\:col-span-12 { grid-column: span 12 / span 12 !important; } .gt-md\:col-start-1 { grid-column-start: 1 !important; } .gt-md\:col-start-2 { grid-column-start: 2 !important; } .gt-md\:col-start-3 { grid-column-start: 3 !important; } .gt-md\:col-start-4 { grid-column-start: 4 !important; } .gt-md\:col-start-5 { grid-column-start: 5 !important; } .gt-md\:col-start-6 { grid-column-start: 6 !important; } .gt-md\:col-start-7 { grid-column-start: 7 !important; } .gt-md\:col-start-8 { grid-column-start: 8 !important; } .gt-md\:col-start-9 { grid-column-start: 9 !important; } .gt-md\:col-start-10 { grid-column-start: 10 !important; } .gt-md\:col-start-11 { grid-column-start: 11 !important; } .gt-md\:col-start-12 { grid-column-start: 12 !important; } .gt-md\:col-start-13 { grid-column-start: 13 !important; } .gt-md\:col-start-auto { grid-column-start: auto !important; } .gt-md\:col-end-1 { grid-column-end: 1 !important; } .gt-md\:col-end-2 { grid-column-end: 2 !important; } .gt-md\:col-end-3 { grid-column-end: 3 !important; } .gt-md\:col-end-4 { grid-column-end: 4 !important; } .gt-md\:col-end-5 { grid-column-end: 5 !important; } .gt-md\:col-end-6 { grid-column-end: 6 !important; } .gt-md\:col-end-7 { grid-column-end: 7 !important; } .gt-md\:col-end-8 { grid-column-end: 8 !important; } .gt-md\:col-end-9 { grid-column-end: 9 !important; } .gt-md\:col-end-10 { grid-column-end: 10 !important; } .gt-md\:col-end-11 { grid-column-end: 11 !important; } .gt-md\:col-end-12 { grid-column-end: 12 !important; } .gt-md\:col-end-13 { grid-column-end: 13 !important; } .gt-md\:col-end-auto { grid-column-end: auto !important; } .gt-md\:grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)) !important; } .gt-md\:grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)) !important; } .gt-md\:grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)) !important; } .gt-md\:grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)) !important; } .gt-md\:grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)) !important; } .gt-md\:grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)) !important; } .gt-md\:grid-rows-none { grid-template-rows: none !important; } .gt-md\:row-auto { grid-row: auto !important; } .gt-md\:row-span-1 { grid-row: span 1 / span 1 !important; } .gt-md\:row-span-2 { grid-row: span 2 / span 2 !important; } .gt-md\:row-span-3 { grid-row: span 3 / span 3 !important; } .gt-md\:row-span-4 { grid-row: span 4 / span 4 !important; } .gt-md\:row-span-5 { grid-row: span 5 / span 5 !important; } .gt-md\:row-span-6 { grid-row: span 6 / span 6 !important; } .gt-md\:row-start-1 { grid-row-start: 1 !important; } .gt-md\:row-start-2 { grid-row-start: 2 !important; } .gt-md\:row-start-3 { grid-row-start: 3 !important; } .gt-md\:row-start-4 { grid-row-start: 4 !important; } .gt-md\:row-start-5 { grid-row-start: 5 !important; } .gt-md\:row-start-6 { grid-row-start: 6 !important; } .gt-md\:row-start-7 { grid-row-start: 7 !important; } .gt-md\:row-start-auto { grid-row-start: auto !important; } .gt-md\:row-end-1 { grid-row-end: 1 !important; } .gt-md\:row-end-2 { grid-row-end: 2 !important; } .gt-md\:row-end-3 { grid-row-end: 3 !important; } .gt-md\:row-end-4 { grid-row-end: 4 !important; } .gt-md\:row-end-5 { grid-row-end: 5 !important; } .gt-md\:row-end-6 { grid-row-end: 6 !important; } .gt-md\:row-end-7 { grid-row-end: 7 !important; } .gt-md\:row-end-auto { grid-row-end: auto !important; } .gt-md\:transform { --transform-translate-x: 0 !important; --transform-translate-y: 0 !important; --transform-rotate: 0 !important; --transform-skew-x: 0 !important; --transform-skew-y: 0 !important; --transform-scale-x: 1 !important; --transform-scale-y: 1 !important; transform: translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y)) !important; } .gt-md\:transform-none { transform: none !important; } .gt-md\:origin-center { transform-origin: center !important; } .gt-md\:origin-top { transform-origin: top !important; } .gt-md\:origin-top-right { transform-origin: top right !important; } .gt-md\:origin-right { transform-origin: right !important; } .gt-md\:origin-bottom-right { transform-origin: bottom right !important; } .gt-md\:origin-bottom { transform-origin: bottom !important; } .gt-md\:origin-bottom-left { transform-origin: bottom left !important; } .gt-md\:origin-left { transform-origin: left !important; } .gt-md\:origin-top-left { transform-origin: top left !important; } .gt-md\:icon-size-12 { width: 12px !important; height: 12px !important; min-width: 12px !important; min-height: 12px !important; font-size: 12px !important; line-height: 12px !important; } .gt-md\:icon-size-12 svg { width: 12px !important; height: 12px !important; } .gt-md\:icon-size-14 { width: 14px !important; height: 14px !important; min-width: 14px !important; min-height: 14px !important; font-size: 14px !important; line-height: 14px !important; } .gt-md\:icon-size-14 svg { width: 14px !important; height: 14px !important; } .gt-md\:icon-size-16 { width: 16px !important; height: 16px !important; min-width: 16px !important; min-height: 16px !important; font-size: 16px !important; line-height: 16px !important; } .gt-md\:icon-size-16 svg { width: 16px !important; height: 16px !important; } .gt-md\:icon-size-18 { width: 18px !important; height: 18px !important; min-width: 18px !important; min-height: 18px !important; font-size: 18px !important; line-height: 18px !important; } .gt-md\:icon-size-18 svg { width: 18px !important; height: 18px !important; } .gt-md\:icon-size-20 { width: 20px !important; height: 20px !important; min-width: 20px !important; min-height: 20px !important; font-size: 20px !important; line-height: 20px !important; } .gt-md\:icon-size-20 svg { width: 20px !important; height: 20px !important; } .gt-md\:icon-size-24 { width: 24px !important; height: 24px !important; min-width: 24px !important; min-height: 24px !important; font-size: 24px !important; line-height: 24px !important; } .gt-md\:icon-size-24 svg { width: 24px !important; height: 24px !important; } .gt-md\:icon-size-32 { width: 32px !important; height: 32px !important; min-width: 32px !important; min-height: 32px !important; font-size: 32px !important; line-height: 32px !important; } .gt-md\:icon-size-32 svg { width: 32px !important; height: 32px !important; } .gt-md\:icon-size-40 { width: 40px !important; height: 40px !important; min-width: 40px !important; min-height: 40px !important; font-size: 40px !important; line-height: 40px !important; } .gt-md\:icon-size-40 svg { width: 40px !important; height: 40px !important; } .gt-md\:icon-size-48 { width: 48px !important; height: 48px !important; min-width: 48px !important; min-height: 48px !important; font-size: 48px !important; line-height: 48px !important; } .gt-md\:icon-size-48 svg { width: 48px !important; height: 48px !important; } .gt-md\:icon-size-56 { width: 56px !important; height: 56px !important; min-width: 56px !important; min-height: 56px !important; font-size: 56px !important; line-height: 56px !important; } .gt-md\:icon-size-56 svg { width: 56px !important; height: 56px !important; } .gt-md\:icon-size-64 { width: 64px !important; height: 64px !important; min-width: 64px !important; min-height: 64px !important; font-size: 64px !important; line-height: 64px !important; } .gt-md\:icon-size-64 svg { width: 64px !important; height: 64px !important; } .gt-md\:icon-size-72 { width: 72px !important; height: 72px !important; min-width: 72px !important; min-height: 72px !important; font-size: 72px !important; line-height: 72px !important; } .gt-md\:icon-size-72 svg { width: 72px !important; height: 72px !important; } .gt-md\:icon-size-80 { width: 80px !important; height: 80px !important; min-width: 80px !important; min-height: 80px !important; font-size: 80px !important; line-height: 80px !important; } .gt-md\:icon-size-80 svg { width: 80px !important; height: 80px !important; } .gt-md\:icon-size-88 { width: 88px !important; height: 88px !important; min-width: 88px !important; min-height: 88px !important; font-size: 88px !important; line-height: 88px !important; } .gt-md\:icon-size-88 svg { width: 88px !important; height: 88px !important; } .gt-md\:icon-size-96 { width: 96px !important; height: 96px !important; min-width: 96px !important; min-height: 96px !important; font-size: 96px !important; line-height: 96px !important; } .gt-md\:icon-size-96 svg { width: 96px !important; height: 96px !important; } } ================================================ FILE: webapp/frontend/src/styles/themes.scss ================================================ // @formatter:off // ----------------------------------------------------------------------------------------------------- // @ Treo themes map. Do NOT rename the '$treo-themes' variable!!! // This file meant to be imported more than once by @treo, do NOT put anything heavy here! // The map contains Angular Material themes that will be generated for your app. // // @ Each key represents a class name that can be added to the 'body' tag to enable the theme globally. // If added to other elements, themes will be applied to that element's scope only. // Keys must start with 'treo-theme-'. // // @ Each value is an Angular Material theme, generated and modified by using 'treo-light-theme' or // 'treo-dark-theme' functions which uses 'mat-light-theme' and 'mat-dark-theme' functions respectively // to generate the themes. // // @ 'treo-palette' values are coming from '$treo-color' map which can be found in // '@treo/styles/utilities/_colors.scss'. // ----------------------------------------------------------------------------------------------------- $treo-themes: ( // ----------------------------------------------------------------------------------------------------- // @ User themes - Add/Remove/Modify these for your own likings and needs // ----------------------------------------------------------------------------------------------------- // Dark theme 'treo-theme-dark': treo-dark-theme( treo-palette('teal'), treo-palette('pink', 500), treo-palette('red', 400) ), // Light theme 'treo-theme-light': treo-light-theme( treo-palette('indigo', 600), treo-palette('cool-gray', 800), treo-palette('red', 700) ), // ----------------------------------------------------------------------------------------------------- // @ Dark & Light themes - DO NOT REMOVE // These are generic themes which are useful if you want to adjust the theming of certain container // or an element independently from the app's global theme. // // @ Example: If you want to have a dark toolbar in your light themed app, adding '.theme-dark' class // to the toolbar will apply a dark theme to every element that stays inside it without needing any // extra work. Without the '.theme-dark' class, adding just a dark background color won't automatically // make the toolbar elements colored correctly, which will break the styling of the toolbar. // // @ Important note: '.theme-light' classes will always override '.theme-dark' classes because how CSS // works. Since 'theme-light' definition comes after the 'theme-dark' definition, CSS classes and // helpers will also be generated with that order which will cause that behavior. To overcome this // issue, never nest '.theme-light' and '.theme-dark' classes. Use them as siblings! // ----------------------------------------------------------------------------------------------------- // Dark theme - DO NOT REMOVE 'theme-dark': treo-dark-theme( treo-palette('white'), treo-palette('gray', 800), treo-palette('red', 800) ), // Light theme - DO NOT REMOVE 'theme-light': treo-light-theme( treo-palette('black'), treo-palette('gray', 800), treo-palette('red', 800) ) ); ================================================ FILE: webapp/frontend/src/styles/vendors.scss ================================================ // ----------------------------------------------------------------------------------------------------- // @ You can use this file to import styles from third party libraries. // // @ It's important to put them here because anything imported from this file can be overridden by // Treo which allows having out-of-the-box support for certain libraries. They can also be // overridden from 'styles.scss' file which allows you to override and make any third party library // that Treo doesn't support out-of-the-box visually compatible with your application. // ----------------------------------------------------------------------------------------------------- // Perfect scrollbar @import '~perfect-scrollbar/css/perfect-scrollbar.css'; // Quill @import '~quill/dist/quill.snow.css'; ================================================ FILE: webapp/frontend/src/tailwind/config.js ================================================ const forEach = require('lodash/forEach'); const isObject = require('lodash/isObject'); const {colors} = require('tailwindcss/defaultTheme'); module.exports = { // PurgeCSS purge: false, // Options important: true, // Theme theme: { colors : { current : 'currentColor', transparent: 'transparent', white : '#FFFFFF', black : '#000000', gray : { '50' : '#F9FAFB', '100' : '#F4F5F7', '200' : '#E5E7EB', '300' : '#D2D6DC', '400' : '#9FA6B2', '500' : '#6B7280', default: '#6B7280', '600' : '#4B5563', '700' : '#374151', '800' : '#252F3F', '900' : '#161E2E' }, 'cool-gray': { '50' : '#FBFDFE', '100' : '#F1F5F9', '200' : '#E2E8F0', '300' : '#CFD8E3', '400' : '#97A6BA', '500' : '#64748B', default: '#64748B', '600' : '#475569', '700' : '#364152', '800' : '#27303F', '900' : '#1A202E' }, red : { '50' : '#FDF2F2', '100' : '#FDE8E8', '200' : '#FBD5D5', '300' : '#F8B4B4', '400' : '#F98080', '500' : '#F05252', default: '#F05252', '600' : '#E02424', '700' : '#C81E1E', '800' : '#9B1C1C', '900' : '#771D1D' }, orange : { '50' : '#FFF8F1', '100' : '#FEECDC', '200' : '#FCD9BD', '300' : '#FDBA8C', '400' : '#FF8A4C', '500' : '#FF5A1F', default: '#FF5A1F', '600' : '#D03801', '700' : '#B43403', '800' : '#8A2C0D', '900' : '#771D1D' }, yellow : { '50' : '#FDFDEA', '100' : '#FDF6B2', '200' : '#FCE96A', '300' : '#FACA15', '400' : '#E3A008', '500' : '#C27803', default: '#C27803', '600' : '#9F580A', '700' : '#8E4B10', '800' : '#723B13', '900' : '#633112' }, green : { '50' : '#F3FAF7', '100' : '#DEF7EC', '200' : '#BCF0DA', '300' : '#84E1BC', '400' : '#31C48D', '500' : '#0E9F6E', default: '#0E9F6E', '600' : '#057A55', '700' : '#046C4E', '800' : '#03543F', '900' : '#014737' }, teal : { '50' : '#EDFAFA', '100' : '#D5F5F6', '200' : '#AFECEF', '300' : '#7EDCE2', '400' : '#16BDCA', '500' : '#0694A2', default: '#0694A2', '600' : '#047481', '700' : '#036672', '800' : '#05505C', '900' : '#014451' }, blue : { '50' : '#EBF5FF', '100' : '#E1EFFE', '200' : '#C3DDFD', '300' : '#A4CAFE', '400' : '#76A9FA', '500' : '#3F83F8', default: '#3F83F8', '600' : '#1C64F2', '700' : '#1A56DB', '800' : '#1E429F', '900' : '#233876' }, indigo : { '50' : '#F0F5FF', '100' : '#E5EDFF', '200' : '#CDDBFE', '300' : '#B4C6FC', '400' : '#8DA2FB', '500' : '#6875F5', default: '#6875F5', '600' : '#5850EC', '700' : '#5145CD', '800' : '#42389D', '900' : '#362F78' }, purple : { '50' : '#F6F5FF', '100' : '#EDEBFE', '200' : '#DCD7FE', '300' : '#CABFFD', '400' : '#AC94FA', '500' : '#9061F9', default: '#9061F9', '600' : '#7E3AF2', '700' : '#6C2BD9', '800' : '#5521B5', '900' : '#4A1D96' }, pink : { '50' : '#FDF2F8', '100' : '#FCE8F3', '200' : '#FAD1E8', '300' : '#F8B4D9', '400' : '#F17EB8', '500' : '#E74694', default: '#E74694', '600' : '#D61F69', '700' : '#BF125D', '800' : '#99154B', '900' : '#751A3D' } }, fontSize: { 'xs' : '0.625rem', 'sm' : '0.75rem', 'md' : '0.8125rem', 'base': '0.875rem', 'lg' : '1rem', 'xl' : '1.125rem', '2xl' : '1.25rem', '3xl' : '1.5rem', '4xl' : '2rem', '5xl' : '2.25rem', '6xl' : '2.5rem', '7xl' : '3rem', '8xl' : '4rem', '9xl' : '6rem', '10xl': '8rem' }, screens : { // XSmall 'xs' : { min: '0', max: '599px' }, // Small 'sm' : { min: '600px', max: '959px' }, // Medium 'md' : { min: '960px', max: '1279px' }, // Large 'lg' : { min: '1280px', max: '1439px' }, // XLarge 'xl' : { min: '1440px' }, // Less than Medium 'lt-md': { max: '959px' }, // Less than Large 'lt-lg': { max: '1279px' }, // Less than XLarge 'lt-xl': { max: '1439px' }, // Greater than XSmall 'gt-xs': { min: '600px' }, // Greater than Small 'gt-sm': { min: '960px' }, // Greater than Medium 'gt-md': { min: '1280px' } }, sizes : theme => ({ // Sizes are used in width & height helpers ...theme('spacing'), '50' : '12.5rem', '60' : '15rem', '80' : '20rem', '90' : '24rem', '100' : '25rem', '120' : '30rem', '128' : '32rem', '140' : '35rem', '160' : '40rem', '180' : '45rem', '192' : '48rem', '200' : '50rem', '240' : '60rem', '256' : '64rem', '280' : '70rem', '320' : '80rem', '360' : '90rem', '400' : '100rem', '480' : '120rem', '1/2' : '50%', '1/3' : '33.33333%', '2/3' : '66.66667%', '1/4' : '25%', '2/4' : '50%', '3/4' : '75%', '1/5' : '20%', '2/5' : '40%', '3/5' : '60%', '4/5' : '80%', '1/12' : '8.33333%', '2/12' : '16.66667%', '3/12' : '25%', '4/12' : '33.33333%', '5/12' : '41.66667%', '6/12' : '50%', '7/12' : '58.33333%', '8/12' : '66.66667%', '9/12' : '75%', '10/12': '83.33333%', '11/12': '91.66667%' }), // Extending default configurations extend : { /* // Once TailwindCSS adds the above colors to their default config, // this code will be used for generating the default colors // and the theme.colors object will be removed from above colors : theme => { // Extend the colors to add 'default' values that uses the hue 500. // This will generate utilities like 'text-indigo' or 'bg-red', // which will be defaulted to the hue 500 of that color palette. const defaultColors = colors; forEach(defaultColors, (value, key) => { if ( isObject(value) ) { defaultColors[key]['default'] = defaultColors[key]['500'] } }); return defaultColors; }, */ /* // Use this map to define custom contrasting colors for the custom colors colorContrasts: theme => ({ brand-color: { 50 : theme('colors.brand-color.900'), // Use the 900 from the 'brand-color' palette as the contrasting color of the 50 100 : theme('colors.brand-color.900'), 200 : theme('colors.brand-color.900'), 300 : theme('colors.brand-color.900'), 400 : theme('colors.brand-color.900'), 500 : theme('colors.brand-color.900'), 600 : theme('colors.brand-color.50'), 700 : theme('colors.brand-color.50'), 800 : theme('colors.brand-color.50'), 900 : theme('colors.brand-color.50'), default: theme('colors.brand-color.900') } }, */ /* // Use this map to extend the iconSize utility sizes iconSize: { 8: '8px', 10: '10px' }, */ boxShadow : { solid: '0 0 0 2px currentColor' }, flex : { '0': '0 0 auto' }, fontFamily: { sans: [ 'Inter', 'system-ui', '-apple-system', 'BlinkMacSystemFont', '"Segoe UI"', 'Roboto', '"Helvetica Neue"', 'Arial', '"Noto Sans"', 'sans-serif', '"Apple Color Emoji"', '"Segoe UI Emoji"', '"Segoe UI Symbol"', '"Noto Color Emoji"' ], mono: [ '"IBM Plex Mono"', 'Menlo', 'Monaco', 'Consolas', '"Liberation Mono"', '"Courier New"', 'monospace' ] }, opacity : { 12: '0.12', 38: '0.38', 54: '0.54', 70: '0.70', 84: '0.84' }, rotate : { '-270': '270deg', '15' : '15deg', '30' : '30deg', '60' : '60deg', '270' : '270deg' }, spacing : { '2px': '2px', '14' : '3.5rem', '18' : '4.5rem', '22' : '5.5rem', '26' : '6.5rem', '28' : '7rem', '30' : '7.5rem', '36' : '9rem' }, zIndex : { '-1' : -1, '60' : 60, '70' : 70, '80' : 80, '90' : 90, '99' : 99, '999' : 999, '9999' : 9999, '99999': 99999 }, maxHeight : theme => ({ none: 'none', ...theme('sizes') }), minHeight : theme => ({ ...theme('sizes') }), height : theme => ({ ...theme('sizes') }), maxWidth : theme => ({ screen: '100vw', ...theme('sizes') }), minWidth : theme => ({ screen: '100vw', ...theme('sizes') }), width : theme => ({ ...theme('sizes') }) } }, // Variants variants: { backgroundColor : ['dark-light'], borderColor : ['dark-light'], borderWidth : ['responsive', 'first', 'last'], cursor : [], fontFamily : [], fontSmoothing : [], fontWeight : ['responsive'], iconSize : ['responsive'], resize : [], textColor : ['dark-light'], scale : [], rotate : [], translate : [], skew : [], transitionProperty : [], transitionTimingFunction: [], transitionDuration : [], transitionDelay : [] }, // Core plugins corePlugins: { container : false, clear : false, float : false, placeholderColor: false }, // Custom plugins plugins: [ // Custom plugins required by Treo ...require('../@treo/tailwind/plugins') // Other third party and custom plugins can be required here // ... ] }; ================================================ FILE: webapp/frontend/src/tailwind/main.css ================================================ /* ----------------------------------------------------------------------------------------------------- */ /* This injects Tailwind's component classes and any component classes registered by plugins. /* ----------------------------------------------------------------------------------------------------- */ @tailwind components; /* ----------------------------------------------------------------------------------------------------- */ /* Use custom @apply directives here to inline any existing utility classes into your own custom CSS. /* ----------------------------------------------------------------------------------------------------- */ /** * .btn { * @apply font-bold py-2 px-4 rounded; * } */ /* ----------------------------------------------------------------------------------------------------- */ /* This injects Tailwind's utility classes and any utility classes registered by plugins. /* ----------------------------------------------------------------------------------------------------- */ @tailwind utilities; /* ----------------------------------------------------------------------------------------------------- */ /* Use custom @variant directives here to build them. /* ----------------------------------------------------------------------------------------------------- */ @variants dark-light {} /* ----------------------------------------------------------------------------------------------------- */ /* Use this directive to control where Tailwind injects the responsive variations of each utility. /* If omitted, Tailwind will append these classes to the very end of your stylesheet by default. /* ----------------------------------------------------------------------------------------------------- */ @tailwind screens; ================================================ FILE: webapp/frontend/src/test.ts ================================================ // This file is required by karma.conf.js and loads recursively all the .spec and framework files import 'zone.js/dist/zone-testing'; import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; declare const require: { context(path: string, deep?: boolean, filter?: RegExp): { keys(): string[]; (id: string): T; }; }; // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, platformBrowserDynamicTesting() ); // Then we find all the tests. const context = require.context('./', true, /\.spec\.ts$/); // And load the modules. context.keys().map(context); ================================================ FILE: webapp/frontend/tsconfig.app.json ================================================ { "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./out-tsc/app", "types": [] }, "files": [ "src/main.ts", "src/polyfills.ts" ], "include": [ "src/**/*.d.ts" ], "exclude": [ "src/tailwind/**" ] } ================================================ FILE: webapp/frontend/tsconfig.json ================================================ { "compileOnSave": false, "compilerOptions": { "allowSyntheticDefaultImports": true, "baseUrl": "./src", "outDir": "./dist/out-tsc", "sourceMap": true, "declaration": false, "downlevelIteration": true, "experimentalDecorators": true, "module": "esnext", "moduleResolution": "node", "importHelpers": true, "target": "es2015", "typeRoots": [ "node_modules/@types" ], "lib": [ "es2018", "dom" ] }, "angularCompilerOptions": { "fullTemplateTypeCheck": true, "strictInjectionParameters": true } } ================================================ FILE: webapp/frontend/tsconfig.spec.json ================================================ { "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./out-tsc/spec", "types": [ "jasmine", "node" ] }, "files": [ "src/test.ts", "src/polyfills.ts" ], "include": [ "src/**/*.spec.ts", "src/**/*.d.ts" ] } ================================================ FILE: webapp/frontend/tslint.json ================================================ // @formatter:off { "extends": "tslint:recommended", "rules": { "array-type": false, "arrow-parens": false, "deprecation": { "severity": "warning" }, "component-class-suffix": true, "contextual-lifecycle": true, "directive-class-suffix": true, "directive-selector": [ true, "attribute", ["treo", ""], "camelCase" ], "component-selector": [ true, "element", "attribute", ["treo", ""], ["kebab-case", "camelCase"] ], "import-blacklist": [ true, "rxjs/Rx" ], "interface-name": false, "max-classes-per-file": false, "max-line-length": [ true, { "limit": 180, "ignore-pattern": "^import |^export | implements" } ], "member-access": false, "member-ordering": [ true, { "order": [ "static-field", "instance-field", "static-method", "instance-method" ] } ], "no-consecutive-blank-lines": false, "no-console": [ true, "debug", "info", "time", "timeEnd", "trace" ], "no-empty": false, "no-inferrable-types": [ true, "ignore-params" ], "no-non-null-assertion": true, "no-string-literal": false, "no-switch-case-fall-through": true, "no-trailing-whitespace": false, "no-var-requires": false, "object-literal-shorthand": false, "object-literal-sort-keys": false, "one-line": false, "ordered-imports": false, "quotemark": [ true, "single" ], "typedef": [ true, "call-signature", "property-declaration" ], "trailing-comma": false, "no-conflicting-lifecycle": true, "no-host-metadata-property": true, "no-input-rename": true, "no-inputs-metadata-property": true, "no-output-native": true, "no-output-on-prefix": true, "no-output-rename": true, "no-outputs-metadata-property": true, "template-banana-in-box": true, "template-no-negated-async": true, "use-lifecycle-interface": true, "use-pipe-transform-interface": true, "variable-name": [ true, "ban-keywords", "check-format", "allow-pascal-case", "allow-leading-underscore" ] }, "rulesDirectory": [ "codelyzer" ] }