From 5169b3de7bd94345c3527b116887244a9a5b3a25 Mon Sep 17 00:00:00 2001 From: mkpaz Date: Thu, 21 Jul 2022 12:58:01 +0400 Subject: [PATCH] Initial commit --- .gitattributes | 2 + .github/actions/prepare-java/action.yml | 17 + .github/workflows/tagged-release.yml | 74 + .gitignore | 370 +++ .mvn/wrapper/maven-wrapper.properties | 18 + .screenshots/primer_dark.png | Bin 0 -> 100125 bytes .screenshots/primer_light.png | Bin 0 -> 97541 bytes CHANGELOG.md | 7 + LICENSE | 21 + README.md | 52 + base/pom.xml | 64 + .../atlantafx/base/controls/BehaviorBase.java | 30 + .../base/controls/BehaviorSkinBase.java | 53 + .../atlantafx/base/controls/Breadcrumbs.java | 359 +++ .../base/controls/BreadcrumbsSkin.java | 168 ++ .../base/controls/CaptionMenuItem.java | 38 + .../base/controls/CustomTextField.java | 124 + .../base/controls/CustomTextFieldSkin.java | 173 ++ .../base/controls/InlineDatePicker.java | 295 ++ .../controls/InlineDatePickerBehavior.java | 86 + .../base/controls/InlineDatePickerSkin.java | 585 ++++ .../java/atlantafx/base/controls/Popover.java | 920 ++++++ .../atlantafx/base/controls/PopoverSkin.java | 667 +++++ .../java/atlantafx/base/controls/Spacer.java | 45 + .../atlantafx/base/controls/ToggleSwitch.java | 125 + .../base/controls/ToggleSwitchSkin.java | 249 ++ .../atlantafx/base/theme/AbstractTheme.java | 40 + .../java/atlantafx/base/theme/PrimerDark.java | 33 + .../atlantafx/base/theme/PrimerLight.java | 33 + .../java/atlantafx/base/theme/Styles.java | 113 + .../main/java/atlantafx/base/theme/Theme.java | 26 + .../base/util/DoubleStringConverter.java | 181 ++ .../base/util/IntegerStringConverter.java | 175 ++ .../atlantafx/base/util/PlatformUtils.java | 12 + base/src/main/java/module-info.java | 12 + mvnw | 316 +++ mvnw.cmd | 188 ++ package-lock.json | 2514 +++++++++++++++++ package.json | 12 + pom.xml | 359 +++ sampler/icons/app-icon.ico | Bin 0 -> 38078 bytes sampler/icons/app-icon.png | Bin 0 -> 5074 bytes sampler/pom.xml | 305 ++ .../main/java/atlantafx/sampler/Launcher.java | 107 + .../java/atlantafx/sampler/Resources.java | 35 + .../atlantafx/sampler/fake/SampleMenuBar.java | 145 + .../atlantafx/sampler/fake/domain/Book.java | 68 + .../sampler/fake/domain/Product.java | 92 + .../sampler/layout/ApplicationWindow.java | 38 + .../atlantafx/sampler/layout/Sidebar.java | 215 ++ .../atlantafx/sampler/page/AbstractPage.java | 161 ++ .../atlantafx/sampler/page/CodeViewer.java | 69 + .../java/atlantafx/sampler/page/Page.java | 13 + .../atlantafx/sampler/page/SampleBlock.java | 42 + .../page/components/AccordionPage.java | 103 + .../page/components/BreadcrumbsPage.java | 97 + .../sampler/page/components/ButtonPage.java | 198 ++ .../sampler/page/components/ChartPage.java | 327 +++ .../sampler/page/components/CheckBoxPage.java | 92 + .../page/components/ColorPickerPage.java | 97 + .../sampler/page/components/ComboBoxPage.java | 199 ++ .../page/components/CustomTextFieldPage.java | 71 + .../page/components/DatePickerPage.java | 175 ++ .../sampler/page/components/DialogPage.java | 230 ++ .../page/components/HTMLEditorPage.java | 28 + .../page/components/InputGroupPage.java | 104 + .../sampler/page/components/ListPage.java | 299 ++ .../page/components/MenuButtonPage.java | 243 ++ .../sampler/page/components/MenuPage.java | 72 + .../sampler/page/components/OverviewPage.java | 327 +++ .../page/components/PaginationPage.java | 113 + .../sampler/page/components/PopoverPage.java | 108 + .../sampler/page/components/ProgressPage.java | 90 + .../page/components/RadioButtonPage.java | 64 + .../page/components/ScrollPanePage.java | 85 + .../page/components/SeparatorPage.java | 104 + .../sampler/page/components/SliderPage.java | 72 + .../sampler/page/components/SpinnerPage.java | 98 + .../page/components/SplitPanePage.java | 103 + .../sampler/page/components/TabPanePage.java | 244 ++ .../sampler/page/components/TablePage.java | 247 ++ .../sampler/page/components/TextAreaPage.java | 86 + .../page/components/TextFieldPage.java | 70 + .../page/components/TitledPanePage.java | 120 + .../page/components/ToggleButtonPage.java | 132 + .../page/components/ToggleSwitchPage.java | 32 + .../sampler/page/components/ToolBarPage.java | 285 ++ .../sampler/page/components/TooltipPage.java | 103 + .../sampler/page/components/TreePage.java | 282 ++ .../page/components/TreeTablePage.java | 236 ++ .../sampler/page/general/ThemePage.java | 108 + .../sampler/page/general/TypographyPage.java | 160 ++ .../atlantafx/sampler/page/showcase/Chat.java | 22 + .../sampler/page/showcase/FileManager.java | 22 + .../sampler/page/showcase/MusicPlayer.java | 22 + .../sampler/page/showcase/TextEditor.java | 22 + .../sampler/theme/ExternalTheme.java | 38 + .../sampler/theme/HighlightJSTheme.java | 33 + .../atlantafx/sampler/theme/ThemeManager.java | 111 + .../atlantafx/sampler/util/Containers.java | 44 + .../java/atlantafx/sampler/util/Controls.java | 55 + sampler/src/main/java/module-info.java | 35 + .../src/main/resources/application.properties | 4 + .../assets/fonts/Inter/InterUI-Bold.otf | Bin 0 -> 222924 bytes .../assets/fonts/Inter/InterUI-Italic.otf | Bin 0 -> 250376 bytes .../assets/fonts/Inter/InterUI-Medium.otf | Bin 0 -> 223740 bytes .../assets/fonts/Inter/InterUI-Regular.otf | Bin 0 -> 212624 bytes .../src/main/resources/assets/fonts/index.css | 30 + .../assets/highlightjs/highlight.min.js | 340 +++ .../main/resources/assets/styles/empty.css | 1 + .../main/resources/assets/styles/index.css | 84 + .../resources/images/20_min_adventure.jpg | Bin 0 -> 40339 bytes sampler/src/package-scripts/app-image.xml | 20 + .../src/package-scripts/args-app-image.txt | 5 + sampler/src/package-scripts/args-base.txt | 5 + sampler/src/package-scripts/build.properties | 1 + styles/Gruntfile.js | 29 + styles/assembly.xml | 20 + styles/compile-scss-dev.sh | 6 + styles/pom.xml | 70 + styles/src/components/_accordion.scss | 24 + styles/src/components/_breadcrumbs.scss | 7 + styles/src/components/_button.scss | 257 ++ styles/src/components/_chart.scss | 541 ++++ styles/src/components/_checkbox.scss | 59 + styles/src/components/_color-picker.scss | 222 ++ styles/src/components/_combo-box.scss | 202 ++ styles/src/components/_custom-text-field.scss | 44 + styles/src/components/_data.scss | 443 +++ styles/src/components/_date-picker.scss | 214 ++ styles/src/components/_dialog.scss | 114 + styles/src/components/_html-editor.scss | 152 + styles/src/components/_hyperlink.scss | 26 + styles/src/components/_index.scss | 34 + styles/src/components/_label.scss | 15 + styles/src/components/_menu-button.scss | 147 + styles/src/components/_menu.scss | 194 ++ styles/src/components/_pagination.scss | 79 + styles/src/components/_popover.scss | 44 + styles/src/components/_progress.scss | 159 ++ styles/src/components/_radio.scss | 50 + styles/src/components/_scrolling.scss | 90 + styles/src/components/_separator.scss | 39 + styles/src/components/_slider.scss | 63 + styles/src/components/_spinner.scss | 186 ++ styles/src/components/_split-pane.scss | 50 + styles/src/components/_tab-pane.scss | 163 ++ styles/src/components/_text-input.scss | 84 + styles/src/components/_titled-pane.scss | 94 + styles/src/components/_toggle-button.scss | 44 + styles/src/components/_toggle-switch.scss | 47 + styles/src/components/_toolbar.scss | 79 + styles/src/components/_tooltip.scss | 22 + styles/src/general/_index.scss | 4 + styles/src/general/_root.scss | 100 + styles/src/general/_text.scss | 100 + styles/src/primer-dark.scss | 61 + styles/src/primer-light.scss | 25 + styles/src/settings/_config.scss | 60 + styles/src/settings/_effects.scss | 16 + styles/src/settings/_icons.scss | 26 + styles/src/settings/_palette.scss | 72 + styles/src/settings/_utils.scss | 40 + 163 files changed, 20961 insertions(+) create mode 100755 .gitattributes create mode 100644 .github/actions/prepare-java/action.yml create mode 100644 .github/workflows/tagged-release.yml create mode 100755 .gitignore create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 .screenshots/primer_dark.png create mode 100644 .screenshots/primer_light.png create mode 100644 CHANGELOG.md create mode 100755 LICENSE create mode 100644 README.md create mode 100755 base/pom.xml create mode 100755 base/src/main/java/atlantafx/base/controls/BehaviorBase.java create mode 100755 base/src/main/java/atlantafx/base/controls/BehaviorSkinBase.java create mode 100755 base/src/main/java/atlantafx/base/controls/Breadcrumbs.java create mode 100755 base/src/main/java/atlantafx/base/controls/BreadcrumbsSkin.java create mode 100644 base/src/main/java/atlantafx/base/controls/CaptionMenuItem.java create mode 100755 base/src/main/java/atlantafx/base/controls/CustomTextField.java create mode 100755 base/src/main/java/atlantafx/base/controls/CustomTextFieldSkin.java create mode 100755 base/src/main/java/atlantafx/base/controls/InlineDatePicker.java create mode 100755 base/src/main/java/atlantafx/base/controls/InlineDatePickerBehavior.java create mode 100755 base/src/main/java/atlantafx/base/controls/InlineDatePickerSkin.java create mode 100755 base/src/main/java/atlantafx/base/controls/Popover.java create mode 100755 base/src/main/java/atlantafx/base/controls/PopoverSkin.java create mode 100644 base/src/main/java/atlantafx/base/controls/Spacer.java create mode 100755 base/src/main/java/atlantafx/base/controls/ToggleSwitch.java create mode 100755 base/src/main/java/atlantafx/base/controls/ToggleSwitchSkin.java create mode 100644 base/src/main/java/atlantafx/base/theme/AbstractTheme.java create mode 100755 base/src/main/java/atlantafx/base/theme/PrimerDark.java create mode 100755 base/src/main/java/atlantafx/base/theme/PrimerLight.java create mode 100644 base/src/main/java/atlantafx/base/theme/Styles.java create mode 100755 base/src/main/java/atlantafx/base/theme/Theme.java create mode 100644 base/src/main/java/atlantafx/base/util/DoubleStringConverter.java create mode 100644 base/src/main/java/atlantafx/base/util/IntegerStringConverter.java create mode 100755 base/src/main/java/atlantafx/base/util/PlatformUtils.java create mode 100755 base/src/main/java/module-info.java create mode 100755 mvnw create mode 100644 mvnw.cmd create mode 100755 package-lock.json create mode 100755 package.json create mode 100755 pom.xml create mode 100755 sampler/icons/app-icon.ico create mode 100755 sampler/icons/app-icon.png create mode 100755 sampler/pom.xml create mode 100755 sampler/src/main/java/atlantafx/sampler/Launcher.java create mode 100755 sampler/src/main/java/atlantafx/sampler/Resources.java create mode 100644 sampler/src/main/java/atlantafx/sampler/fake/SampleMenuBar.java create mode 100644 sampler/src/main/java/atlantafx/sampler/fake/domain/Book.java create mode 100644 sampler/src/main/java/atlantafx/sampler/fake/domain/Product.java create mode 100755 sampler/src/main/java/atlantafx/sampler/layout/ApplicationWindow.java create mode 100644 sampler/src/main/java/atlantafx/sampler/layout/Sidebar.java create mode 100755 sampler/src/main/java/atlantafx/sampler/page/AbstractPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/CodeViewer.java create mode 100755 sampler/src/main/java/atlantafx/sampler/page/Page.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/SampleBlock.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/AccordionPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/BreadcrumbsPage.java create mode 100755 sampler/src/main/java/atlantafx/sampler/page/components/ButtonPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/ChartPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/CheckBoxPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/ColorPickerPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/ComboBoxPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/CustomTextFieldPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/DatePickerPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/DialogPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/HTMLEditorPage.java create mode 100755 sampler/src/main/java/atlantafx/sampler/page/components/InputGroupPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/ListPage.java create mode 100755 sampler/src/main/java/atlantafx/sampler/page/components/MenuButtonPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/MenuPage.java create mode 100755 sampler/src/main/java/atlantafx/sampler/page/components/OverviewPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/PaginationPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/PopoverPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/ProgressPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/RadioButtonPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/ScrollPanePage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/SeparatorPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/SliderPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/SpinnerPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/SplitPanePage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/TabPanePage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/TablePage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/TextAreaPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/TextFieldPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/TitledPanePage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/ToggleButtonPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/ToggleSwitchPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/ToolBarPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/TooltipPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/TreePage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/components/TreeTablePage.java create mode 100755 sampler/src/main/java/atlantafx/sampler/page/general/ThemePage.java create mode 100755 sampler/src/main/java/atlantafx/sampler/page/general/TypographyPage.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/showcase/Chat.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/showcase/FileManager.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/showcase/MusicPlayer.java create mode 100644 sampler/src/main/java/atlantafx/sampler/page/showcase/TextEditor.java create mode 100644 sampler/src/main/java/atlantafx/sampler/theme/ExternalTheme.java create mode 100644 sampler/src/main/java/atlantafx/sampler/theme/HighlightJSTheme.java create mode 100644 sampler/src/main/java/atlantafx/sampler/theme/ThemeManager.java create mode 100755 sampler/src/main/java/atlantafx/sampler/util/Containers.java create mode 100644 sampler/src/main/java/atlantafx/sampler/util/Controls.java create mode 100755 sampler/src/main/java/module-info.java create mode 100755 sampler/src/main/resources/application.properties create mode 100755 sampler/src/main/resources/assets/fonts/Inter/InterUI-Bold.otf create mode 100755 sampler/src/main/resources/assets/fonts/Inter/InterUI-Italic.otf create mode 100755 sampler/src/main/resources/assets/fonts/Inter/InterUI-Medium.otf create mode 100755 sampler/src/main/resources/assets/fonts/Inter/InterUI-Regular.otf create mode 100755 sampler/src/main/resources/assets/fonts/index.css create mode 100644 sampler/src/main/resources/assets/highlightjs/highlight.min.js create mode 100644 sampler/src/main/resources/assets/styles/empty.css create mode 100755 sampler/src/main/resources/assets/styles/index.css create mode 100644 sampler/src/main/resources/images/20_min_adventure.jpg create mode 100755 sampler/src/package-scripts/app-image.xml create mode 100644 sampler/src/package-scripts/args-app-image.txt create mode 100755 sampler/src/package-scripts/args-base.txt create mode 100755 sampler/src/package-scripts/build.properties create mode 100755 styles/Gruntfile.js create mode 100755 styles/assembly.xml create mode 100755 styles/compile-scss-dev.sh create mode 100755 styles/pom.xml create mode 100755 styles/src/components/_accordion.scss create mode 100755 styles/src/components/_breadcrumbs.scss create mode 100755 styles/src/components/_button.scss create mode 100755 styles/src/components/_chart.scss create mode 100755 styles/src/components/_checkbox.scss create mode 100755 styles/src/components/_color-picker.scss create mode 100755 styles/src/components/_combo-box.scss create mode 100644 styles/src/components/_custom-text-field.scss create mode 100755 styles/src/components/_data.scss create mode 100755 styles/src/components/_date-picker.scss create mode 100755 styles/src/components/_dialog.scss create mode 100755 styles/src/components/_html-editor.scss create mode 100755 styles/src/components/_hyperlink.scss create mode 100755 styles/src/components/_index.scss create mode 100755 styles/src/components/_label.scss create mode 100644 styles/src/components/_menu-button.scss create mode 100755 styles/src/components/_menu.scss create mode 100755 styles/src/components/_pagination.scss create mode 100644 styles/src/components/_popover.scss create mode 100755 styles/src/components/_progress.scss create mode 100755 styles/src/components/_radio.scss create mode 100755 styles/src/components/_scrolling.scss create mode 100755 styles/src/components/_separator.scss create mode 100755 styles/src/components/_slider.scss create mode 100755 styles/src/components/_spinner.scss create mode 100755 styles/src/components/_split-pane.scss create mode 100755 styles/src/components/_tab-pane.scss create mode 100755 styles/src/components/_text-input.scss create mode 100755 styles/src/components/_titled-pane.scss create mode 100644 styles/src/components/_toggle-button.scss create mode 100644 styles/src/components/_toggle-switch.scss create mode 100755 styles/src/components/_toolbar.scss create mode 100755 styles/src/components/_tooltip.scss create mode 100644 styles/src/general/_index.scss create mode 100755 styles/src/general/_root.scss create mode 100755 styles/src/general/_text.scss create mode 100755 styles/src/primer-dark.scss create mode 100755 styles/src/primer-light.scss create mode 100644 styles/src/settings/_config.scss create mode 100644 styles/src/settings/_effects.scss create mode 100644 styles/src/settings/_icons.scss create mode 100644 styles/src/settings/_palette.scss create mode 100644 styles/src/settings/_utils.scss diff --git a/.gitattributes b/.gitattributes new file mode 100755 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.github/actions/prepare-java/action.yml b/.github/actions/prepare-java/action.yml new file mode 100644 index 0000000..cb5d433 --- /dev/null +++ b/.github/actions/prepare-java/action.yml @@ -0,0 +1,17 @@ +name: "Prepare Java" +description: "Install Java and cache Maven dependencies" + +runs: + using: "composite" + steps: + - name: Build | Setup OpenJDK + uses: actions/setup-java@v1 + with: + java-version: 17 + + - name: Build | Cache Maven dependencies + uses: actions/cache@v2 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 diff --git a/.github/workflows/tagged-release.yml b/.github/workflows/tagged-release.yml new file mode 100644 index 0000000..1d092a4 --- /dev/null +++ b/.github/workflows/tagged-release.yml @@ -0,0 +1,74 @@ +name: Tagged Release +on: + push: + tags: + - 'v*' + +jobs: + build: + strategy: + fail-fast: false + matrix: + os: [ ubuntu-latest, windows-latest ] + runs-on: ${{ matrix.os }} + continue-on-error: true + + steps: + - name: Prepare | Checkout + uses: actions/checkout@v2 + + - name: Prepare | Java + uses: ./.github/actions/prepare-java + + - name: Extract release notes + id: extract-release-notes + uses: ffurrer2/extract-release-notes@v1 + with: + release_notes_file: RELEASE_NOTES.md + + - name: Build | Package + run: mvn -B clean install --file pom.xml + + - name: Build | List artifacts (Unix) + shell: sh + run: ls -l ./sampler/target/release + if: matrix.os == 'ubuntu-latest' + + - name: Build | List artifacts (Windows) + shell: pwsh + run: ls sampler\target\release + if: matrix.os == 'windows-latest' + + - name: Build | Upload binaries + uses: actions/upload-artifact@v2 + with: + name: binaries + path: ./sampler/target/release/* + retention-days: 1 + + - name: Build | Upload resources + uses: actions/upload-artifact@v2 + with: + name: resources + path: | + ./styles/**/*-themes.zip + RELEASE_NOTES.md + retention-days: 1 + + release: + needs: build + runs-on: ubuntu-latest + steps: + - name: Release | Download files + uses: actions/download-artifact@v2 + + - name: Release | List content + run: ls -R + + - name: Release | Publish to Github + uses: softprops/action-gh-release@v1 + with: + files: | + binaries/* + resources/**/*-themes.zip + body_path: resources/RELEASE_NOTES.md diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..e976676 --- /dev/null +++ b/.gitignore @@ -0,0 +1,370 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/maven,linux,eclipse,windows,intellij+all,grunt,node +# Edit at https://www.toptal.com/developers/gitignore?templates=maven,linux,eclipse,windows,intellij+all,grunt,node + +### Eclipse ### +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# CDT- autotools +.autotools + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + +# Annotation Processing +.apt_generated/ +.apt_generated_test/ + +# Scala IDE specific (Scala & Java development for Eclipse) +.cache-main +.scala_dependencies +.worksheet + +# Uncomment this line if you wish to ignore the project description file. +# Typically, this file would be tracked if it contains build/dependency configurations: +#.project + +### Eclipse Patch ### +# Spring Boot Tooling +.sts4-cache/ + +### grunt ### +# Grunt usually compiles files inside this directory +dist/ + +# Grunt usually preprocesses files such as coffeescript, compass... inside the .tmp directory +.tmp/ + +### Intellij+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# 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 + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# 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 + +# SonarLint plugin +.idea/sonarlint/ + +# 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 + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij+all Patch ### +# Ignore everything but code style settings and run configurations +# that are supposed to be shared within teams. + +.idea/* + +!.idea/codeStyles +!.idea/runConfigurations + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# Eclipse m2e generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.toptal.com/developers/gitignore/api/maven,linux,eclipse,windows,intellij+all,grunt,node + +/node +/node_modules + diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..4f3b9f5 --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.2/apache-maven-3.8.2-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar diff --git a/.screenshots/primer_dark.png b/.screenshots/primer_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..20585f760a629b593e4e87bbacf3f0d014131ed7 GIT binary patch literal 100125 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

x&r;wSja&xIuzJ?OiOS18&U1CnuMVw@#KC&ZzR zvQw(O8cV^{KZa3NHhlnywqsTOVxO2T94~m9?$urJ<%ILfDlBYs>Mu;Fc+x;y1y~IO z5XVMQrc(Y3z4@_P_2G)PNPd8PgudMHM=v7+ zx_=oGjh>bnapm8@d-*^Pgx z>**d0hx2@NbLRTnhrHMLeoaMbwVfBeDj>*^_t?Mo%KO(P6`B#9L1zxG6t@HU$dC*a zq{oy}*G#YY^Mag=a#a`4q6d&4^y*B&79p1#DG4>RM1L=rWvTWJR4j9f&DN{4v_KCG z(f4vpx)|{`HVzld7*1;c+|Mw8i`2xWzURk=+fA=p-sR1$i@%?Mb*_nlpi=4K)DF(TWhIT^&>KG^J@Yg$_J7Lot$A5&dy~)e^ zYLq1D{7%SJ$kbY<>hF-X(Z2Fr1Yv%!xG5WN$QSuk*|N~Z;03+qxWom+`i%hNoO!3i z3%sr3`kxgn^Yh`h=l(=B+seSzKUv%|6ZWlfn*2M1z2+qR^%FE@P1A1k zZ&z#!Y>8tI? zRBK*|(F!f+t7~H(F>Y=qjy(+LNPY2^D){z9sewQIhPf{%`=W&%09y~*}JxA53k}m zKU}8j9?2@9Hk<69nmIt7b;cE??6;aI0kfE=vtRrw<}t)<*mCo&UAs$#$9AmY{L4dp z1`8+m$0f}g5=P&rj;={h?uTZSB`5d$&6i1u&;7ZqQZV~#Hyv-9_y8LO}g>rfyD zq=?(Otji9h1`}RH2pf0v(HoI(qN?Z8n!bK;~#a;+^^&Y%b^68)J zkuuOi=h}H%%9HQQlnKVcgYd5yd@u6TutTyGlCcQHS^#-wtgU8yV#pTKI|X zRNnQRbt_mJNekS`_uG^)0DuS~%uMiM5k+`O3`9oDVTcEaA+A#H?;)d|z!~uBFU4 zGG91vH@JMpq}uL1k3Bfp@t_98E{zH0%RlS*^{X2cPCOf5B3q9SU%h%&IrPbOKEC@% z`0k^gPAfTmTjAWqwwh(^v7J%tc%&gwac2i9(g*CgKFwljw_R+_F6W#K2-iO(zrG50 z+fi?#f~eJjF=6Bl!tf)#tkfDm$9@j%cHxJ-waw-M2z^np9*`|ZHhN&oIxd5(T`AE4_pu4(j?THSvi zNBwM69HLRwsw0j3MRI8E#7$`{wgGL}?cpAD`(gJ5#|Hf8rb5luJ z|4TvPJ|*s?d`L{L-7rCSlWv^8p-V$*JmVZ~avl<0{m^tXfDw8fgxU*WHIOqmV-bjg z#eQgStuh};5tF8vB4z4mu$QMAne;RM-KV#2ZPYrqwm*kxU(YMenIHa=`M|V%H|x)b z^JTrg=3yMZ79k+`I34{9+FR|0BTjn&RV;sA5WV7C%I1kpR-Z;EDzw=9T!RJqx zW~jEH3MnvFrk>W3hUT+Xj{hpk|N@8m}*QIDd`YRz~-{@l0<3OVW#EP-e^ zg)GR+drvSl;aEhshT*vMX6J)~ulcwMU0ALP43T4xoUu{>7Cdd+hKbu#ud})a=_T=^PL> z1{IFik_L3W@C|nX{2K4|vnPqMy|OZ}$3dT{x2tO;@EXvu-5BatEeF z`wETS6*lIStcLs1mbv;$)V#^7_Z{YzCwJx=n4Z3nf$UJpL~)Nn7vGw(k2`OUX!Y1z zX~j3|))dysy36!ETk58y?tS3ai^^|7=R> z0PqQ!p0a)>2_T+)LR6pIZSylH!#s(j-uQi>Q)i=?Up^MVt}+40-2*Lvvg1I}qY|5T zFwhg8gno@q>ZU!)sCL9RU(shz!JI-?0-R9bR{a>?TSe+%-8zvkwP&4ebH2hh)!j-X*-mmI8ay82lfqjZmK zttzwbI|EJGRd4LI6z`3#kHeu1_{{)HN=JGSJ zvD~YFtPMbDKiWJqhL$0=b2jD)s{^hmM7Z*g4sUMO_4ACa1TUn0Hol59xW~_KZG8yD zbQ3;CSz|@Z7r>S~T;4B2Bju-q1>J+MLc2G|=L=ee`@*MNJvT%;`cUPg>4HVcm!bzU zlVFv1v=l_KzHfNuW1rvYsM&}R2e69WgRR2o1>i|^q#N2>lNCBY&3L_-kr znu&Fp&qKl%+T1(ht&Ks1O_D4ccu|q2LJp{W9Hq%FuE(;wS`JoKj{QQ!E2T8V)~J-F z!@9lg^|OqE+84S)N%#-?_S;ta7lc0|@9;5UU)AlPoLYO9dPaBtG;9uPhWkCiVNjLR zFsWZR>8&Lla{$1&_kB9-#bPViIwWlVxY)`x4NEwBkYWw5%g7i5=)kWeq6G?*qJdO6 zuJ_}BzD$>ye&nN+3c-g}6iE&6YirDs7L;1@7o2~)V}H8d6nI|EUPscZPxbV1mPO$q zN2Kj_*51YFaZsW(c={A^_<7IASo`rHav2Ex4=m6kmDVJ@NRVRp^7fwMnLvxn=jj(> zn8sspQ;%MBmJb}?EhzHcc@rd~{_PB?Jp&}|9>-)1NEOLKOX3ag3-{d)>YD=MuYo#( z=d8g>QA&p!D7%&Ud%r2Uv0wV3<9^(zrQh~IB^xAz2UW4)Orx5*=6|`jHp^e0Xx|n8 zCp8Za`Azam$^I&n?A~|bKZ2BABc8L5)C$Ipqmn?bc!jjcMgB`Xf*bR`6yLs$DlY!B z@ndgMv%ERez}Q&e)X`)OPm`2WWAb5>Nyj)fcOU-6YU~*x`E#q1Ul=J%O3adoY&FmZ z+2=KTjlK#;sS0y0W~WYXuYBx+-j&mguVO!b$U^*nYI{x_#(RyIpOa3mb-$xDy^erV z2OeVRr>(~3{i)kPEpQ`E^uxr?XcbRszg;us zRu!B2KL59QRkFrGJN}>@P`YxB`*J^J*rC$ey@;NzrNbVjSGV_h@eJ+ndcw-}KBA$Q zrX$;}Qt;Q3Q-ANXn^@2*W@da<>ei^UpCRYWv$+m&&~pld1i7)w%f5BS?3MCmTe1JS zc==jv7>r{8?HPAKg9Q6!YeFUdW%cZI|FQ8U#{ZO5|IdWL|56A2zrIku;~zEArJa?P z^>bET+rTSoHKYHph^Ct!13U#t7>^z1?Z`1H*({`CJY{+Jh2Q2pU-ahe9)s8|vA!%w z;)TFHjqKFFH%>gxmRyxnf0Q4&>&h@DZFWfdu1UE)%ehMZWgi8QN2dI9XvPO19zayaO zy4m|{0;Pf5kR|@MSx3i>)e6Tj|9ysQU%jjfi=-OtXsBLPb%U91fUpN3qmu(v2y_@T@F~4veRZv~$!x7jP-Lmhq0lwvTKB9*Pol%f(Cpmw zY-)aQro(Y|$9|*;P-y%F+zhOoYED&+?9Ddy4wMaw;`ue6_kP%Wj;FP_G+;=_li00W zL*Dq0d{4TiH-AD1(BnfgC|(G$hGOF}odE2-n-+bYUj~w6Z%~_Mq81*ppKp{oty~c@ zUkxeQ{$v!FjTq%!m2%)I$6Z8iE{qz6KCvS#=w$KZ)oRy ze{t9o->r@)b#2&DGt{$`=IlAOM~S}CiWtDVOB&(~E#XC*V{l!N0SoZU7&oX!zQO1_ ziH&}JQgb0_&wL%ohW>1l`)ZYQ?JN(T1D!%WSKc&G4!4kHW{KWYq{TSe}D zx)Ty+H@RD}>R037`7n-WerT`l?O3KJ0xTu;}1};gcuZ7Y0W(IIQkUNt2!DjY28W0of=;kz+xU$T= z2hr52GlA=q$2)QY*7Tp@idN+AGJh#v zzFfP_rL!orio4Way+}^a@Vn{S;y#XvV|rKbr)0E)%xFM~nqFjH#b0792GPOyLt_!i z8O(z01byT(QXP)6+*{Ha!k}({(hH$YD->%=%U7~+FQZpxmsvQ^eE!1RS1Ml~*vJuC z^?XeFPu&m}f!o%+JUk2O_o?|-#l;`e(nJ7YPFD`IpMZp{&*FFR@-n4BJ1 zZ^9Ax^&|pPQig_>zOTH_Gs{%z&lAfv`WCem<9H~uznV$N2;scqYY-t5OmAcSt_i{e z)ae~}2eIo^IbxpcR8!^ef|Jun)YM>!MaR}==M7oRKW(qgs3Ah5S@|Igy%jN0zgqSY zHr%(~w{n8T7T+#qF#u9nK;^Js{M#cJpS}oYSbl!K!%#tN31``MZu@Xel?nk@J}}ds z#0;v)<}{yF$AXAZL+ppW_ z=G&svh{tS=b1Zx|jE{v_`}z0ZU{LgZ-Gde5iQVI3r9T#%xG(?`{B&aNwkpW8B5Su6 z-H$2P&;8A|gBy?*M`3|c1Z0wP>J^Avg}Iu#y6&S#?{8ocJfotX#Q=Y3N6Sm<#$2P` z8;7rXPPZQV)RdaM{q=78XP$YCTn=E3@5t`$o?35F7g?HrqC#d5mD{P#+0CCe)r|03 zeBDnMLB|V${DRyvo3^@tCFe!`D!D9HhU%LB>2a0wSE^r1Q1`uszN+#L*;y7@e6rtHR6~ zP|*(%I+VzaFy^fQ3(vVh2-1*}N99{b2S9+>5`UwySJG+l5@ca8zXVk5nd#&54T*rj ztEfnNW@=MPtbO+EnE+s2Iu+L5I&b56Jm-2Jd5^o-0V!4A?4VT{c>3($Odz=76R?=X z2F9j< z6*ed`OYcaj0*=4wIN!r7ODg?>$cncNxGXzHEwvlc!4hk<(zT65CG>vD#S^i_?wJv@z}jWq6xR)z zM0pa%j=X#(bA2Gmxn~J+7HU+dDK#1pv6SeVMw=$DHy*ea3Dgt$_E=jLvifnZbGIqI zHTRhSbW{dPK%^nMXVhB*yEv2vcvOuvuQ0GheR%irI#4-T?Rd;i`w@cBb|99vw6*mP z%_a*r+$<;rA~sX!N=TZ}u3n0)cehA~f@PdN{(TsC&v9bSEGI@y9d1;3e5uATyGq^T z7YvTHv{-e7c8&uDhh`t>yRG;BIKMsVnJ}nsPm?pwXG{RxD37QB<;4l0bd2(Uo(g3`u-++ z%fz8oEr~oJ^x3UuCH-0Ro!*o(xKqC|Ck>eFVaG*Yb@(81qrXsUeZv%1U~i(EfYB$M zGy0oHuV5!$l!IEt{WK8(s)1PT)~#E;KgS<{+^5nDpCfEurAh|XupNlGgi(cEG6rhv~rS<;$z4kowg$2O2 z^+d*86O@q92ZU#)CL1bxrp?f%#HM4Z?`-tHM!RluN(hee%oo|0&o@EJ=TexI-m|^A z&Pq2w=D%bBw@58xV& zE)u9GdlDu4HgXLK0WdLz5iBbGxBn@c``lo9 z@?H|M8JNcZ3Q_LU{YOo6`gmELq#~n^u5MqkzM!p)!lR0;rb_E}eFf zJXjr{7zFM#bmhwQnAEp$7`a)pDZ2N)#Ub zJmffjl1z-~2em$N*Pix$tfpmJ?$o`%TSas#BHw3fKAJ5WEp?`t)GW6J>Fep8ugQVc zO^G|Sv2If$OXsR!q`G*^IPkWI7ld8@+3QdSZhio$_iA<#l^*j28WkKMA3v;-ye?I< zv#QQ6F{5XFF$Tqk&CSotdjL$E8!e}-;J0buP+$pmxIWX8v3FSxH6r=DKN=%~NRFVO ztiInLtd>H0#`o_If&XY0>1y`2NjeY^dtb3obcTjxx`!t&D|;?}2`q!+4In*WC-P{8 zmLu(La%MWVRltjY-9f2=cR+YTh=;io7Ugv8lM_;vo-_-Fp!s z?%P7xFYE7@Sj{(Q>lWH9lQS{UVMxKpDMm<-_c$B{UU++e$k9kkj}YE2>n}1v@kX#X zekY>)z!rq=ks!k@nT4y|UYtF5P6F29L{i)^YWJDA4Cx~e9}>S|JTwGAi0*p#S63_B zc;#Epy9t0IbBXKzR@%~{1LO)Depxwjd)rtH)D)l^*`m9F1Bx|~p{3k;!tJs@-%UEv z7W`>%F}T~TsRm$9Er#%HE1*Lds8i?|Y#L3+Fwp&4u7txntHR2b6;S$pH{^_`t6e%kBSn30Lek9MF6$p zzT3PIV2Ws^4Lgsw+wQjbx;tHVF?*8HB+9&(*j%GLc}neVf1{lL>(89BQF8rU^H#XZw$kqZ3jq@T z_XAUXvuS}B2qg+imP$otX99&FNcad@gqu0+O0w*Rhq*6FLe_Ic8dT|`F+_ZzKIZB6 z>fBnkI$T?t(?C^qJN&~!0D*=*j?ac_YNf@Nk5!HAdVM)W&%huDPrcPWglYovKM9Aq z$9Ky!e~1AhrbCY0_Obc?uj)@H%3^VgRy${U(6&ItMy>ojToFq9O_1n?hZTRjYopS%} z6?bXQL(w5@k*cXd^ZJ!u#E#W$^`UZarc*3!vy1LKTkcVwX0a8c&mG%+1ur^!rdGY~ zwX~Mx7}rYre$jh$DmtOvMwkuGX6r>zeWrIl;zHYO*!(yd*U->V;kM4&F*ow6H_(6E zzJqg*`z)8w+?m>)-|icP(Wy@2SP37{Qf1!>p)EA83eAtHYw%6Rr}c{1lq6hcVamp` zrM!6?{%oj+w=Gp7;&}+I`wDNv12wgo?vp{b{Y+v75jy@KFG8lnj5V?-XO}}`SokI zqn&p)rTnIOmErk%rzztUI2Oudp?NH8bP7dFi_hHY^1v5%5g@m?d2E+1{a- zp0Y=59Rz&$C`YwizbNq)k8i7(`<$UIN%#({yIiV#Jej!Iu0q&(5vyl2+!ryH#CwEq}7P8A^n;c&YY1kUg&#Wek&<*TdC8k>s2de2rAvibHHCUy+_~py z@TudBSA-Qi(&W|=>b~1$Qa{^%J{}z|GjpBplix0d`Bf(?ruwY%7qN?lDpYxwSg+YQ zR}dIg&EPU*oy}s{CKph08JD>o8yXs_Pf`>5JULc-F6K}(n5 zV^#5@mADfYmFp*i$Qz_?#fyPB`jaQ8cMq{FgQC0DO;+jI5yjo{n$6D+ zjdV0|!WIu*v(Fq4GrnS)rrmZnl~#-@~x%q zO0>D$mw7R4-RY0o$k6vnafxY76fBkTHtwZCp92vw^1kEO#a)@kjkB`iPOV_qxG_?b zJR7Pp(Mr-as`O^&V03DVAXe(_2LRfLWAwDuVTzV5{YCZ3gQvlQeOdaTUe@k&9pR>b zHtBt9Kl(`K8Fw@JCObiJv1xWUt|-}QQBEM|ylJ9D1FJP}sTJQ{Igj;b1zz5lfCLb! zo)2ZZaz)3qx8l2LQ+-G>w#3wBuoF-E?IQb8CiCgV%oZ==So?H5+Z5B%&ai?rgakDpfsfS{7VU|T4{tCuJ#`4SMb%+Eu z=^b8y7Byer?K1YYDc+e$#4TU;5%P|I}||;bO8t z*+_lHLq$`vP#TI7_sCrMNzc2mgfG@nK`CV|^sKu|_rr|&-Q%WY)VTD}qY?2lu{o88 z+eW_xC-<1qEG6t-zbeO+8H9JQAT8FtGfr+4vfSf79&rol6r;^?h$=9*&ag!Ya zpXB{s<<)=*V2i5pzi#|B_-9Gy$-yRk(MOW2kGUj`vK^~M*pV016MsCVDN0F&2Fre5 z#2MtH)h@I($KvIp0|1&j^L{wJgL$j~(NoM!Av1ld9_c7ni$K$^`HVcX<|4<7SJiM< zjg|+yeCA7oN3E{jqHa^GSm|kL8QJgR`%x5cA(UD|yJ|xF1r-@c^} z4-bFv@F9=5_y>3L`Xu6V$aP_X!vVU(M_B0tlss>ZYo$E&@sTD5EMLw<*TezsuFxeR z2~TbVWNed0;yd^R4b8QfH)68hPw@RhmG$54GxYJ2$(|cSW`T{Z!BXJ}AMe&uECMyLSk#AIaTa;5ySQ?`)e*%-E-%s4 zr{lI-A%cSa7ZkXf$7)!wUO8bu%HCXLPQ%*Ja1x3O?P)v}D3ebXHM;R9aQ*VquKXT` zHs&O(EAl6R#10{T?(WAz>c8P(we3TJJ2zdwXWkzw3%;xO}LmXXALT0ghXtXhGilOn%Unt5@DcMDQspK9570xQ-uTdV2HQ z2GlgrQQhS3u9UO=NY+Wi=!*V2Xh6W>wF@^g03f1y9Tjz1STVIaxcji;vF+`)B)PD# zX02}yWq?F)N%7u`owW#HD@XR^9m^kZ!sy(%a0;Z_hc5BUB)m5?n}>?V+vm&w`d`;MAI|eZA6Sbg#u#(VF~>c|J@NnQ4cr8diN=plorw?D`C%aXvQyh#xob6TLPlp?lWIDa9?pOr;Gk0%7ZF2;@N3<)6Q z&$h)^IDU@*mCN8=&yax3n#2kejD+37}i!D zxIwnlZTkcP6WKWC**d3Q$y8tWa@+SdL`yO^4eL!G7;OFcu=eIhn^*ULlw;WlQ?zXC zxX7waOY+6S;f|?s! z8(J-^N6&C@TIXg2k0)ZqwEVAqH&S%|tTwST^OIrCsHpHAFCis(x)MnUT6@cY6&h31 zF%irFwuZk};k-;aD8T07(s7(+etSlFf3i5_0*BPZbGX=k!LrStKiU)KV?F)qS$k%u zPKFPpo9e{4zD(HUK!K=v4#efEz1PHsXJ;s@N>jt6Oq9)+FbwHwhV*SrLZfdwNEC1v{gJO$qCZ zKOU>;UyfAJTD9g4ouQ_YnUmtgbs8IRCdDMVIhU<=WZ1$I^v`MM{A)5kMs&YfAgxF3 zV1=P#xwkLJ{+>zXoS!K-N3YNG%s{uK`CF};B~seb30&t1?YfZwoFt@EP_#hB?yz3N zc@MK(%ca9h7!?P2zjo_QE$;wa8X{1fquV_=$nk)=t5%sBJe>dZ@reW2SO}oy0ixEi z;Yp@=A2(tgeCi5OESVx!Q{O*dbTqzGU1USX;T}y3DqxH;1f8jpXh^B@MbK)!w%Jt~ z;u6U}RFsbKGIUkWl|xec#OiQy6v1x}a(C{;IKRb#kHj0uu@|4L_hSwvLi zSEAdg-AlGt&;7=1#)%!028jg5DY@)>eboL)1P9VoaG^EqY|3@CG3Z2bhw&2$_LF?F zk7L)KH8tom!(#EpCMT3slnC`o*wVp^^!@quXf0-4ZvU@FMuiDSS_4QU6W6Id)K7ucsaz^HPZD6cll~dNvzt<9R08 z{9cl1m;wIc7&~6AA6tJTppMcC^cCr3MFg#%0ctIA+Yo1Nsp7 zG5y+-;CsK0F zOJhDqSy+RW=FeuHA4bg_Mv>lB#{W_&X%xvg!ZkkXm;z2=x54q(eYY^zSUw|O5cpV;wh;_*e}D0! zrNKU`yWcjgI>3y03Kr%j3R`vZR>6O@>cvZ?-4Zay5pHFziFUKZJzG@2%#>j>I!fE? zhs&>pAD6!);i6yJp(eP2-<|W;QD5VlO zyUa&lmowVcX+%MLy9Xr3|HfGU;?{b-#M^W`Q*)ekEFUg&b zQUx8D$6$t^O{p(lw-2*YMm>%kjIF2d+A|Cp7$oNQ)i=%0^Y1nhTcrIcLJRJuZ%BfU z8RUPfv#-nP%WC_*jZ!Rn%l1TBRMT1+$bOqZiv0!7KSv(oKU(`+!w3&j_~$V7eh~dX z2m5q~PTMa9_&w4KCfEGQ}e&AE#o+pg*e$ zfPoBw)he(xHp|&4!vVSJ)Ow{3PMnCb;OvAzf0Ab-c1caor-XkF6HvN_q5<{e@OLdc z#L97bJP+k(Rj@B;<1?7yI`7Z4zJAlVe@w)yW$%H*eaDq7{nzoybdv*`WmwSV;}FLe zINb9OW5Cv*J5R}4d^;e)*345X~HSzRjCy8ea)avLaqW+I@}MqEbly~@l1 z-2EL7pZp4R+9R|AtHmIC%My*@+pAGjK{ej8SEj3||64cqnWvB+9qyjA* z@aC=DV~68jk-X;iVHc;?Yy0eZw~LsRh1|N;^?bgPb#m>TMENXP&~eZsQsriu;dz$D za&SRv$6a0WsX`>3#o5L--?fWvHG}R&QU6YnORppeBz9!_`KLzXRE7w@z05+D za@E55;>_ExqS(EQ3SD)8->3VJ3!HH9a_t20AtbaDsk~ze)nUR9|LUB3tSI(Ml=x~b z)OaO5xOQ%Wcd^6hDBV~6oipg&>FN2L%o0>K6-v!pur69X8P&YtCP;`nR(IA}Ry%Jw zxHT4wujLYAAc-gU<;$I*5EucsGk?!S!sS7Hja-oDW^vzWL`C1N?**E$8P$|Ar;EM8 zpv0h`UtS9`fYtIJ#y07wJ2(B*{9-Ol8N(ed%aW z*W7GW61cMJYp~mU8shFBzQ6>crqtzH%{Q94 z>=1tC(BNaZp(!jPWLH0b$Z-?vDZOtcdFSyc$!3BT5$Z&CLh0stMI)i%H=6d*=~IPc zh1npKtB-cD=dyZZw026IKEh_rQtR{fFZc>S+b@)~k$7S8ZO5mgk-iW#f%C4cbMBlF z-#%BLXQY>vaPcw1rx;^dFONLjGr<*fDAA}jHd3X}eb|#NO@^JM?zVYSVHP+I1G^Ri194Fvc zV@<+hqvtv0_B|`Oy?KRhLn-KF@1o-32oy_HJH~q!QFbfdB@T2(9W-_9oondDFlh+6 zxDXbp*68ddOnjID6Aw+8W${Z&SyYeu+~9>G1|L=To#qf8x~L1w%3ldPhOLS;Q%S^~ zbW^H`(+T^AT_5m$4K%@cDixf%$XbICXVl&Ov98W)P-&Rzp^6n{K5t}(3;c9Mqi9t< zV!^RwVJ=sCv!3B@yW5XG*VXzx!;9sYppyH|iMYnCi8XIzyyX2%dF$Q>}> z;8^ZBVET{{q$;WX6%|t?{U)dUcdUBv2~(5M^*6Q{CbeEzhUigyX3meXTTPEGWDbkl z33#nVgQIfM$nIjQ>RU-L3$2ZTXg7k#*eVniDg2kVzEe!%Q!2{3)m2@^z4MTFiFcr* z1b5YVth+sdUwW1%QCtFD-D@uc8MtA`o1AE0Rdn=il3p)-rC`^B;*cASLg)sMF1f7T zAEH-!m?4>Lc23r~2wCwB65E~<)|a_|$$4dIAE;6iSMzPlkLmTyarw;)UIki&{!(|H zzj`Yw`No;w9uPOO!yDrpHRuq!rIusOtS74<-TgmPSvK)OatU}7iiIFyKl(id?x^P!(;L4OwojbZK z4zb&8>}V_Ea*q?LPln&9b92*EP~7gpJCFJ!WticysfclRtMu9KaHNgo#ncHpCF`#F z3+Ck!zq_4Q2F=Rww~O$l11fs@-CFMGe=_W3E{BMq0SvX}Hr2~;8;e!KWabyd?fkI? z&YM@SqPobuepxl&mrF}0f*jZN#|K}|^QIjg1u2U6w?TTqrZtsDLj2ZT;Yzut{CbwK z-U&-{CgbAPtGAuqxfMbt6T|I?`@f^i9F3EgZLa=G60LZh+tFoQy<{_Kj#Ft27ljYG z@G60B^QTqRx|kvDBxJ&$Pm0^w1jkZWX_=_&C1`@F(WvbRRMgzHRuFs9FlD2vd*I5Z zelY=}=|UKYoOExh+^!6QBFPvSGVz^D4TpMZ|OgRtlsb9$BXI7Xus2}MH`yrB3OeYDv*8~R2S9yc8DRnQqh!kJTUIFN{I zP&Ha6M*}EZ*1}?+#|~#(G|-}1q5SyPEaUzxXRH-!B_CW4!eefQzh{9Tz|d^!DHw*N zF7WUgHJKQmJ<2g3nAv=pbGa!e5Q5?iUpIEGdRJkc7@16Hxo&AYT;d^aouAsuS)gG0 zR7`?waP(37FDSW#X>OGbD%{nay<;b@woVLI1?^vE@s0&~7ccaedTsQ(A7|o(GOT&~ z!fKCxK(`tK{Kv__$zZU9;~d#^N=pdCzBN1c+& zIZJE)1%btSJ3Fh({c;P|hC%giS!yzZ4=>jbq3;kVpQ&C#F~F?hDomsi6JmHO=SE!&2A^q4lVAUQE1 zu56*Tn4S}d0tM)8+H-h{3`aLjSdUfE;ylEbL9C!u&LkqMdA${%S8 zcTXquy~qJRxW`+By4PfemZc}Rn{NtrP=ZlvE8X4@r-aeGUEhqo`en;RVYrB|b@*b! za+{niyuzkA2srK4enZ3A*YUOR6@Tw@?W-(J*=L{GLRfVKJVT`KA482A{eg+OE}Y|x zNDa0;oALgcjB2}oCkGrC>(XGR?+xd$ZA(!*+d&|E9sk}>e&sxx#V7Ut?J+)GoNd}X z*QXQPw$C@Lt>@9})lc579~z^hP=&aKY9G=;pPGdSL%0(AL+m#Bu95q7z7hl*&SH5z zwwoToABvTuDQRy5#*zY|{k3V0M4fRU-D45i|5-yr`u9K|eqXQ4%}--S9x9&-sIv2_ zE1k4cM|bx2n*6z2v5Bl5SP_BJ0dq1!LBxWIz!78p@o1&U(fk*JgGnE3zT(Kyc=fR| zHMYCl4d#HkpYLq|6Rduoyi4&4NZ(eO!wLM#9~fDYlqvD=TYILrx>FkAd1 zG6>w-r1-8bAI~vz+SnYmcXZ&AkzLM!q=Rj_N&7>re=+p|=horNW5=A>c@@i;16$i0 zv5(JVmE27{c6XkoH1Gtn54A7b|CootdU~?%iD@1~V^`PD$SvF*mC&;snSdHSZzo!P zlWDUPnwTL`UJK6#E>?+3@6rw0@^nx+h#B4j3cGMj7rim$cI2Ji)ysRCaq_JGZ#{w5pA~^j+&1XqNmXpk|_&Kd{DXrwL!p6Q~ zO9Q335hJWmVm7d(d*N2@3zIDI=gVxL4KcB@^>}A>OC~~JGRxbv@LSnM_Dv9@)t;n3 z*(Y708}#C84h~OSaeD~iM$8h%3qeD3%n>e`(fVAfO~bstf#Gor9+Cb7c#wj|TL z^UlQDt7=|^%asZ^$mDox%G2bOdus3tY2*K8wYmsINXLaoy|DLtr&Qx*H_)Y)|0eX8E&9l_F_a8I`W@h5W z3K?wTm^i;(`aCYLDDNH`Iw_&hc^7Xy{^qH-tlC>&WaMa0Q+ zQ`Y%Pk@fmDVp&`MtRU&iF8trM0P-Y1`e4*_bQz;D*yO3=#>P*OeUYa>Nru%QwCy^g zA|ty@?Dv^g=~juNuF0?4HuUrsZc>%$P_3-40>V5BRw|^NlkP3@;|)Ulqtc}>-i3wq zj(62mT=eX3_OI)kOWpiu-n&PA+ohDL%GUq*lgR%s)^L@M*qK9YB!ke5u+Q8H%t43^ zeQxcp(mARNImthSy~O9v67Nq1;7@*x_`FU>4E>cqCHT(QXVsC!je$M#HF`~-=h}Dm z=ExBephS0hbx&}(_HQgZJ$3b zM&jK2hT`5-nN$*U^Vi`-4|f7CBzwX!?|=;pbK>pq-@kptM81Tll4I8>)7Q@LdoNB1 z-k-8&OW(&F9S3%V>d^ABZRwJ~*&R#tEF@~SU{Ek3o%ns- zN&7KuX!)!*OwAr?QPoPphBr*(@fANGW7k)!d+WH0&pXT$FJRIKUl$kQ1ZG)th$a2> z9opW@^TH;n=DJsdfhIox=tyFq9J)8XC$>o+JbZZ5WW$C|#2pir^!ZcYBw|?#WRUvRE4G)4Gv!%9DiB-l zj*gC3)Ep~6)vRc;KOil&Usy2{5P0k<|M`<&Gua*plT@j;FM}^mN)g{#Ol;9vz%}93 z4Nmtc??G3GV6|t+0e*5>&75dZRE)lnLAh}&6R3xKQ83ZVu4hFlAn@BZ7B~<}L~2i^ zPxiIn>cTqTc?r?S+GD{&!-8gFY`*4u>2%f$ zb3f^TAG$&aLPU!jmhk|KSEoTn@meC&J^nD9+vBFpX{gw{OCet1iddZyAJo2erMjjZ z`aj`u*zN~HDX4;DExPfhHKUZ-pp!cwFS?UCtBbMjK})Rb9_7GD7_VE8Zf5IUSk*YK zP|_}DJd7u@i>%g`rnD~Y()DzW=W3rKqmy<>GZI|wH7U;rH|U_i?iBYTdKsfm5@^YtJKefqv& z(!w|@>a*wmQO-KZ*#rK6ME^?F0*F`STWi=7U}_lL_Fy!!-+zV;=f4kb+J(XH&)%V6 zLB_Rw5^pCq+z-!*&7t*Kw)G$u{rixYE23>=H(g5THnYBY_`A>|GB;6D*KZwKN+Zw51cVyFI?DoWbH`4Xj}u6#J{P*FszOP@Wg}o zZhfnPo(mvwAD#15WCzDo?{nO(9pzm|-mx6_ zpsv;5plEaseyGQHe~K2|Xo^0$q3tAI2m{2TbjB=su<3u46&PQk+9B`uIr_&?Sg{ z{Yp`w#7IL|LCFbl>fj$uRXqrRCNH#AyJgG%%a<=U4JYY;D67pE#5Wi<>dvndS>pQ( zRhynWWkC~Aq16s(nqhu_(uL0VXM5_|3lQ=l@W#eDD$&q^TTdbjs8bq{8dq|tcXjW= zRTrH?@e#_z!HzOzM!J7UNJhV*-u`ZUe=>jMbS>9@MD1^Mcpl%k>a5tCFLUm zDx#H#jCB?!tLWoUd3>C!3T673rEpLbgK+}zuWhiJq3LWvG`N1&%W25JTbvPc`xk-Mk+T$_@Tx2UJ!f_YwPLkr z`^{Ge`w6MBVm1;i2-K2A`2&IDZ)D>CdUK`#Qt~O~^!*{O;PFFQIky$`HiG<<767au zcKcNW05Q#~N(%Ak^HXydOBt1xW1&xF1jIggl3@_P)?p@iL;prwGiyX?tm!5prf7D! z-h!9XJtMJ1((1~0ntRojSE(DgETOYTy{@ChI69dXHBN7vZL7hXG;2A)a z_kQcNy#fdr7*{jy#!~zdW8diX*eMwNz>APs8x&$<-suzvPl%k7__2CC)pXObt{DID zFEFG4;0{yx0ITRR&$b!Men2QW0Vc|?Q~;_NALhbq$)PffKEq%Xq>x{~Y`Bxnm1|<0 z7My)Ye+4=W9v|Df>}45EH=0l(fS%jd)uU3Kc~wxkrV<$Bkx~87eO;(r{}?D8)INSs zl<7X0@iI7BzZc(bf&ehUa6s*0f`w~kh)T4+_3YaDd+?G&E-({0E!v+w69P0~CfLM% z;O*V7j|3&4sYHzd;t&J1lYF4B@F`7y3#ld0fr$bj7nZm`{)7VY;W2H@KWR{M#7TAj zg(v}}s8jo|f4^oJD3twRPO``A_(z{DGBJ`g2@JZkr2lKtD=PuIh)Pk^b9{1#UPA+# zUuwA0XZLV)(F`0jd$wv>=z%Jev~)j!*U7HJqoX^D7abq_W&I?iBElK5BU#U^kQdKe z1yEG&J4GF}6IwDgL+g`Np$*Bq-zOiXe@+`@d>6JQvi=8*?3t98!-2$yxOzD4e3zzb?Ktl$n2&0qzr=Bw6Rb6~DX0i57&MT!NSEG#3? zJUN;JP~#H%=E+2TUUoFth6fa}eQy(UpsZtGmOp?GErC{1R5|WF7xVZidRHzkdRuuO ztu>KN_lU+NZ{YOD-Ks1BGWgFS?(u(&P5uAFH2)vIjYG+yAv5+wDSM9w%Cq?JM<~M9 zoo_*z?Uu`GqJ86O>jN72uY-Fa?gvtpN?RzX-K)OvK&}xE#I!Vmq1Hq+xH)`WdHakk z@pB@YWvgbwP&K(`+s@hJoPP_t+a!JP`NE1?YKOO&kuEdA+v(;K05!Bvvhw?8izbz#6;w3*9|j=WUPN*WGb z`3XK74nl6^5|SOb=i$fi&@_ppq2HXar|LNgi8sovwqg-pRUb$eAacrSMs@sT>O=~k zGk6)|rYWjyPltx}J}s88xO%&+%NS~xK#jLVnknJBUj z*ee?@t?u{at~JCyEt)YW&?6+Vtb85x+H{*$ccu#&to0sL;u{P%Qqm3ZM`rq1SdygBTvi{Ie z_FD4?^y~V8+&}2Lh-ov=SLYzhIUEEd6`bluBt(l2Lf*sLWCAHXfUHqioL$r=!`iDh zMU{VuBD``UeDr?1yu|;r`0p{;stwel-?frP?!dCs>f~NRU&wA23({;mWeSwK&ymq3d_TtSS^>HiA(C{Wv-4d(ZJ7iQR3B zEDx;GqaKDS7xZhh=`bfCXr&Z1#+^D;v}nJq>%-PfOqFmpf0xDW)-zuf=;LUl$EH#m zyEfu@s9{fjLyJ=uf(UG^z;?XidpVFeyMgaPh{%bK7Is z%ok(RPc5c{Y>lUXliM)V>s0#uYH*A8A}aj15szayq#r8UTcbKd;)MPLn9ROSV<UCQvt8P&b|o@c86UsY%U}XahJPK~ zp*%Kr$gz;9Qw+h;TId(oV2|hyI6+87q5p6$SG~p!CBlu8^ij!OOp^|Wv>J{?GSjPf zO@s(}eN8B7Z&o>5l;qVew_!_X&nDAwSfmEi=#7bXM&$o~20F7bKGlon2uJ)ywD;@T zEklsr+2qVw_0M`0;r< z35WYxoZ!@IWn{G>EyIn5jCw)J^W8;}~hfcct#(a{31MP{KSjeleTmBt{?uDkuAd_5v`{Q}G z1>#G)KKDkln*SQo#M}M;oCs=`L_u(y7brg>hT}xE$_92Yq>*0Qoea4pw?Cy~ux8(){0@b-1}+Qrgx7 zG_+D&0#W;-Si>2z(Bc!BcFaPeD6b6GgN$ThG%p!*a+d7c_iQ6mJVAW?HNrknUZ5Hf zv!QULJc$t?}v-Q8_@oF*}r?c?jaY|}7PVI*T+@i4}^$sdZrx+yS-+K<7$6G+VF zhab5}2GfEQl&%P9=|J}A&S`Nur_SzsV(3*>`t%OBSEo!%TqkSKHY&=u`I+@q$sXqqEySUQQQt!CGUocgI3Y0*F zW=yF-w(J&M+PgX`oDRscrQ$z>?HHROMkNcUdro9FHa5F6t7c5yL#QtW7*nA8^+C6{ zeA(_7q-{*ZAI1!&RH}4eR~X)Zf!R-DEqI~&wMiI@ztNJ37t+^%4%#G^DtT-7iW{tX zH5zY6(GW5-EA{&wrU0)|7wSP%A6V`k;}bq~!vq9`aD}HhitHAFp4@{2<)MuFAqr~h zpUYH?ISz>&wftn&mJ9t@W6e2W$<>T?We2&O8@rE)pHjcT2TfIu`}G%^F-%&b`XaAt z<{j_>?a@Ockx~d*8;IF1w}Y6x^_myH*euNU^<6FIq%xad8nBryB*7$OkH?Z`?(c|0 zs6~T`Bw`sgX39M1=wcX7Y7`s`Jwj@4ZFy2g;ycjr%biDrKx1zm>>MP0yUa>JnO$f2 zZ{e+l3>xtD)v2?c0tZI2zC)bY3c%GL*cBU+J5H24rP8ElIs7tap4aJkzGhLkB3g0h z&YCMH|KiOiKS&8v+VVV9A!YvMRd(wxnVcs-&c2#(jXxTl@ZZ@jD(6o&B+w2X_PG07sG(K>2#0qhw@MS?Eq)A zlaoB@&?Xqgud=dUn=dwDn8`l}U+)APeKwDGb#$><4{L*txXYz^r>*HS+yD&XN5knK zB|*VBVA#F(pVm>}$NKSYRlsj}n0di{gC8JkpBx=I@Pd31kr>lt7EcJA;E?+}@qw%D zprN|mLiKzg^fzBUYqxEDNbr2axfv3=)Bv|d~mHkL50yEc;%nagGRcvlFM3WJSNrd zX|t|UAGLn-sooPzsJpoty%{RU%GM4ZMT-&nH+a3)WmmI18TZO)Pt01IFk0ILq^T3z-d z90Q*)>u)lr=~hBd4{{Wx&zcYR&TTF0mR&_PIFd}{az;zPQWX>N&!#%1cVT}%AOurE z#MqAqq_t~!D|j$&z!0z^{wX2m(5{I+neAh;=_=x6y}QY~KR>NxtG1j82KnX<7eT~f zSbq!qIOqY>@;nD6Ok-C%*Y*f2tGJJBzYp9Wp&GgiCWD^5u}Tv;O}AAkPykDmbnd5c z;Ua%VGK!U{=QJGTiR;XnuMxfg-JQE4 ze%8fdoaz3<_!Ycv430T!#u>I zT-5ZH1{6ZyD+8lwaNK_d02Q++t9(Px58s;knHFo#)tp7RL^FEGo$BVM_nI6MX)lzb zLBlHr{CbJMbKZ-oFNU51bbyRxcw~&bqrVU&q&;^?553?+_e&8|7^2|h^b;d<_BN1= z4UdcK?xrhV3y_dGY3(A%ePMvn9i4y!Bm(v;K@gvBm;(1ue~$kGbl4u8Ve(mNJdeGs zW}u^M)2TtiCM5iz?97F56)mcR64qTf*rZr;9^%SdqU8n1$T|aG^eH#EzSx60Wr7(H zp^%&H-F|8QV257MK%W7i+5~O2K2K#nx9hU7?)VYbYV1FV=obF>_S6Q~herqF{htkg zg=2pb7kUE8dy-o~`6gYv<v=L6o2U6ckTieQUq5)2J)%zvJ6T;_d-y-V2vOyB&Mg1a>oNKz=>4%S#c0}Lf2m^j%XGkl}DgLLTNo{5y1np`cWNOWe#h+7{-YHY(=%-4fDP+hB zUkl6c4i$6+i8w<6fZ!9a@4w@PqOawIW5y*s+WyK+TCQUY-1zw+Cb=5CLxz#`5wqg8F=hpI7Txet8jV zP2z&vA~QnueRVYG*GU^QsoP0uMF6Sj=!CT5R4cXYQ{B6YVvh z(^M+5Nd!HUf=}%Y@F_(2E9|;3F-f_^q33&XM^U_5!FSoU} zAh3<4`HKZT;GxiKsh)b*RT#aURP;FboQn9q&nM;^4)e}bAvFz+A3zWj*i8Q1kh_bk zn$mt9*;rVKiA_X%Kbpo1Zts58u>tEe)fEH@-obH`F&iEY5D~DORwaC?cnW;`*N#T5 z^mX^!8GK`Q)$~NR4;drc6{;>?v%JoHFK8qSPT=QP?!iR-Ki7)Xwruv;fsC$+fhz#p zR@u-pgv3oNFTgj%cA*u1X2lJR##i~~W^TtEpl;@C#8*)L>}Qeh8d6hkB&Y& zKY-#ZZ*)x88=$Gg$FrHtMhy^iMnp!2%#iS<&W5g$k_fo_1CpoXdq24D&AG*C-4))- z%F5;Km<$*%3SZ#I@-Tkd141BdA%DT2uB-U@MR@I41m6|Hjzf_P#rO z^;uIAcTgEFHH+6sSR<YxQ8e9*RYbX0;Rs68{9)jOe}1`^_%b6IFS$)Rn2SVw?=s?>Di zle+-9++v&%XuhRD0aplf%8^!J9Q^LGXtO)blAe)4$fy5?HadS!S!%ayU!(ctzS2Zl zQquXftjpzcL@+WkxefGab4SNy?=qT-o12q_WMoK4O2Rf?OJ4S+lIsBIv)A%N{s|oL zyt$wEc-5`TOyLj`b{v2RUek;$%uh)(rTb{L%ReY+HIS|ZkelbAGH69xym*0UvpM_$ z;Xwy}V;?LnF}p%ZkzTsooD&iAZ=bmWw$6{!7S(ovv`Ncnu5oOhB+V8JpSz?p2(g|yE=8(mNdlzVGn`Sj*Sy`+G;nv6qTXSJ!oIy*~%@5Kr2AH zx9N7p&OolH&gc+wD)VV2Z#j%E@zFC}wG&uP#no*y`3Vdz05{}cph>i@Mzz(;6(($*OdCDF%Uv57%Y(p$~E{N9C(;}o0+ zcaZA=vDz;{N9K-SPo+d|(H)-4lFd6-pj9ZF+F?N6C$tDx6_H}5Y3=ZksZi{so9Xw9y zo0xZFHvA*`*=5J#=Yo^haOR{@4DaGep}C+hHhbHaeMEAyhUF;6?OrV9Z|f%9Yt~PJ zl7kYZ(fB`t7O_%?#4I(7Utwd(h*wilVfRHviaG&4x`0mz@ zMoqx=^a-SRr>7*5^N~@?&~t=eHC9=m12OZ1)A9M~MNeD zwrk7>jaNJff_J6WZ{RIl3YT^$cP!)(>}{y zfW(qG(c5{pvuWG$;+wL<`1#-W{O3;F1ycc>VH@Vr700wGGZyy|Rz}n2)oCNf26^%u z<8it2fV!gNBd83ZM$rWv2kZ6wN;Vo71=DqQs4m>FAtOBw&@E58@m#Z1wJ453=R;X} zuUpE*jLd`Ye-JlN0q3>@AlwC^CWh-=u^y_d%p#s?&5VD5368PZ2qnj%Te$5r4Ff>U z`dy6dCg|PgiuHl5>EBd07s;g2N{XL)pVI5#C2)p44XimBj)+?AdK6Z0%r{h%`p@;j zO;$#YhXZQd{N}|#hc{yF`s@w?uq-rudIW9wy$8C-5+dMB7tz%<`zd%OKl2gs%^Uic zj2xls1A4=zeW{oSt6uQP_DPGl>wP!CbcPtzArzJ}#ca_jc(qrfHB(2WQukzuoT0{j zW+<2p{tPb&xk|My+|6&4mL&oZAN_S&(0jtS_}@~M%(yj|MLHUY)jC}8BS*GuNMf-d zYVcfq+9F2Yuf2V`<$gc$Ih2I^j~IEQ47gX6MiN*ej2u+o_p6kKV=W|h&dpSOpGCB_ zvvpbfrV~sEe+Ivp*&sj{1q*{qn-S0eJ0ci8|D*A4{duR9b9_gi63F26^!Dnu+j(V_ zrZEra&<>rr-@N^g7AP1)TqB*`OfOeIgxy^1;hs(#Ry-*3yRKLm8EpTX(=b;(3-`>- zhm*Xl%%r7nZhoLtxD0B6ut9%d&qW|;_?&_QC24TUWgPIh_v((L4gFRGeawU(ETxOf z`?!bj(`s|MNfAw0o#OqI9ffg2n zTy@QooViRj0}@QPENJeoi(>VE={4PweVTg#?7$n)=6SELD10dPUxwv>o!uJheA7pT z^;Q^Tl-vM#w|`s2b|MPziq!wy-Ct7Tnbp5P1Wz;mNTTuSe_1Hnt0U_Fk(3BSczfc1 zuH}PWmDZ}r{zAwf?e~OffGJ5xtG-A?``%z)d@ zIi8R@%J#}MJyCW2cFzuK&-6p{)nt3G4k!(sF>%VQZH(rF;F^(YTTTH znj@z6^0BO3=+xy?@7eLF!w)B4eSPQ>O`~QBLYgK>H+3!34*go$Q{2t+Cz$C#uT;V; zY0|uM#L|ithk9U-*0Fv{g89E>p`OJGS zHGCm|qGuCaL}60{-#pxo#z*mOWBWb=P`sn#W97kgKyK%VzF{U^gT`~Yi-@WedpgM% z&qDKV#6L}jC~{~-Z4moSxsDbUGKVC9Q&s^gnHhT(6JrVgdM=9M0)2ap{Jr)ISSDlW z0GLmLhBSe0(kUIBL_sVQ%l%`dJFl{mhr8^gc0TEoWSce{Z6aerwF;I&?&L%#M+wKz zH^No>vgQ@_z0?#Sm$U6KiZPgiO+HWTnYbKK8oUy z_Cr`^>wy+2dE&=5MYU82(3Z%@zfH(s9JcwpelEtCi^%p_dbPB_85N5=x5?%Ws%_(Q zb}>y!@YU^vheer?ziamI6fTbOyJvqJrkDCJXWYNf{{AN&PyBx~VAYoaod0966s8{r zhP3IyRn#AuR>U7R?0>)|!}QK64gcedb{G@&#`R%V0T&XP|J#)PQGU;?O$~FH1gtNi$E>+hCx>?JmJ^(c}pdZsQ^&^5iF{= zWCIcizP`Q&t`B1>o#J2P0|Dg%9Z~xp&o3QzoMkcU6V73A#6#klkhXN3^w zswq4^Hl)3~faD&z@69VR5eB7=u3b0Mw3`BizwkAhG*UVG1y!MmL!^@8I z|2?J=(%imd=4u7hY<|sPx!A{bCOJE06~Xj+gb=NX^?p|jj+mxDU^*%m_Sfl)754PZb#Ef~i+mM+x4+&VKBIk_d?S2RD%`GftQ&>p3 z!ZfQ~1<0>9^KVm0U-(4MA807I(Bg8-<&x@NXpZvoIDlq^=2iI7sIx(2tvJS&kMl7$ zD}?tlawJ-%VzDDK74K~uteikWeNoh}4TBh~&br>CmvOU-w%DqGN(4>tfak)BHh;Z) zSs0y==QODu%HUy@HLm)}zZLsA>gFVbw+6h~;h{B1Uj4Z^X$C+uje=NMV#{v)qV?DS z=UAN`zO1bDA$U)~>EK>{2aQkS@rF+<>jPev=7z{ z3e=n$3~M;y;*Nb+(sWDyxX7e^Q(bi0OqDms)dE7%;e+#g02h=|x$vH>59S@;YtRB3 zp@ zah^;6NIxQ#@R*DftV-8eSiW@$vB?`r`;$9g;uJ&nUG3|aL?+^KS5V13ecXP|5sy38 zxgC#D&Nj!XWu@j*&m$BEj~y>zprmZ-tz~2KoT@5(Y0xZK0jCeYX(b+%LJ!El0ZXp- zu9{4_4aN^gt-^j~OAU3Pa5nAIJM&v3_nC%t@@Ku1?2tKrXXZ%iW<29&*raE0BG=Op z(YE?3v)VExE9&NZ!!K_7^7>0?O%7y&j=>pX zpt6?BA?*~K!x^I+8`VLNhzYcs zRQM-GhS-qVqb{OkX|ab`MSq%k7HnFhX<4jm0_3$aS}@Cr2u{4c-tAg#3<64nFEyS^T&^Jq^LLgE z(Na6HcL)Va#cMaIc#*^TFS^36#FC1%8h(~E-;yH$Hkihf1@zNv?4&_7UTI7cdm1Ip z35*a`saU#V{f$ul>?W3vGeznkCNdb>*J$tPLYeb@|V2s-u}$Am*jqJ-==n6-;GPKsWN~h zZ*K<^ogXW|xq$n5`~ByYBJ*AAY?{M{+-6fcow;xsf2~ccbhW;G52;TA%j-|RVQaXS^;M@dt2|w%S7-h~Dv7ks{9lt6Zx7ZFd+@c6?oXZG zGSccE4(r^OySuzZ^bl2d=Q9lQ4Nc}5`K_1pzA>}bhrKnmyydI?#t-{ee~^<%^w%2{7ve6pKU5wVY@|& zWf4RO_ji4DFAzT7DXKkP{pl`r>lR4tw=;J&)ob?>vi;Pw2Gudi`smDc*i7DDa`^ZV z17()eX^i!2p8`YGD{`lkGgn?->2Cj;AcxJR519LlLoHyLdH4MaUHsF^!_I+@ZRXY9 zLt;VGwP}|L69wNbwd~yn$ykT_LlkkMX)ifej!C#m1&u3b0}TXO;eH+cx7P(Njg|%q z2Fb9e?1^R2|Ha!|KvlVQ@1vjsq5>ivf`Wi_cdCT6w6uhDccXM~DUp^gVbdK-_ok8V z?r!#7+jGwMKfnLI-?-!6JI38(=s28>JJ!42x#oQ4GoNQ?O~BaPlomgfYQLKAN-b{M zih$qwMaJ;P00@GPC!-Dxhf?640?TfEJI%X29T_&o_yl8zzwyM`!HG6U&nktVT`Y~YA8*iC53}q*Rr?_JfSvvd76r z;Oz-4<|H-Di0hnhind>ynLW@*j(`bWe7ml%7tzWXoIgEaC!JT$D zyE{9-=jH|h{6mgZST)O0H71OnL|&5jGZjM^h{Ug|qMg?VB7v$q3Yl)d78AU1Tca@I zirnp+)6SIr{!ir9zIdGKHf_WSNIKfH_y8RL&jl#7h#G&Cn_x?4h=<>Spv|~)D}-ls zA0u*?O*u>IFj&%KSR#8M2$N5q=+Cc5W}IC5RlE8n6lh#Zd{;Rg7D&I;&AGO(t2wu8 zNcJTnd&Gx_#xCGdGuxm2Cd#2evgybB2=MugQ{7Ws?TzUZkvm~M1}n_;g#3CGMrA}5 z8hyY!u|H&V%O_+l33lu0UbFWZZ39G_;6hFI>#m#_?S5>t2UKiqA-TEje^QS_bGG`;qBPYs@(WeW2V9<4Hd=jj!@&g%qIv*a9;I$ zpEEpkG$~xNGA;{N>#r2zo|S zqD(o_l$qP1v98OKB<}tZ`m-MVW-Fa%KH@@kg5|=Ja z-t)+@UG`h&;tD_75x{s;-y~V=UDa zg*pzEE9Jo0>NzVjm|F1}-Vm^^ug-n>m_0!TcX4LB2m9x6efSOa+H_HLBR z*$(%`)kDg4`<^}qZBhZB?af`m_3;>!>)>G|g4_8qvgmX^gtJ@7`#s;^u)m2R^v4YXV8B+LYd#QLBSxZtpJFk~p z`gC_C`&FX#y5~_J0FwM;VsJce+SWc7AS&;EI`xVuoHGnD0{7i%38bQO4lUEX?&8O< zV|rE`qT=Jz9;r>l-&2>(w@Aj6xCov)T*M5_n65_Lux1h`G*mTyMZ2?iGX`5%!$~e& z5A;!AU_3G-|HAR5DyK=_$PJah(%N``Ag%s-b4$fap4fo~k?s5llc~J@lkMnFf^27} z>UgIkQ!NMSOTDN0cU(X!+%+DeSK@J7zTY)fdC;6Y*xH7YiZnY^MINbe%R8H2nrw?h zlQw8FQS8LnV71w|Olyrg2~LcA_E}l_Gxd4XT~i7WNYIG&coanC@rW3#YfvNMKY7GNG?G zL+rh{DU%w!)S+KCkv~8d*kz~>lodWZ{R`~-o#u;nx9KiOYOvGC%S>AWL>Tz#Lw(V( zVm2IARjTZ>6YzdUEE|rPaYjZ)e*X5KxA&{A9|d5xr&SG6Mpvr@IXsTt-nd}YEG+w7 z@5urGlds}&rV=;(#r$9!9_t0?_) zN%)fGi1IldYZ(7pP`}5HP@NaE#1az2M+sZ+%RdMKy}8e+84{5Ft<}Cqggimli0G}` zzJ7pH{GI{SYc8AdO$V1F&Ng*|DrUNk+s5J$Z}iYMAB{r2&W1OpvEMp}s8(R(s9)j| zdq5iGV!Q1kla^+}L7d{Ts{Xn!t-A<`p#JG|(H;A`8NUR^Zks}MPEDJ-neKhDqsh{k zGz~S9sa~h?8;jq^k%4gD)SIYM31O z)AiP!Ygyik0Rto+yO-790&}%B3K5`~fDU)g(9lap+V&MYS^!IdIw^NzQGP$KA~Ty5 zdVqrj;JO9h)r<$|YFwiaQZv3ZlcO$G7y)ESN~thF{XiCdc%+XrodObfrNq`%-z(9; zX*rhk_|1K^)15Y@7HG1xWX9+aP$VODLW?Kb=w1!g-#y{FR9zEZ9W(AX2&Gl$)*!NC zA>K6C8EKdlKvc8U^(T!rP&V9U!^z;Ed-%SqOtDh2P{q6u&}O0i0P0`4g3(RIg3+RZ zfp^g1jbl*>33mvY;3k-?X#`o9ZjM~CM>LH*CKHl~AYIYBrcp_>U zrs|aUzrf0ZgG>^U?5UO;+IWFEo}}IE$He9w-AtSmU=}BF^jBC?bC1vl>X*c5S%6A{ z`HK9Cd$!t&)EV~nLowP+364`74y@cG>TI=47o`3G{8S1ci3vDG>=35EcZk{A4@D5+ zXsf1Xo)!7H7sg}g-;)9FcpfJ3@f@qL=n2?cX)nOuvZQHbrolMiWZu-VBsWH!mLZ+o z1mJ#7PceOozF0f*E^5$Q`7nV1vGF`rxN+A0j-H4RdVogxKM}Lfe^9r7ej^v<{}J5w zfAfz`ViC1Ao>HDNVVL-9*|haHkJcSDKuAI&gP_Irgb(ZGjA(?+7`3b&A>gmS;_M>i zH3EH9KryQb*cZnJq^=KT6EB$SmMmn^rv{lCSa7i#8niUiX2>Z4ewP|BQ3R zC7foC10N$2(l&2@@lrh&!rm59rTl~@eRCv@`1k;|w}Axv;{796-K3~xfVcDin~*i5|h};B~MePcvc%ProTtq^(0&U<3ujfy)f( z@2WVTYXQmHVCn7^JB2T)9SEG-Wd_^@s!lZ~tFz(zH6F{Jwhyiv6~Ql=9es5x-lM15 z3spMT5(1xtwhpm1D#ZU>63hxIv7_JbL0J}vwcDXrMPH{J-(t14|LdlDhAE+=UFuL) z3-=E!%^|=kkpDI)6wq-2H6Y-Zi87Zqho#niD)YmG$p(N&=eL=kDV9=`TWSTBN`kk@ z0shs?Qqm!V zX69b_IN|D{>?h64UiTHgvX4dpUtFjX;%=b$vz7hDBO^aSzzW6667)66&23oTx7Axd zRkY>J?;Fpm618H+<9zcM0IktbGmS$+02ws7FVNrJomu?7SO!u%3ZOMrbJ~lGi|%Y` zYA&Xf#l>dnOK0r##$mGxFhXu)Gp7UWrb;i;FFb@4A>h1F65p^O&jX<0U+FW-56$KvU;I6w{UC2D-veEVr7r@i~tl6sSpt+ME zb_Uc?K7cv^j%rYKyiDvbP+IGMQE659C{+#2vZk%R8`+fhCbXK##yAr`XMqV`F#y-S zM_5AFCKYEAf5(y5n$5n#Y$>jSSaN(Xn3B9OPEa_R@aGHrH3YR&U$gaKcZ3@xd7zj7 zCzW5&!?u_@q<^>y>(~+XFG;L2i*tjRg>INZpYQWpnqnTI-QK&Rnq4!O zOnzr74AA;}JCUUYI4XTDHw`Cw5eo<&wWb2GEhlD93tB z+&MKoN5d}Y3j~YVUDn^}c%7VxxVyr(zBb+jg@rsgW+esJmsa0}e+r&qW_56m1BETR8dP`o zCli%6M(eP^P=5Q4)6qhcFg10y*udfI>q!5A1X_ld?*d>20NT8Jbyh;j8$T5FqJt8-umx( z1HFd=QBXra`1vDVH##BVwUa77(sMV#hRfrHx*GfcQoQ(79!%2XsF#`HA%PKrr99)5 zHWLp0vI_}ltf$Us$z`1GH})${B#^e-s8kgYc^E$tN`+7Y{#B|xu%c%{74K3n%nBnB zeDEpN>%AXHqtA6y4Tt<}wa#+3hz_Rb&Ue(jOYMd)PjKUuEgd2rd*9=0VA|Korvp`* zE}182&poM|36O(=D3QyFUZ^oBkc|S8cv4=ETn!XajVh}az#_bxYVNyRn;5<|9-Ww& zv98_-8dx4eJn>)iE$;j@e2^t(@la7o5r77=pCSLFx20H|+bDgmsd*gf_JigJlAkWo z=Nbb-iP^l%T=*9w)RE`6Tcbh{EQ##9sXYbjf3ARSkz1?_zr+4BlCi>9{vkV>RS3Ru z3i$G_v;IKUsjQNxwbrE<{ms?J8eQ}v;w4?`(43=l6&kh(h zhd`5rhxB$zbZK$v{@~U`x!#)(7u!D=Fv$ewt%V!H5%Q0d!$XSkJYE*_toMYWn}Dfe zGk*qLH2ne+?$Stg$dkUwQq+6Ei4uiEGG6%b80~%8CV_Z84{9o`16Vu|2_Jj}Qg;x> zCMzQVbC2?EJV{R*HYu-8V)|IE$f(h}=)ilo>nh)lSKEXmZkOfy=NqhOuft3>(t#XU zABXjz5Ae{^n0T=n9~5+d*3FquP0JMz&`KW@ki$T2LMV7hZkU-vUl+HfOYYrVJxD1z zTZs|ch6qc5S99*V@no{XTE3ul?7H5t#IEF1FtlE3i_4N|q)GRgtJ>I7OX_@N2buBt zA0nN0_bMOjL9CkTc#)uLB3`T%kZz(p-JWb~Juv9(%)Ok3tlS88hXzk(gpL@P5rvFz zP+f0|CndzbKCtqBGCD++^zCY?!~s*HP|ZM4A%uSK8pToLwu$T86B(Cnoe@4fGhfuL z$R~@?;Cv~11S7pYZ+n| zTJJo7(Z=%X>YdxJkvR`{Vl}6&b^vwo+Fla^v>Px_iqM{o;D)p;2++J*;qm00)i3!_ zHFe;|yqj+=rRp9X>la%U1)dXuIBT|^V?F(lR=xRxqZuo15c#oyou{^V}IDv%Fk+BI~tP)x+@Bp_$#7-?f||ijLsW_(Z%i z_JRPpZYCk2#{?(iVCmn18J$m>*4f3ykE3a0SaEa~v*Kuus^DjtrS4gOVP*tYRV1JK zwQGmq5t&laQa}X5s|r{LogMiuf|q^eJo6N{P8oQbGw*(6Hw+AtvHPvbmY&-1P25Cij794J|2Cf-#t(jJq~*$ z5K$vcwzq+8W|r)|tT7dwjP&w%RL7v{?Zf=FXd(EE_|R(tdIxO2gz3SgQ>9wF4~te7 z9R*(71fv3ckFNrKhE(77*~68{)=!`cyVLTNc@5=tV-g zlBq+@qLh>rljQ=M0(-4PgO9h@zSn%EWI;s?R>r;DNKvA#t zU`ZnW;zaEa@)*Op*v8s>>qHIQ-u3@yaz9G1ESqXg> zk!EV0*D9yb9+Q#vk1=YVd)+#J4%IeJIg;g`lUeK6ek;lQOHJ29?qI`*>d$*uvGZcT zG{kN1B5+kz(Br{xQP{VVp6U>^_yQ1xRA%RpCj?HVzo<0iM=JGYL=keuDU!CwCz zS)UBN>6BgJOsYBk+SSIL4Iobg%LUW|ey;GjAH2#Lw%u_YXFtBZI&f<^p*wJLm_*hP z9LK++CE1wEqD@3L@v>$JAf)UN;>ongk16=s))h~i8?K>GE;~O^;EwdpR9W=I^tB29 zL*nRw=0exyB3{jV^je55#d)SgDBJrsJ}8t`$Ws9?6yk)xXrC(Em{)GrTy#H2625v~FZ74NP`y1;u=qecI=D0U zWje9MV7`iZ3OVZoJUYznxt#3>pavtOSNri{`#cy7r~u^d#;PtEuV5T|CKDYgD=TaL z*bOv-vCh{NNKSwHes)}5SuM5NA=V+~CsQ(cNgN(Plj{2Qoqeu1$;HKw_l;qLOEjQc z0qBqWBkbNwAmN&KQuBD-;0>fyh4zua9-&|@;cQ9ukeXQWIR>h{DdSoXML^_sIUnqJ z&*Lows;~DYZcn+Ve?RmYz4>EsDf?vu&@7KPEKT&15fSW*R>K zrnNo!DRN3;VhiZ0p^?qmnF~`lToQ+8kdzsXG9wtXJ=R8gCFc^d^fTZ&iVO-~uWdpJ z2x%H-ce~FLJ+a}&$!U_$7SWALk<+JD;h-vW4*&gPKg#j|eM5VcvkuDA{>&ea; zUo>{pL-Wt4npQg<)xpsNCLDmS89?HGVsyA=janfgp8WL0kcDvF8?aX`M~nD39r&!O zOAy^1+#r?8{=-|cl{Ta(RLnyH?u_l@-85mIh%6(Iyvk z)A5yC6GjCu;&xmg@Vq5pu+ozMP;QR)na@Xf(&wxU?@Td>|di0^T=(b=I%oyVqU;$WR0F%;p4`aUfW5dc+?jFjqu6-2_>K zpThgySAf-#&d2R@Nq|#6f&AS*vPN6g2O!`|H2gXdOXw1dt027oT1yqG)rHYu_29=+ zA1##4wVQ-Nw*o(|r%PV=mhfdc5(4ie6h6SiXVwL3InM!z4I2ORC#p#8 zu%?8rNJ@!w&<@@hJR<&BWp=e44POH7x}f0TR|UfdJH1f#>tQUH1|6ZK12UkZjjxl6 z1qiaGS<>i-Ed?(nqVNG*+bEcY`I= zdLE49dez5$zFNSH3^&O|kER9_qOi#d<25Mm$@r9Yj(qM>+%5Y_NdEv`t0W$kHZ6RpUc<^P$z-k7Sr!8&B`!2r;bXEjau%Sk!J-; z-?ucN20zH4r{V4~Q#h-ftZE=wm7A{{Bb58fk94l}riy%hw2zqmTY{HIAvS-GhpArFXzSH%$HY~kE9 zqHtu%>yPKU@rRrAue#DOw#L4ycMH>)0XU1!{MOn2d^r^A;(b{Ma2-~cbrvu6#w4FR z-suZr)#s%sQP=ji$iT=7q0K9@xbyS2ESA>!g|!4In~CsTA51?!#Qs)X65QZT*g?zCqFxDM+Md_bnH`|l~^)lk;J6KhKKWUf9;e&5qePB7FPM6Dc3I~bN1%lr6jQh;zt_H%3Ej_3)~ zGwps4GO%+(6&RJ$#`4iE&9h7Dh}zF7UQY#LPmalKq&>0w`ccuXdNK3>k!@xvT0gNS z0K>s4RY9Nn%nFbFE<7l=ehQB(IYz4+M_F-ptsSYn*B)H48|{p9d`?UO2p@xkvOcSy ze}r{xwJj7Iluhg>t)1FYg^T-6SUgvY%!QgyOiWzg#OKspZtlt?ucq$V_I6@}LFmFE zeWvu=uHN1cv(vl?bF0kHzJ!8ScY3^ah`%Yx@b1L}Y}rD{-A)$=aS49iToLiC%Qfn< zq#{d73Y_&0cU#>yi{RnDrE{OksO#OCjK$;2&;6pHj=*-L#EagavLAWB@9l*)J?Pz1 zRaF^NPkC2XGrcG?HZ=5o%Dte>o1l5esRR(M_>wV`sLPUj!wXa?)V;vG`#Boo$*zT&ungJ2965Hse)&rQ4#hf`b~5 z?>xtsTE=%L-(j44_;FyQV3mB3CfjW;gJ%Rd9iP^C#*n^zou!gC#MLo0=u^{x5<8jN z*{k#QRo7<6E^^tW=RekWu`KHRU`r(u=!V#E&?g`t2unB z)Ut^R8j2e9G()4YU%q^jD#X-EdY3o);>8P_?c*Q{g(kplJ-QBxyuQ*UM-_LxdwqK) z_xjBnP@&=CU4$}~n@%yA2$ebQ@B?D(6BiGmQAv@$D=W+v_$4l8V08HihtuAr_Jse) z2yS^S?%VvZ87mr4F#x~_nLxGkB_*YAdO8J|Fat&6``B^y*|`i02C9{NUyE51I$FPY zb$d@e7YW3Cs$SxuK5wfHJXFg`8{z` zxmR~PS1D5Bw?37i_nhZI6@*9^Mg|de!9YhV^`Bx zC^*W*ctY|ma(oxlLLq18(blrNLBC=?G`mepot8fGu2A~ZGOv~y1=%P-o2GyUSWrlW zICPvok#5kY*;Jw~`Cxs?dx4x%Vz6ADJ%P&{cvnR%4tBuPx2ZSt z($in_Ic&D(vM!m-WHW-fo^SY!gq%jCfb)bFWi=1o1V*^til-^#Iz514$)Lr;JfIT^ zAVB@4MH4a{rL1O@|DDG3c^D@%2Kg#Nx0@+l*q{0xyETg0*o@k9iqy2`Kw{K+(Hx|k9%zt=- zp=w=jYs1+j^&jsm!(8o+4z^aqqa5hp7$|2v9LFAN6>+H&FZayDX?MY)X*!_E5#+)$ zD->2h{cio_bu@BcPtjt%K$exAS6BMz(a!y*TI^Lhy>hprr?YJ6RL+s1*Shw>aB~Xc zXjJ8ab$JD?3sZTANEP^WKGegCS*(d5s)51xTDHcJx##=(**skiBGjy8A6j=HT3SH( z4Pc1Rn9}ehu%7-nm||3+!?Q&%1j=%`s-;C-vMC%2L{Bh!*S+h1{zk{SFsf{_%LU&M z%sSPdc4vO~()GST+4DSS?!|}iWU*&A^%Tv)o`z?a>&@_8&N%VguQD(Do@KK-pE7)m z19~L?oeSjrU1VtFL5|Y9%k>r_8PBtZVgE49qd_!wy5zFmk_Gww-!|Tnf#4EilKqAq z!Gv(WS*6o$G3@Or=vZtfLfNgFMZJ+N z&Y`PEF2-#QeNP6L3Gkc#F(FvOQAdLh?Fn6q319RSBTaTff{Y5^8ICli@wB3|q;Y6A z2Mgw)P)rq9Y!!}cp8tN5pu@z?_)%ZrxrCz8Z46oNysLP(H{=O?T(s!CiR@fJsGf;D zPnQ%6*TH1ngNYfXX;pE*KzR}*3JSuxa`1bu7b|fpKz>{WXw4P?yhH`4s^xEQTU6*k z$H5t$-=G8SH)Pw;Vu~YU$sOH%mkKjJxbO%M*-7y?9xF4rI%PA*dmS?hg+J|n_XSJ< zN09R6J__XZ%2sv+eRHLQbFTW15!Kzxew7Ya7UFF*3 zV&%e_WI_vmsubQ^TuI-_>?d_|gs^GRFdcIOkTm^v)6-t}wZAL|>wzb2>-a;?CKlq`e^k0ob zC``glgE%~qBTKdp6OiX|CGh0RdvNqw2H2isS53)+CufPtFkXnt@;Dy8z^r@WE!wi! znVY<a&1bz4S?@v~4 zz17nbir>hw;Va;37J&kV3D-vp3*ms_m{nXXG9eb!(++U+x1cRH!m5@QO1Ve&4m8-n z-iAp2IWvKRj|lK>TnMKynagA6N(^6Yehn%!u&1i!)ozA29oA3WUcc#k-`v7V9FB{N z`^9dNM`zD}#_7f19qjbmD8!(YG9WHL7v_%hsTTlT=(Oy2z&&tqquhk!HsAF>{qN%M zpL&mviBk=Az-eut_kjMs!qd3?VxPzG)P^fe>sl>1&#l~~L*OnOzdDC2E$i%58QVq&kb@z5SDihSH_cvUHqhPxh6X_}bbwFh}^(pbJt(FWV9 ztu9*iO4)n6$C2rr`kcb9BoATag%8-5u3RLpT!|%;f5}9(`c4o&28tijiEa9<0iw4~ zD;KpKXm}6?d|q8Q#^9jNwrqs^)>{-{+Hn6-DRB#hciqot^uQUAP{>-07tN#UM;Oup=M55N3v$ahlDq6pm6X4=t?h$W{<@g3H3rmCW67d&g%o zK>u{OLzP$9NSOVVujQ@OXCjGb${?f^Q|^Ubekyn1p@-` zf$TDbAzGWd2?APXU#-A=J&kyB?@9PxwrVyi26TCB$}O1-I12pruxq4KUMS2INDNQSfxj)(sF*G>MirLV z(yG5IsfdbAV{YT+yX(`1{NV{4Z5F4C-QwZDi@ly^ z=seZiR?WB6tU6rF?i1~3b^Ebq6n1fbzTbp=mxy&+Y!#OH@F#f_ynQ6q3o!6288oVY zdTuZJKfJIT5=CNTXLniJaXvUWY14T(zl+d+`tyLx;F+~f^*`nRCV1p*bR*;o6HXTC zOQ>*JWEgYd#~Bz|Qy;W8X%hMmi-!6xlJ&slgwrA>cL}B{W(Oramh2Njiqgu?k3apAluJ zMi-^3vhwon!p%M@_-@hiqYUsvZ zis>INK!`0B5U-%pFEq?D1FoigA~W=xCD53~l>fY%DcCc8!p{)6W;11TFa+9#b2qiw zuS;;nehQ2@)ow9ujzZ;Mzm_H293Edf|3RrP3dTIai@CTHV4bqJg9VJ|Ji?Y)b;j zS0Ryyxe}0*KTP#xjgQkMZyVS3TCly2Y72eeWc74THnATt*maC7M$9QY%O<|DnlsrG zFlK{o!?u6W!4u_}x%@|K{Li~}D}#-)bv5AIJ|KCzBfVTSW!(aUr2>sKq#~=?))_12 zmml`O=j@-Hv{*6Ex|Wx}KOMAiW_b1!%p=L1@kVU@ZcOf2s;?J-nE!Jtb_#3y)7B@4 zFNsx^;^Hooy!qHJ75YaK4zY|$a{m8znpF6=u_z|O$mj0|E!w|q3uEs7FUdsF?#~E8 zroSI6|F*ld`?p9R@4wvv@y^Q+y_O`wFpH0*$ zrUI^RI5D@;rhL=kN|h2Jhs%A$Ra<8@K*xA!e@1k5aBp+e`rTsg!wk9PT0qF2_!CI~ ztPHIRSX_{yuscn=c->skSebY-Ryl3SK>E22xDs6qj`_dIP%k|vQ1%T_v)i(42m{ux ze?1}gx3$kejXrW<2{ryo8O=&VkV&8Z%|cYF{MO?u2uE z=;W(ru4*CQ8(lB|RPUsApf@nn@z0kJB2@W?ZOy1rx!jRAN74c$;fHs1$E!oFkl;I0 zt9PbDm+nGGLiP@X(fL{(fG~T$CUL8~x zYF^k68v!N%3(xjP&RYN6ubB*ZK+M#n>MrP;JYviOO6vtzTf*Gd>BYrB{`~%sqLO-@ z5oe@=g2U!eETGZyO;3YjcJYY33J3~8I{x{j6vhRwWjOn~yBEP!3qT?W6F)766VRck z*$Fez(a{Y)V9LQkDx2u-Yg{*Y6#ab|dVXUeHX-S1k~)FdKc# zo74<;hAp4`5AuyAgXetIUnwN8K@~`AyXB;ORuIkeJIt4 zyYA%Kl?m6J*U^bOu#KvP*>_!xj%xv30#cGO>knIBg?qvzOUyg=t z>_ec&)@v<*;t&v63oJ*mdu}Rc%O|#{2)f@#$5`1gPR)=S&2P7|L-o4dkhuNE>e~{C zsZb+@r{l3fm9GM|+IEryN?@)(baijfOq$A=YKfAq`=@4X?!tG5A?>onsch730hr$L zml(vQ-f*vMx%lQy6?$|GjHMcafOi!doCasZbUPK__nN>p=v+yA9RZFhT4wo2gh3M) zM*Tn3!#s9WlKLrnjo1N{g6+7a^9vln?Ninb8@4irhA(E^re8bAaG0wWE`XETPTtpg zuoMq&=J^z?I|9fiZ-kR2GJ?{2&rMOHuT&tp*Mv$dbB|GPL7w(uV23$wrn4AnvbS;ZWwN*dLM4Vgd#xW=ho4tvFx zT<(JzYlT{_9}S!==DI^Zrckalw=~zBoKDfwIqbLRj?WyF+S${6T&XYq+23+=<*r4^ z#FWCnR}%=Po7+A2kp*VCr^=7~1e19lte7d8; zY8bPCGYCrK-PQn3uqOD?V?e;`cs)xDOofE*71erna{aXpSVuLsa zxFf*)V7a-o;P~wpUkd4d^%WUi0zjoB3_oJy;|El!9e5`*H(k>8X_iw6Gh+p21Z`C#3i&hg^zQ}gZKt}rmrnW9FQ|6Tcp5p{ zlQeyOKys^wXPcxkobk+L`bbBaG39UG4@^>P@AhlGl8|qi1ol1|A(uo#~LpgX>2ynLStfL7DMg5_N4Iy zg%MFGju>IL&P&ZyS^f4y*-Dh%d9lP)W2>lF;sJdq0poEHn!4}%8av*z+0jJ6MnSUi zydud{te`uag@Z2lg~0L8o8#@-@D1VHx5_KsfU!&RbEad%fo(q+KA0hG3{E!@8yl7x z>kaiow({Cbv&&O&KTv+IrIILb-j7>qjAskqXzHKutD2*tr45$2Jhg><%SXKaG;lG4 z2w&b8taVt05V7CK#LSj&x&^s4`|T10$z^{b5Nu|05Pp_~F9;JE&&pv1ax;9&PzB$l zB#YgKBh20U1{z^mcw}p9!#z~gn!S>Ali^)dtKE^{S1=4}q36h-fUB<}ZS|9`uC8mY zB{i$9!DJo5I{W2LY@p&-lddBOPNo_Eug_t^65|n1f0r3McPXVVJJj&TDy>{Q=(w6z zUsYUP7%$cA?ea^9|B9b8aCy%I)@-@4ZqIPA83k#2pwT6{IpmhO3)ZvLQnII@tSkzQ zz6iN*m9k~7B0J#L&wv6P(hu#52cH7e@F5y?r3#d12LLu}@9214IO#}BN2h-?x#&nK zO}BI9&9z6ccGRdmc=ShtIByW)M{BT+$&aKnYkWJl?tssF(ZdY*Q)_Xl+4eUWJLteO z$;&qY?3w7u$X|?AcyL8hGSzG83%rv}k3 z!*<;UEUY!eD^##fUi;_8(wVL;Unq1q*VaJ1i9Z1DzGw^df2YS~-wuLa4QPAct5Ih+POF1;5?h9bK`bgdn5;JchE60QJ?Yf#OxQ_ zAPo&Es#hAKBQ^D%`zP`_F$k&C_P^l%NK3y)Fd09aF|6Lot?McF>XlH_?KL|HK8^%g zQCKh3&c{2CO^1O13Fml~wfxanM$>`s&p{Y@J>@h$yw?QRgWukOG+GAiW935CaPe@G zGG^9Dsb9Z1%!d3ldNvoA4D^mxWq(`L_yqFRpj zVC*%*k(2A3S`67D6B0Is`eAeApL(BU^viMI*^#kR`l_^2|81jHExQzE&zDmtFSlg&hS;-tM* zIg*Rr_qXJ%(MHZoaJKMl}XyTLP?stQWS$h5IISfIKms);PB{hIuT9a^c?A| zJRc}tqc*YlffL{j0Jo&c6ti!xLdTcr7#vt!2G|iT;QE70a}W4V)vhcysD$pkD{#{G z@Cm6NV(c&7Q$}JP)oUNq5)v#5}>m3=bfwJmrXnr7S=`b`4NlsR=}xm z(os&UOkrs;5(qwnBsnx!y#PPC&Vh=NF&11dTl)^V-HLR%vw9F>4^B=#9>(d~Nsluf z?_KGZLX4C$#5us|PF6bN&bl~`hD?-L^1m8;w%d57gEU!gE&;Y6;W=^XMf z@m?Syahi|WLHx|e(p~Q9se=ulW6*nX(6%3%!-cWpzFyR40PVg z?5{A*#tU2O3_1?S`?bq0$1#Pyy&J!A4092E)j_ymKbS6+*9hFL z<`!>yC}N@Y!`-iY5#Q+?kA08TdD=GP$jxNNxylr5d)xHZ+X9K2*pLc*c@A!t|U@ zLT4^ovH2?W$L5Ah?ct;{a@l4TW-{@Yl$ur7lHuRpr>Cde@Q^a-Xw_pbPdWl=rDVTA ze}k&2iF(_+uf`Uq{rm!=04op_>(VKcz6V$El}s3H{bo^F?(FDllpvbUWQe?<{?C z*E4ey8WKXtFLXhiM0oF7oBPnU!tOXpsD0?IicJV z5gcUw<>ZYBI|xy6@u8zioo_PPiUw=;kPemOaS*!6U_wW@K)d@_$9S9(qs9|Fyf)xy z0GLZCP8L&`KLH+r_)cK+SbhJgBjV;p?0&k9{9$IYB8Rli1E%Bmsi^2 z8p6C~S!@p~i9<<6>!?}6sYCiUw`VTA_2S?j85-(7TdOSJgZsNQ@r=Tl zwa6|IkWUS+$-lcl|DQqGDps33c3>gd+NxNgp#pTNVW00xlI?&4;RP>mJOYS5_qVG( z8V`#2H8%&l;h|b#ktmIbS$~em@DUIAJ-qz=F_69mKwQFs%^*PMg7dY23w_+tVexZA zBSR#X(b z!J-3x&6M;hIy$D_OakXM&kh=>&m_n{F##t~5(1cn!JP00DH4E^gyrFpjW^^6LFB?s zqZ;5;8ar%>q1|07P$>XqH~B(?vv_o53Z}?f(M(WCes8OMN1Q-70+vENw9@H%gQ@_4 zakwcgM6=-O40@3EU5^OFj>1f7_V50$Ag2Q(gsfR9R6H7(U7LADgPA^cUt;Vw{P_)inf zabql5A!F|O%77j?ykEsx34-Cgv+13#F0}jmSl{6W@Vn0_*rI4si4eNC)1H5Uq#%k6 zsXiC47ZVp-Ab!{lh^UzA zc{e#5Q`lmGcaBYm_8H4koGv)ueXofB+QtAhGc9=RU)5}&Bmlhr(y|<;Dygk&Es!B3>9s8e>s{j%MT zcLjlf)PoI$RnZE7q zrW%(4?^6oUEm&r%&&tl+AN+mha&Z#r;_hlc{Yv6>XBPA|?kqx-!EN~^2-c)R z4xPVcw6p|>;x|YI?QlP(Q@~795ePT%mhV|fcMCUxoT419MS58`S)BVBc0K1`ePz_%#D;>3J37Y$*3hu`e^B?{QBAg8zaVxI z1QF>?K|rK~^rj+$Q~?oCigf8xq(iU(N)_ofDj#p&M&2b|%P!z!w=w7_cZgAt)&5S>!Zcck9c2 z-e0+T+)}teR4o8jgVj&TNHUZormyRqr>@5*%dFOg0G}`;uWw6~Uv_5<-nw;rqdz~* zfY&hRK^fyIN-os?&)N^HZq^4A0S@B6>r0!8yOW!*N8H_%rAORFORUo$1F8P^6|MF# zXwb-PB*fy*C&RG*F|V+pr+?1T)8Fd2uMbJp7D;k$TqsY1mF)E8BnAc;(VAj&it^Hx zE2m*E3rTUZ-oY!~x~)WmZR;eatH_G(dc)Dn*VS$LPYatc;7(E~ySQ{MxVx@B5>ZS? z#48_SkE4?-u6Q%xj~#_kt=zKgsk^($vchXT>WKqjQiRPBMiHFCkOv%rYXvo>V+EF7 z{?fB?#Qrb;NYqLd9Z)UuxcOtZ>!sd4)1v&KQ#kiZ@?Rf@s>+?n0KtKdAUvHZolF85yQP?ShEkRdXS<+%1%bd$6Gs8U-a`oIDLAJTU4}n;4*=PMcP9=ST-{=bFIINrMWP+q_tILZ);I2 z~!V^XGm`K|zwt6wGiIq?jd{g9gZ!B#o^K_N zy$hWuHeh8NwJxDaM$dl#`t^D?(9y(7W@W5)*a|ZEp=HnC+g?NkQ?doP3%2hzE z8o4k30FCQO`2+GWI=<G=y6j$c^)l%Ae` zW8<4;x%2ol{{Gtm0qGNbHu=C6e*bTjn{^2cwUAF=WANYGo{LK`74e8UGh6S! zrz0nwT)^eu1*nSL5CyCH?C)=u@dAeG9ryEy5|K;qFNG7lQk4~OHXG$$)C_t_xq7+h z=$O#I^vf<^Wqzpt~?o#D699RkY_l|{@wp$hCD zjqUlzTnORUX)>B}Grqst<6yv$3)Ua&=36kvh~s*xe4C1mPI(bwtT@HXbhpfo#)1xR zJ;1?WxJ)wRuiT=5DQoMK#|xbfq+O%(NPX)d^I6Jo{$kwcdz_c~QcGhe%N`RM(&@<@ zAyjhctJn%aiNqZYoXL?y-vKo%s~LGhyQK&f*eW+?`GHmv6GxVS#fF-e)|%Y(iLkIR zoB_rL8WVK~KH@zPjzma1b}v_^$#@7&%^@rE9ho5FBm$jvwF^Ox7H~h5@vORni;8@G z>EhZ(2LT6^47YgoNtPi~OnttSo?SQklijbYMxJOr_tn0nz3o2}b92s1u3hl-WM+MQ zbo8p;8F8Yv>XnL=E^)lt%dO23^%?aj=O2Za0Dt0VL+nXu$?Y?bYo&A*CMZA3vlR1? z%X&~|*ITD}3OfbLm?$~nKrVE0!u->Tveh5Y)~UI>GYxeubc6b) zBwurB2-M?|l!AhyeZL>&JNAX2%n&#n=ooY>wuwTU{#Z>g3LKa={7#gou?i=gEAN3KuL(g+}GyNXLMa9Z2##OomQALIJ6<2CU`!D zSG*282B`4JFYo{s33nTf<~AA9j7FB+FLoU*)7LH-quJftXGpxSk{G*%W%u!9Fh%NkpfVdGH8GJMD@DR6Vf#Ih8#x_h*09iB z!fjoWfLh)aTdCQ1g8Ep5a(hAT?%f5YV-HPOEm~?ij$ua>P14Z=eugl%-2!ING_NrX zmiS5lMc7;z60*Nz1Ly&f42=AKlSC(KrvCOeV`*)j1vH_ zY(hfIzQx$gGvC#3)+pIcg#6K?#~$}(b~9)Q@~c7BRGDiytrn8aF4n zsZXCNep~4*_!@*y?*J3%FjNWB3_purE8?!VwI!M&;t-pjep_Wer(d5} zh9K36lt{4V{7711I~-|qk`nybsZC+DIvmo;QSwRG@7_JPf1VoZXUf6BmJQ_FNqMf) zM!CvOWb*eR$bp793Mfx9QMDSw9xWTIP2e=F+#9m@UJ0TbUFMu&!5|K2QV5&iTD>cJ zX^dXpzRbS=YQoVZbbMGrL4ojJt;388aRoEF1u!HOAu**2Z3D-z>+}Q+(f6GmF0rAs z7-K#AwR0RXw=BHcy}2_C3LepNr%~1IdB)Bpy}h40ARP1GS7>J{sPCFoB0G{O>Pt&p zQu>Yd1)%^w`V|few~|tD1X746XY@@QT3Sw_Mpxwf6_g+Z2evzA*+d5i={#6LK};QP zRso9?{@~!wQ2jU@2*7%!PK!x|S`>CIU-@u6dv3Xw_%uKWz|9CotGRJ=sdPgB2oCws z?l2*>6>*=I#Ld(z?jwf>h>HDEPYR5+MKV*)!In zV&LY?1h0HuaQA84bP$hH>I+lli(Pd;ETKb>*Vs~PU|jTnd_*S~K^0~(kS9q{ejUc^ zFKrGP&HFpvv*VI^5()~dUpA0PWK_o+#KUy71&c%!-oE#x+pKF<;Y=Fg+KACZlPWy3 zkFRe+hxgwT>p)z%V!>NzMxGW2S)dcoy|?NXSuGMjwa3{4Nk}V@x=N+>$*_0IB~Q9c z@~&&{A0Cfy>Z(Ip0AaQ3$?d1TAq|J4cqv)D4nz+*Yp+$8fN{d03fN~(w1Ax1v!I-CqeQ=g>d zGCQ+8%NdYJO)PtkTeM9ELEk-=LEx_#Q}y#(KbfW!<`q{2= zSG|0Zvi@SAC~Lv4Fqu>Y0}NJI=}LD zL%K$*OT50_1RjMkMb2+$;rQg#6vIx>X}i8JL1j9e`PF-jkdXrQA-`qA-c!~C)c8~84KHZ4;`kQ&S*E9!qtbV zzhG`6;J~oVj&o2siZMm2<3Y}OO6(%$w&FzR6<*Pp0D}K3kW06LLg4q}qVnzAC+qRo z(ge9RL_FqD&Rm;+K1q;Di`T9-U|Wi3FlZ783y9TV8Wvp-YXd**zB*F6Z2CP(jm)0L zNqMnXJiQ;M+@)bPwpx3413LU2%sO%sYUA_g8NZK0E)$ec=1}Q13pl~;^1-cQg?XSJ zxti@~?;w8%bV&Ycv*QJphYAwJ-(5FbrtMsvoe;454Y=A(EfQ$tJ@^Qw>)od;a4rvc zaEN{W!_}N@T)>cfXlQ8U48b-sy}{l{6CH1FvAh>iYS$f}t0$+-ke&lKRFU~FJ7~JX zHRhTe#Gx*Et50!4j@X{^q$~_5P%4H{h&c`xH^o9P)ZW!4&UyKABB&+M&~TYlRaIGM z_u7)4K3xbX%N|L9b&1rE8COGN0sY4w0o_|ubB6UEj;~8XRqkk{R9t2k>7hS)kzb4^ z8v=_sX=@T-S};Rf3pLkU(>EAy(6>SN(yF2*;URMehE8fEUz>pow7$8Wfl(xIL8~~R zaTUy#+q2c>jssQxGEmt-BK>G)b~Y6&>kW_%gJvbeW3-yjq;M@f)XCL*b3;UzgDaBN zSjJ^)+p*|=F(WD!%58@Lq*%foQ@=ay?-eDD)9p9Yq5#$Ya8-Ze(Z&&@{LMjj;sDvq zNn2lkUyIg;XPML`_rC;~$f4=HqoH9_b!XdnH>?+Sc?Lnr)jtlm6h@1#^l)Ot(N$@-Rf8* z;PiX4Th7ELbX=K@QubR zx1nQD_8H2N@F(86(Hq(mXPmiWUMD6RfM~HD29rrWx!5)^Qwj^v9aq;4Z+;;o4(XE! zgaQe`{&2*N@xGG{t`#d4h3*UNJ-wRs@)wK}eE~O&u1CVv`ZLjRfksNoZ&zr4XPKK_ zHnp(u?(^r*Nm|?5F3HKgn10a)Cgfue^Ov7TxQnKs@13Ezbd8Uh?oE1pFtn>4L>YH< z*t?rFV~k=>ooiGDR8$NQE`L=!j<>`d=W4<#{<1Ti+yW~Sao~0I1=2edT;NP8T?22- zAhIi4K>Q)AwV>#wOP9VFmn0{I)T#iYatz7v@_FqD8+OR|j$is*yO%HKM3vA{h-gi}!2Ug2j5foyL8k??uI!Kjz6#((FZq;yy*q zZqI3wzC2@%`}gBf==t5#63|LYl&)Sk@Tx@RfkG~v@qi+P_+Sl{Z7ux@doNf!=_Hub z!e7y|8r`yMwHGCsrbLue>))=s0TgaWg1~!U%rLzOzA-<{#x06?PKhs9mwT_MoI!fM zd+K8M8>-(~0 zZ`%wYVr&tN$o^q$l&XNBP&mXhxvY~ejg~M;miS&Eo;r9%hh+mMekMwzrPP2gm{#k* z_sL{_A5PjCud)b1)npzFNmK{!j7w zf8catU0OQqAP%w*S@W-kScwO9?!rJuKkKlXgni`g+qbI5YF&0^Z;?nu&(m`G7EN}5ddzEqkffO6KY zo0yH+;niY`eGg);42=8p_E%WSnb-Rh1;7$vT)pO400CVtcLSXT$gFuqhhpo4f0gwDuWG5Cc6lqC}RzRPiC?EWf0qW(WbkNDNm(o za(s!fmU}_%TO`i~ED=73pM^v7w3x^xu1OL&E;w_1P_K|9yo5R<0PH zUP}=xnY1pWi{s`+1CHVk-w!$nkdu?U4=wL}0GxkrWfWz6|MM>z28M-P)A~C5-L(mB znj9im`px5KXUJ)on1u)75vPdzM@>+Y7`gE%lp1gyX|n;Yc*LZJQtNARi5==4(We1ET@2OxvvpMlm82ZHgkWFCLAk zTpq{~<<;lo&S(tgo4Lfr6%1c<3gZhUL8rC_ziWbIssBo=GRnC(`%y z_7=^UnBeMv_}Pz}$eyiL<+bSb7N(h*i1Q?IyK(j7caFr+&@e*2>bJ`8&P}YFf(~t; z+s38PPcr|0EOl#(>$h%cVus1a2o-ThPm%A6v<&z?ILjzL-BD0KGo__4mt%vR+PCdx z*x5J@OJ8$-HW+IhVL1Bl0OkvpGez7de`FeNp05?C*YY}W&dp6G-Y#P6VU=crhF!++BrV0NR9{N0Qv{-QWiUgZxj zYMAql;0~!oTvMB8bwgjjovMQuCH8s1B5#iEi+YpnV$D_&y*v`0-cxBTW(j! zp>;CO!Y%r?e%YQmB!22)MMY6q2wcc9pM7I4#5QLPkd4Y_m!L|JmD%++VUY@L!LSq2 z;i+Z{iMUpTX4M=48qjmh=btOuN5r=+u_;{-d$!x?DJGuAmT;^iTH|NA!v_~dQ)#3A zSATxxQczm!_0~H;=8ts<4C-&+%?;y+uOHxab`&$J?Zr zN-t-Uyw43Z7SuSg@ZtGsAO3#cP@g!#t5-r_UD3EjrOo$>hU^UcD^QZ_1XLjBwJiL|^;#>TE+>{r7Cx zin&muPVE?sgcLJ{u8PVl9tDN*>8U9TXz#cxhL@-2=H_6Os2_=GOq=Bq{Il!IMX1$v z7oe}_8FX*e81m6tw5o0YV6?PO4G>h!F?yyiYfYZklb7(&D^mA#*THSD@Km4ekHq7zVAkQ0PA9NdP_48fx{B}wwwzNGPk!#bEdJs<&-HK8>Fh_ zP(4UXoWH_&>(|F*PGrVll4WAX70JqON#c^zssxs`KKhNfZd;AWv;%*%X^Q&Cn=x(E zFnmPw-9SrAcH@G3wK`W!hj~$@nyTsuv{Nfkvp`u(4V*_P#rSj#4xj8W#-q+ck|yr5}4I2k?qPu_YCMzHE_tsmAaQIm6!3 zOYh$|wg?jWSFC($=r21CVOxdQr2DOC^hCu|dl-S1?t3#=9~<6XL`2CQFYH{C0mv%5 zH_zD1v6EiQH>G@;VQcA;pP!#$i4RTx_>*Ibrp&Xpf}cUon)k3gb^DUA-ZP$y7d&q) zV0xJEb^P$LYuT?NTS`27^K9N&I|d=3mcaK>FUjgV44$@ti9;`ggU{ESOM%Wu9rxtw z{m*fkjkk7I$CWkV5@yGBS=;rNgGDR5wO%fQ7*1B?W@Ex6+SfYQD7imtC56BltcmKBw2`GGRG z`+1tDEi@?M623c^Kl`SiYyXe*ZN`;4s1nG)g_nrfO%)b7G5 zZ{y4_rxYBgBLCXqdA#>sJY|&s+lKDvq08T_rrqOdMeumd17Au7Q`1oLrbv);dm9%R zQE6o~N7S0nfLZLKkkBhV-YL1F@6V6+w{$M+a)IN`ciWwsU4Lm3w+zTtX|?sMDtr zH+X(;tG0#yBiQ;%Z9Soe~mVu~ruxyeU2JPz5}7ZsacIiEPvr z+?RF26=!WN3}fg&-p>Q$0fL&BoT<3EnQ>$MVq|P==-jwP<6teSa4W$W8=-Z;Da_i5GQ`K*7x%PxB0n246&s?6io?$+jeAT&N;9QbzWcfYe!g#4zq{9S2Yum^wKODjSP#- z4bfVEO^qS~0n>OHoYn$6J6+DCV!g#{DcsNc8g_{&jnBJgXPQC+B!X*TF2}|^g3bJQ zuh!u#6^4a`jYSnYw>+?j zAyy$L@*MY5A}$G@(m5|TK77>A33S{^(8IROxXv623J3^@go$g}gAN`iPn|+BQz+jt zFi7ORbm^O8$>4~Ync2!mjg)HTaC);5tspqZK8dPzq> z|5+N`Jkj-sXK6+SF2bd3N~%7pcJCCPY5UTA&mI&5E_5Gt-_|BfmPSk$upTCKsLf3N zZoeZX7$l+ph-HVHE6r`f5n+Cwv(APPc7nL*O1b^zNGIAA)K@~kH5VE+suojU8Q7>3 z=5u{J*{QI8*4~U9Sz>N~tlVL+`E0+jg@ZH)coQ;Skyse~y?`7n`4^!9(jg6{ERYDk z8noF%%V&s+Ie2Y@IKO<@csc&d=$#w+J3B^??n%^?7(}wyId< zoFJE|XvY9PK}57<*Za`CoQp0x#R#{`P3*2_h)N-#aYSM-Ob$rE@-~ys{AY(W^Wu{A zY`&^_+s3Zw)jBI{>mo~USvUO^ZeAI>1kv$Ai3m&N$r(CKl2n_bwo~4 zWYVMVRljQWff1K6X>pDYxrOk>@ssHT`kegBYf=%!-%5~GLe)29`&b-h9CdV%=H~1R zUTW_&-xEyXx#Iq0>Zv{ziymeG-2or+em*YEP|dSQuIa|gig&XB@t9rH^>V%s&*&R{ zd!?_e%fT1U;UNQ7bQoJG7VhUw4=T~-l{o8x4vyWKY-FO?rVKRmXMMeoySPB8nc!E; z=XRHV4U|7+60BWg4xwPZ<^kYO^wr!a9j6lc@AC{^An8%q?;@@Uk8Rv+i?3pl4 zpfaft5WD%=qRj9}E4pn)#pmQHNa#3MABTRew4@?%X)&rQxSM$0rdRJ;opJ8&7FG`+ zaL6BcT}5i9g!V3E-i~0b+1=o+k)Pmag{1uvm>*P*h_%&Km@d)!c;p=Yg~ow(YWm%+ z5^&jFRMditnv-jE!giVFe<{SJS4c%WJcHT z=&6bvem&oNqJF5K9+g^l-d^#{F^&P9CxMQ>%ZaIjiK?ntC%66M6FaC2%1(^9oO<0# z-}nh9;$w)D(MxKe0VdrpK(a{(19Jd}M!jmY=ljZhDVsIC!b%lGaQ>qYsy*r>B)Bv; zs^>nY$gC}GVqzd!ee%$sSf__GC_DpQYmv)=PqIXPxVA-$?8O_XO<-ATa^$}*POo<=Q zFw_H~-1VWQ)mS+3yYcv4hw+!6*G@YnY^K&3!DYUoeIdw5$qb#+M(L=S&lwLw5X+@R zrQ3KFno;7Nc6cPWF}$KMS&WqY%to@A$5q;}An14-KMU43_Hc$B+1*Y+CgG;Eh;%48 zRlN5Ej7wj^{FO6-)lVC2Ax^?`Yd&;%*&2Ka>PgZOfq~bdk^VbN6!#57veui*CY<8$ zH9v6}?uW}dqfnxTWi=Z6z-e7VnP40s1+z1I`0W`!C9WRC*9Ji=E^$3R zF0QG2DFXu7T){_cAqvl|rR7J9vY{(i`M%G%dY1vXVNqs0Nh8YI_^3wwD(I~11g~i-t*u7@PU|UixxzMfBN(|H|QP^&@UPr4`3jA z99+2QSg$>X!M_LY>XLgtNFor#V^3BOD2si5T`llhmVTNjKP9uW>_&Iz&TA+PwX-#i zfg9M~BD#LUXz>qb^F{R)^56GAHOjaR_L=lvQOdvm0;!*;$t>XNBcvh+mm1sz$)`58 z6y8terOp3Xzfaq#a3Bi&K1|Zsee{R>0xiwP;dGnBP-(YYV%x$!%ClKYVev3QjYK|i zkMw}e=Xz5G*{y;x|6ToI@ukB}t=Z0WbluD2J-t!q7$3ZV03%|f|IX$Vb-jbsIC{6) z3q`ymUKvg2HtOgGV#ia|9S%;0gH4*TxrvI|Vdjs0{!HGT7(*BiK}zZiq1Be(@TLs1 zTS^Y%OmGW&?)=dJU2Q!cALG(0+LJ$uHu6W8kw9KUpzo@0;Gn2YdbjAY7tcSjGO9j~ zxNC0yXY=Pf8zHkvjDpAg$EkJL5w%Bm&#`HGCy-9Hh|CXOGIGtqevzh<@;zW5<4r|Q%K)d>eObSG$1dP}2Tx2G-l|hv?6|hjid) zuS-5Wu^Etj>>fUe82v{4bGO>hqn}O2`_F4-h$J|osh~MpJpmUgLv|l=3^;D0F&fkn zB2Rvl)QI>Q47PwouDV8vYz%=lc8z2e6W3Ge03T&nXv-0;3JESM9PKJTH8gFru|7B$F$9O-3$i{4{Q zMGs#2{QVLx(zqmofU#kP_4ary;fanerO{m+kynZ)(;D89U{W-p$V}bcMDc%}6aUAA z>1rgP&w6(rmKm7s=b4PQwt4cTuw&v$EU1dBVBYtLcnX?@mUh-@s5Hm7@f8)2Fu9%K z6~(Y2_e7-zkQ!)fUs6&UJH?*L3scqQ_|fz`pT5}K?~`PAo$bn+KS@(xZ@4*2?!V5N z8`5`?mp2BSqLcc3a}oV5Z{14WX&scVJ^u0LQ{rPZH< zz-~e`eD5(iUxZ{4pY0C@HBXLMC`VnzCS20H1M!iA2Xjc9d+slKlAQaEd|AMQHq(Jo z5Eb{e?W>W()bE}byQ$dL*?u*K;9_%asu-d)Zneas>*Ki7{X$72*=Yrh=0~gEf+fzx z%T^MgISyF9Zv6@~pZIv7ad}BP*mRj-9Eoz2~DNLeuma(yuLG*F|As1t_ z7`re}^lJS_prs`PPkYjJ&F$=AU5&hq1h$=_@AM_4H z3qxb>9i{A2g?@G*UT5ZTN z$P+&wvlEk8Nc>S)y=Xz4T*aN~^Atl5vxz3-`frEqKBPtKH;&G!C5 z>ucmePArmOMD)vizHhZT9{Ei%nTlaC<(#iZ=*qEqFwIa9y3UZ+y;-sYIi@k-J~ z!8iE7eEdBwG%;bUrI<6U%S(LNG)J2wJn-vvowr)G4E_LgIS!R>hb|9SL{*HZl6=KO z`X{=A+eNv+#BZnVn#an>9WTq5Hc^5cVNFrWCuO@9Et<~(&P@VB+}~jZbrUf5(-OdI z5;%-d=la7lfnPfLZbvdkfJkZLiC42ob(tF7-pFXw+S(Hn-x;gJfvSdqEY)`K_gpJI z2|FWW%AwBV$7hR0Iuw4syB#5P^cYAhG{wb_ym_0dzF0nn8%GvKy*9xiLS%flXQ3rp zZ|P#Wbt@K$P^h26u`Ra|CUs{KGq3SBR_k^rHpX+@==Qdjl}Cxc&g!_#|9Td1Oj2oC zLF5Ycx`eR?On(BqVvz;R+cW9s)o&z*@Dvz$e{bM8O->GCQZKD9zy%Ps{$R(_a?nbm zcCT<6d_L&#@qx-KZjY;Ab+Or-LqeLp17K6+M47Tj4qQ4cH8qnxxxNY%A+KNWN0>!T z;jr7AqNTAL+nX{u15b4hr}Xd15~!$-pEyxetbPbUi-CPBVa3>Lqy8xwSIMA#-$>5V zKv9~Y0wG)qz^I%XTBbt(zS)W30X_m8(QQ)6iuc@0i%0`OrKfXVYYBbguEE`De`5m` z*evwF$bS2FpIJ#M{h%h2w-v)ZV7G0Q5F5LKJ(Q_IZECz+W9l3ApEa7pL@2T4@jb6*>Q(4@`33>(wPj2G``S=_ z4L20NA{{*vk);HP6L%< zQ0JGUFIyhqU$A)6<*ejgkDNcYn%~rcPO~e~`Rw6X;Ps+X@@-5lnJmrr>i$Z$S%zf6 zz_Vkg3Wqc=xaJl^`P*Hn&5>U>%V^PSYwV8}gB0Lb@Lh(K8fd;^<^A^=8h+;LrFbkm zn>UH9?ps)##W|k?WVdP4xn%GY9DYNv4U*uyib7Ua-Zm*Zc1owv(9uK~_GKz6Z2&(S zIphvb>l<}{2SGplH7O`Di`-ei2R0!3!*&&5>H?R~GxeKz$~kMMHn#5qkXhRH8G#vg zhS?nM!9PLpsT2}fvC*sL_N<5D-o(Vj&s<|B)A5*u0&6R)BFi@OlN3ITpMM1pE-6O+ zMKqf}oY;&Q<;`^Rl6-OU>_^*@S=a&}7(W#|SgB3e-R+TU%&i7eX)=L78#=CQ;hO?N z@!4iZ%*NH&ivfeKaO*{&O+Na|#(~ktBw$7ldY-`Lw`!F;)r;O1lf#V#1^@>$)$U;{ z4=6r>Rp(cnK7_3*&!W?gUH7p3dy+P&v7-*Lm%!h6%~>me4vIJt5fPZD=}@=3Bx>Oa*{IS$sI>Sv zcu)AQs#~}0I6{tBNod|fr`Z@xw&+Z)XQG^&_29!JiIQfrFVY#lhZ~l-RD}ZLN6sSh zGGox@km1N!`Yx@Oyx1F3>Ty`7VdQvQO_kg3ZUbew@#inA)_#g*Z|t`AvHqPYn;gW- zZE4a4qGo?&`BG9`=H46)cMeB$g9C9ox)?`!C550BF^bz+EP#nPH8$Q05FpqPxjcNt z0A;;hgh#Z+dU9_ze9@gIz{sw8oAeo!VF~D&q~ZxSQa-eVNMckXEy36BA~nDW?S!9E z^4C0wJOx$Nd{U&pH-o%irEN*9_>Dz|;Ai-zyyh6ML~P*P(Ja3?u(cw`GPe*}J2QOdm=P{>c1It~}^V-yA<_Gkb6 zc@-^%o3Jc{57Blom*y;!7<<6r#+iTc1%R^p%MZ}aZxW92aNo}x_ zsb;5&Uc&oR^MrX4R&Tt^&Cel>s90XG67w@jYSG>Z8O}Lr|#uHVk+=ge+y#B7$Uc21?S6z2^T8NM^^-oP8}XU&H453?aGc& z3gP|RXcGUE`d{;*|8IYxw{lMx`i@#3?VmXhL#8t=DVSA+J#fk;5Axs}{q#F3a&J^k zO!9?|c-Yw&sp#n+k-I^-hO4XV{8$F}=lgjV4^*m)I(U8+m=aa&XU?1f4(w%!@*5;l z+1mQ!zb6UYntraIb;dct)a3++35y1_Igta)KfmaOmD%?RZOoWK$_PCQ83(IaqxdI` z;N~nt%2jB=^Sln5CP)(fJ72zh33;)vKR2HE`k5oR$mdsXaYbsJu79MNVAMr{d@3An zET|Y#W{aWBIeC`#`IOkH`a>hoo8n&Nkh9>)0he-eIQlzjE_h>qNX!q{Wb=<)7w+L` zGLtx-8YSfxA>2XK?$%U}pS0su&FmOPh;5qeC|KKjS>XjP3l|gwn06VI%qDc_*!OSV z_X;yDO3kkrBfkz9#je>3W(1nvoziQH7&qOqxkT}8MWB3>^_MCsmLKRE899*uBP;~e z-|&-&Z;jmH^mXV=zACeUX4(Dd69^UzmQ#3n@+^}pfR!ZlvRfyhxR%8Z3KR+ZP1}Rn z_9z4#wE9!Zwk86Ux>nC^`}0##w)32T@j_n-H=ryG@*83gjJ@Ns^I%aFo(`h(e%dMN zgRNpJ8Eokl_nIebZ2UP_A0^xV*`m2SM~#j|+H<+NRolXAw(31#C7W9XpQbR(Vji-9 zJ}i4%LtjnKhGYDts3_-;a$oE^M!*R^*~7R9T}()d#-|DVvNE*8hKfvBIBMo-k+Ccj~({1 zn7oV;b*ip9hLI=8dRJ9lUKwxM6s&86a|Eap3sElNz1cx8=24T4P;y@xis)~y)3j4P z1JSdYEi9fQ4voAd|2>R(GL|597`krbS?wwGXLQcV#0RH$erLsMYHyp|&sr!tnyT69 zpQjKSxQMGoKd*hU);Rj&xr(YP^zu|NHSuZx_}6#bNQiC{Bl!{;#m$YqLIM(iww=7; zS6}F63_sWw8SIXKy-~Bbp~h!iOdklNhmw*M4j~585$0Smkf_n|Pr|6gqpCKUWse6# zWqjP5mOV;5F-{-V({6*qDJUpg{?$7^$OunomV7mr&M?h$MZmcF727Oc9T3}nET>Sw z$m6nHl-zKIf^0uRNVPih`WMWR3|)cDi+cU4zc`y|Yu6zt8or!+Pp37gp- zrB~{Npge$C6|y+R*n6 z!JANy;T)G4%bkaPhH59EO#x+&IgrWe1~&raKTqoaz;ATO1yvBC&>>1zbxz5FKMbCT zNqI<;xbf`<%~gn@>1(hn>4vOcu=-BEo|~QRDKt~uSylU*9^V|>7DF#(%~vO1w^h5? zCBhNAs*;>0hd5lQ5?DR{E41cCwsWlto}U)tZx&t;_Vx^vEjGISbMXH<{Qn*tb-RXg zpM78mkwlAoI2+_g$bK>MoT{&!8^^|2Ygzn=i9)&>K^V(zZ8ItX{e_&2mYIJr)GBe> z)$o3s@75&~9w-Rb+zJ(h$g-_1cg*(x0WvkL(_re?pO5Vhtvh!8$z35OrN|h0H*K@` z{r{fN(At!#dSQ%&R`9`BNXZ2?%IBKNvc;cfd*Q2<6&Pb?w7ja>jUzxVl$af?!b0o2 zDrzl~lz7mF(=k43`B%Ri5>Aq(4NW>l~i}Ug=DF2Ed)lK-5E47Gf zM|(opASVO7A4H!wKp4K<0W4AmRen|arvG{LmExp~CJwM%)DP>AWSAme1iQE#KlQL` zFWKJPzQ+>M?6q!wH-T^;3+~$e9hgS`HYJ@BPZ~ zE%*C;rp+aovz%8X>Dk!W_7rv`zx6#T2>8#F9&=UKtE02^cU^%0+UDj|gDtZ7u{T&` zv>xG#t!kvrE3?N@&RUJ;>lQavS5_u^ zlhKwuHk8$(^iG#BVGEJtkAUUUd$(KJ+kfi{Oq_veIWri&LC(DOW$qAmNYSUTf-xTa z;e~=1NY<_oGwXmDU~Z88=QDBqzr&`NZGhwg)Q7ik`!wI#4`uPJroMH6$DhvAe$g4O z9vZ4yOPN%UAfZr>?%zE;JOZub+oUAJk8?PyB7@U8CTScV`*+l2c_;57r_|HhWCk3> z)vbGZu*1~O{{;eF75Qs_hR1oD96+fO;pv&{svqWj9|mF^fjI~D_e`ZxzU;dn7z_qR z&aPfdL3jQB{V1Vf;tDAlnHyLaD;>pCWcc_xM@wyWv9G8&G_TgB;usqdBnh8iZgGq; z;hEy}VZ5(&T6%43yIbyaBW>*oo~gMQcn9q7kkC)zSh*NaaDBl*q<_5xRQ0TLa{gV2 zspx$m4n_Ls)$09UCUE@!^^4#3m5Z+z6q#_b-rU4SVAe8vnkjU7vl@QParQICuj!ntF&w9uZfCL}OrkkkoYj ztpjC7=w#F8WzQY)U_uXU^L1HrEY5a{0VeW-5%i?jH8m+%hRX8qcK^?0EDAmA<`nI{ zX!o(SYtfHB$34Tyc32z`$N~!r1V^i}?{GBwkIIH#nU;q`@XWCvRciXx+e>%;RY$o6 zB+eu~?fcXIdHzQZb%Kdb#CCn2RbOXPr4eWPTwI*nwGix>cglij9rqQtN#+|Y}es8U4#A4*s6tD zikhwV&m;~bYcht0hUwz}+C8XnHlK<`$0F4LLV@rZ2C8qMB*yvd(Ou@|Hq%l&_I2F+ z{Zo_&bWslhgo{~zSV3hd*k00-0(p8`6wHlo7;^K?j}at%|4S9*mHsppt`YWNPGM=J z=tXLVl!;?Y3lnZbD4yT&=vP>PWj6+InOI>0qvBp!7L&bvkDX)DtZeXcPbm*z z_v?*rZf>>%h3~U}JcUw>sMOv~^#5d>EpBTY;%&C}NQ*EP8C79ED5Ay3$(dxPh~(`h zllEM^-S0Gt!}w!;; z3zP<>OQfVlKpK?p?uJQsPnz$Zy4K$NJ=go4>zwyo*LR*j_I9zBlV?8h``z~#;~wJ^ zB(nWJLaKDbILaXwhc>N8#>|Wv1esmP@kw9!Qu$`YAC6FY?nBBs6>ArfmNc+af=bHe zezLmzP&YlyOS|O^WceCT9qZbbDNxCaNy^GLGoiflhb&-acQpfaXMeL?NJr5NX#b*)QVNC-A5nmTfFu+R>Ipz}H9OydQ zwPFEdA!l1>Dt}%{JF5(bsWt=d&7b#9G{O3ST^$FeRptPC{cN80OjJ(NZLF`shV(hN zYo)?}SD6qZniK(y2RGvQLf_~ z;$*m!C0@31+DfFMp`j64qXtQ<6aTDVVac-8IUr`azuWl;AXapp;%eNC4Lp-q6XC@9 z>l_>e5`OQzFH>SZDzXxUB23-sukYXU-}}E$hSVZ3It`5q`31>gu2u`2U^oZ&3!mEB zaH^a5ZC}=+qqP*evVlmjiv%8+F>T&;6A98ZZm-b|i|yuz>Zle_W&Kk123=3k$vP8s zdQTQl!j8r1?2MpBZY~xWPlhkHGEo%-i4MW>A&M0*cU>HN$MYj%@euGs}cUZ|?o=4TrqVOvl9)a+%W8xUuI<+RBRkQE9}mw8}UH zouxer)|GrYg2Y=QEIEF$x~8#-!<+@aafY`H(nXz54=RPBOmRYe@8J_PEA zNADljiSgN7fvY5iOTy{2a~qgJuzvVB9&(CXBCgv3oAIaWI*ykGew>nmVTJKT zrAKQ#-^Z+0c|c#bHoP$5l5);B(3VupQ}1J=Z4E81?X9HDuR3?Hd^cK=8*D(E!9RZd zBC5!%b1Bhbwd>8-1v1ZPW!}1;>|$5uinrq3gx8g#{A;FaC#E}!@{NGKr)Or4zK2b4 zZZ>G>i=mvb0(ezcOZo+snwfKr@CMmHLNPvKU|1F+B^_Vz;kzgO_|KN-WiHPJOkWESK zl#GE;{^(c^f-9O@+LClCUP>-r>)5S2Yj2|#cBwzL-6JSJnL7^(e&q6cCH8YvLfO}e zZm}%g$Ah`5a6lO(93i_Dl=~FjPYYkl9#gu77z!h8t*dU{j0qIorPO>RPgY zguU^rHwap`pH@XM?jsGOvY-FvDp1 zRH}%UFl?g3g99NrnK+~TA#y6J6+1yHdJtyjynTDVsLjaU2dM5Ce#<2qF1^|hbUj>8 z%+gJzh-c;#z%=-gs_McMs51qrV3_A?x389z)H`Eshd0d#SgR@)zIGcX9~`*qND15? zo8O#wm2ma7f<6#!L61Gz)If{;k)yruI4;Uwv7>wlvJHD(lif#it*5V!)>nPTtkRx> zrM}s~bbQ&mUVV`+md%*sfZHK0>S%p=p?i~rp@I+7OT=yLU7u0*hP~44GI@UFNsnlK zl@PG4L^N*65}Hv_2q7cj;6Y1w!3&$#Gt%b})nLKD-Q`1z#`Xa8Dn?ZvK?uc6;?X)X zkY+6Eq=o>E=#6{GqK5p5yH@Dh)I7EE?c z${AyF=vMlp30@n|#a|ZzHi$oMXp7sv2}y9r-0Q|v_>3^*@%V8UvFBR)@nMTn>xnHs z08p?Qy#`1<)$0EJclBE3HaA3^E#{k9a;MQ8-~cUx`)oep6`_RR%1Y8s`8GZcVoRpl ztQX_6?MDWTWSWO5jgQ}gmf$3vcDvE5VX)wZ*t$}@ypGPI)9-mcsBkIJ!F+)-vht7y zkF?%oWZ>`5%!bVMor-xKtJP6*j2J#LuhuM9r3C-h?vL-W-kjr#^6=`e9@*5)q^Hm6 zMv#!w9>KU{eyJ8aP-K|5?TB3WWN`8D4qN7_>c^~}$3LvtfT}zf9Pjz|#+!=(p~`~# zsTjJ>a$db#>xg46wahl2oZoFrSBgICu%q!*#W z9p9FVJH`WyII(}4l_lTR?*}~-JBTc2-p8S15zN!tc`b;rCGG4MEA14Gx$gPk&4E~N z>oBs*9n~h#dblR?*&$a5fk31pHZO>kIU4@Fc}72Pf)5xjl(pd00Y?aKmu@a35tO`_ zf9XcI4q%9Sfypm{36GA%8lSJ~9GCKkAbNftv>aH^Tjtu159Vok&3Yp@tt*@MR!0^9 zlf>YuWEv}5wI~_0ia)NpbG)pZZR$E3Cb_t+Oh7f+`Rk4G$>;#1{Q2w5!p%G_te!*N zmpsBj_5q*llTPdTKL6``QeB!~Dp=T?RSg%vnIairnoR-NFf{xD7K=({djeO%^rj%4 zc5`+<;c=NFb$ullrcX^1NCiNsPH1uYOLFqtw;nht9JhbhPIj-l{2|SP8|K_y_7kx| zgmal8{{x5xVimFFBG{+W8?b{NEre2`LP!DC3NYEVd}i_>SF;H#MoYEk&bIts^zwlD zkSk(KM9XoN5B;7}j}&n^?U?^85i0^A4X^n)c+N_o2k(lxl3-MAQ#a7n-UnaH>411; zyu$C@Ho|bRo8DsNM_9c=v>n_lXk5y9cU;j!LLXBV_Q9M|C0|XUGGUWV*W-X51I(AF zvIWMkOK?OS(YOSoIm(-RHvu6zpU%YOE%2K@x>~{+`Tw0idQ=)x{64nTOzcD^a2H9D z?~G#C*EoFug@ajNMo3hYYd2G)p(d;6phZMzyyspTS%NPlQgU)OLf_DJ;IdW{XqvbG z7-$&s#YH08k(L}*AVhY9mp&D1!*m5j%%5$US^FQI(AFsdPO@>r)62H2^3tnqtFRwkl*-Iv#0zOZKWMn4)W<@Sk zPupapoCXgnDB$1^`T8SjP_*cyWM|P3#DD1Ar>()x`91m(w%Rd=$T(cE2de-4 z>z+;d+~h#QJoy8`p&5cyZifvX3yrg~f3Z;a*{|SBU&V2AhG9f)peQiqV-9a5cyM3# z>ZC~AS#;x2kvNDw6Stu)b2^dv0|AK7?%er(?a`ONN+pcBJS@!fR-7}V!mU9w!%3cw zEse9YbDSm{S1RMg<6w?=YIzx4W5i5=5CNPGm~Q>G*dgzb^1{+BW?_e=w{1>1knJ#e zM9yPVA}hKI97@WGLJ|0jwV-$^Q*4n8x6*FqF^gBW{(1Rf1+dG@1jZZvARjNfz zTG0=6-vW$)nTPT9KWHK+9#BjId#F4HnEcPlejR&`39)_)b_Scf<*a8~6$ zlN(qo+N`gYiQf}daP`z<|igvy1qUMWd?+27?%|*>mG;uxx$fYjZ&maw4ipe(BM**KdjLp1b3FInVF9LWb9COLf+) zQl|?kzCT}ImXdNFOU=xsWByE({`w(~!qrDFaoGyq5=HhleL@8_1`EAaSZC!S%Izlw>AJzy_yjGzG3+W zIM;!3^6243+4k4;x8HYmKKf!NMVJuWI4)MkzArEpon}|*8RTk)i+=->&cKAG{?{A$ zSwH+NV>vxGcS1kj_u(Y&f^m72JOjQQBtqdrYJA3UFDJ_N11Otpy;$Jdy|#*6O78}vh(tOg046$og_q(Sb;VbA>FD5(SQ%>el4@zqG9%XaLKfl zX5CL{wpH(+)0N~KzgtuN-rpCUD;#5G)iiOo3*+M^KPBob^jYa8Bxp0+=FI*3vMF1% zQRBv6h1nSyeOxEn41Wekd>dJfY$I7)>5Dm(k!g(*BW!q#tx|d5-DT}RH5XpgdAvk& zyc#yZ#MI?05RyT6i}zDjO_a;%X@Gl3{;X|TlW?reLzAyuj^n&avv<=QUCnSV!5QLy zp_@<7NwZ5-oe?Dt`APbyC|bN1b(Lo6=&$x^J*V|?bczz$;F;^z)|P)ta@zWA4dUb@ zN_?O6-Gz4s^9Fe~zs^~ix%%bx8n>D!k&8MA=FhSHTy+9RxjP`pn0~l+6=R%cTiAmJ znipCRJTH!V#Dn0zr%r!e#d!`-BM~tPMGf72^4D*{pFiWC8LDlovM2jSr!lB34$_g{ zm1;v@zPlM;U76`#aXin#3)=N)Bx6>G_0}U-;&4MkK9VyY)NT02M&~wu9U6xb?=#bf1Y5k9iL{H0 zZUO)CU#cKiSq+R0xjvuS|3|zu&N(x6m48;85Xr>)f5Gz)FLY+7LeUPtn+|d}7lsRE z!FH@#$bRZB9%leDRR4`g~iz6Fok8lB)X$81}Y{kLEY8pN!B+RZ}GrDk%Z`-;bpRT>2AKZ;-5>!LnAJ!L^4U+$F4OFyOn3 z?zZNaud*6})$wT^=_Am(lJmOUuJNg;{hpFuU!Zz5I!$><8;ZRhH(M{=RtxUONk$6j zej1!|r~RB4`vc(px$yZxTXgy1Atj_IOgRXD@b#Y_D{460vN=4k=SN1h868##dOZWF z^v~0i+PVhFO0woLpTnDQNuxwM97y&deo6u!DU2b0X7}ZW+vtM2?tDWS3%SVLW&Moq zXWJ{+^cRwIC0%uF{*oh&b2CU4G! zmo|!#reS%PVnQtkl52Z%Jg{}|-2`(DuzUpb4!khZ2M{=$8{qnJiO&pH=>XI8ySz&D zSHP;%zie$`iqw28^|F%a0WYYOcj^F@Yhy2q70~gx;3Z9S!~#m)=|%YbRVVwl!T~P5 zUK3BPl5>7_cEji|j5e?xaod?`&WyG{t8o4p7uN=Zdrg$q0fxx>%PYg0hx4LiWN9tf z8DN~w1D0P-Yw|p)$Gy1;wO`eBaU1JL-r3y9Mc>eabo33Sftdtb@FHkTOK@ND116L6 zI3>}Ye@gD@*h>~%QdW$~AqY4(>b`~kXQlv(JY$p<`0n}MEGa24pLi7*S9*nzu;z0j z2bbHNyr*WFH)DcpxHW^4-g>-PTKFW) z)y#l9@olx^KU#p8lB$k3?p#y$v5ILN<161=2CJ-Tg{sEF)ipF4{TF*|&-yiv78}Bd zNJ&3xNPNhC#-HGH8r$Ylm8D&?I_Ac?*}~yoq;_`L@-&>|nQYOB+s0|JbGwOu&n#A0 zlL5E4;*y0~W^{f9146`-8B8l~rdnx_yP>Ed=Wn4i51m+h6W+jCxd?7R`X)4t?E)$` zQ)5hAuWZ4)bPWTA7GwZzg7O=L0bkJ$y#e(_J$VE<{I7D5A6*GBYw>iV=rM zgi`=AF+Y_t*GA60A*CM)6U8K_-@NA9a`!y8-Q_a-(cbXDKZL?7Cot~7b9T5cExOf- zwK7x@1I{wgjQ&!R$hpOHvj!CpamM2Vop6FT!APDJ(okMoj{N8bYnGg{sf!m0ZlCas zc4zQ?_^_+F+Y^KqevX4<`AM>YH~v_%>`Isg>wLF?f^8GI#GDQ?=WBRwZiY<)#40b4d^80G{;H+xmi zWBYI#@5$>Tvpsx9_Lm8jxHmI7hQ1pTLayc=FqUvR3F}Hh3^Hdi>nKUh1UcFw`p|EC zArvbhCqEpos3*c$bVH#>+^Pn13gZ0T<}EQQV|aX=$B#sucb3}VJ!u6w=m$T)?XhZO zgTkk-E1Qh2+q(k~(Q+Ed%HcZo%PpR&2cfP76Glq}o8feXE=F)nObaYMHQ;%jO%}qF z?`BNl=jmp7%-}xI&P#H#;gNEdT{LIfr%pVV9@1nncZyA8P(6=SiX>DoGWpd&>oG$r zQg4*sh4_h)s&L?4-r>a?ig>Sn%_)glG z;MCwnJklil5{8aAo)~y9_oxwKrq_VSu24|EC;~s??@MX49tT-9 zK0`W2sJ`MsL8uK(APSTzAaH#qIw3(x+0HJ^s{Br0S-fu}tx^DhCH4*gX;VoDg+^*j zIJanPe%M{kPiy7L#qjm>I}Y^oy@W$RfbxrzcX2r{B_-t|cG{uNbek1s(yN`_SFrD4 zC`Ap}tu=cR;-Bvon21gz4U&vcGlU)PbaWoG^0sl|v+X(ce9&CSOnA*6IG_v+TIo-sJe z-OI|zXx>%5&y39ncw>7FG%h7a<45jA=2Z4g^o}MT=9CvJ_FwCYGBHIxk)TF|KYDYK zDLKL;HE3~$AVyJX!Vf@V#W-Og@7&wl*W?Wy& zk2tMD^1ET`i$cmz<0Mb_TrC=o7f;1Ud$)|@J+@@v8dLNzI{rWcUdC@dUh60@`ZJJv z#A6dZ&jEu+`+-w4`mv@u89A_QM})=3w(kd#)lS)9bXFKE-Ro;w9n1HDF6G+t z!2BS4Ik?>RD#`9;KO8UOhy$CLdc+~Zv*-!cm5 zKf0*cJ3&2r%g+&*-m>+Qhyh*lfRWWNMs3l(S(+b%gRfMTZb6x+s}x^5h8k}mR@Zsg zW|Sn|A!6b*H0v(nF-#t0TUxGaY3!!Jo_W0rUd{-v=^jmJ$4eV z@eY~+NP1?ACC8xg+f=bu!&$}b+{`z~@s3|VI|owy$W|k0v1@wC^S?e}DQz_YoPa^` zI8YOw1`Tir4mwHU=-6HFa68-gf<+pjE0Wcl z^_|T+Dr8G=-xE4JoTQbH+fo=RI>)&dmnV8w?I$14ji!%{j2P}+tZaOo9UiRGDHl;NlzX@`v?__bP{b0&Gj&ulxCC)pZG{ofgp$YqpS;evMt_ zE6D;>WfMVr76ip@Dx?Czn3Hk@E1Ejy4Ug}gn4oMBL!Ep$qIJ0fJZx39*`Vp(Sf2H! z)){G}sG~4@1TKi@CB`Y$*Vy{tBAKO5h#%w8ibL!H@_`Cyl$)k(BEhRwJ}N582s)f5 zFobgxr7;JujY4?$F203HPMh2TbJWWUK58keiQJ?9935>V)vHXIEBS%VA7ky9MDQf= z9@fcPMcV0{b+j4r?3wimhQ^r7gE3}-H96=E`g4!MzJ9%pZ)_O1LB;9?q+G1xJWhu$ z6N{i=WN>Ha$9OqrpY1r6S)mCoKBc+^_jy%UX1!LcF*lppC+b{gwKn=ov9aqeAU6O^ z^FVBQRZn0kY@itY`u(Tu*mO%jy|{->S;P3`s{N8hgS=H_b+mB=Sq-COUvYRE^_j!K z%tv^K=~+c%VG#{T@458-DS(Zh1AB<$Wr@~(Ckmj4SyePkRU8AN`I_3BOTSw2h^ZTk zq}`uE*_X}}H}nQepF`_9eMW-LSqJSDg-@hU+ck|Y* zw~?ieCtHTA6GaI?4NgxJ{#>RP^T^FR@AYlNMo(XVsLYr{N-9OSQ_<;EAO7`Um&G~R*io?M5fj~$Utr8hTE_M|XUZ&tR*pN#p!i{7zLOYoQNJ-~oj~npdgFk(GKt!}3gld0g&56)CAo%F{ zqVtMcw$`tCq(mJ|F`S4FK#6 zHb7M(eDKkMB+0MO%Oh9ilVK(>Vr2MSipa5i99N7uYD{}=YvKL-zl2BoLrhiD_Up3M zSU@Ya;TM+*m3w|+@Gu&6p}p}6l?41AyY5+(8}-+IRSX@ zM9>gfu|{jGc);7YFL^D8TRA+XbH~AYVW?DwIGPOrVg1Q_w4 zuK>m?8^7L$Zcl$ca8-~>TC>DG-P-MteayH>r-Aq_GuVYy-9Do6f?&jpNDbX}U-kvz+meN1yj)c%mS@=)*fy2kx>tw)bKFIbni z)G^)uI$c?77T^5ti!1Xh$!*nhccj{X!``0Q z=(OQWc8oi3pB%f+m&<0AOC&TP8N_eIKaUB3R_)M?hlhKx)KM`ZMy7p^fWpvvybQ0^8iLCc(0K34{rM16?}S{|(Ufd3eiw z;J6i@>Rmsnft*VT|7k_PB-&duhTOlGPMs9vu>wGB>c6C?x%sjcS3JFNPdk1i3>gUfGK}Y-fgi`I{ zLwYwd)Oe+4S7JRX|3(LwoJ!zNufH~;kySKArX+Q1<3g`*kuRs=*8Q~w57Iah=Nlfn z!pj3EW~@TiZapZyT%$Bad4CR&X*`tA(oM~vV)(c|8!uLtr=Cwps8S@4$y-{$FR=MYzGO3_P09oY2q1BJ>-OCZHNrf=R5o z^w@mBc$Z!>&o84Q)99}4vmfTNPjncnJrut^}iCIgtSg4%4mM9mOBRCpd|2O99 z;@T*=wT-*r+CUAJonHIORsu02oiW&466 zS_yRlvYPm1K0UwqeTCcJ6+)E=2>N_Jz0U!cTUDy#H>mk_0S#)de>q#4b`Xvdcf91h zx7Ic)lpkO!L9pxb*5^=sn$&Hh10B_v`f(0ope)5{&zN!pPAP9nL(DiWiHh>H0Ze>X z29Px8^E%>y!>_^gC)09Ny9R^DF1@}EW!q$8O%$Isrd5%jzdzog*fx>0T@cv>JKcQa ztQ`naG4(Z)mElw+Ct2C`P&vH6{}F2Q`^?dcMFbLPpEAqQ;;v6oQKldeNli|^g)TdW zjPf->I?_fH)Ib5DdTdNgd6+j~JZ^M(cep~wT0uI*4Sae2)Eby*)VdXNOoYtj!=Pq3 zpO!zkeqi(K*9~akfRs^5RXzto)wf(Tj6$=@P8K~6$p3~<=WmK0&p1<^tL+s#HQ{u7 zpHc?-C0tSR_(2UH35Yba)r{s11?=zd5rPSM%Hp@0#5yUmM6D!_ezoIxSlMLLjb z@yrHMFum$LZzJfRsKU%HZj0qTJ^jTF`438~?5edB^Y39a)${1K-2Xc+MCBOT-4+rxWRjQ=yg2E8Lg74e7%;%oL6 zo!kiEnI*3=o(UCpeE%Wc91rWtwQI69pNLwGT3qAM?oPiCc6Q7j7fOD;TVq!1R(M!o z2eK&e{5o4sNqZ!-x~%L?n1Wvssaz|i+(${%>T^dmtA>?UxDn`3Z<9<-y)bqJVZ)!J zr1%2tuBssJ2gJ!>ZAG(QwIrIq%s<|F4=@A?1Pz~A?IN^gO3_X3M$?yudQAaH1egf8K=%mO5cj$FIkZi!Czfh{+s(f*AI1?Ui+-$zCua}Vs@Kg2>Fr*!C2?haEHSoB5H`=O<#E)XY?Xf>vR z@n7~!CUPHqOis6cyx||K5F!_B-3p$Hc}{I+_*8=g`w2-9h*7>(AG4yQWDKEkqn-_M zc$5bM6K({?M&0wTd?4EfYZ7{=WcvXtho#{*^`2}ug4dS(6M6p-;i}XPW%5tnHW{Fm zKgkn3N}I@LVhmO#g}M-DA}{ce$a^vNa++|7%ea4YxC9)h!$NNe zhdAYWrVxx6Z?)Q=knP-+0L1m8*E`%QFCzcv3waq%(RS)OThEE-R&vq-)P%dI}v$(|{Z3OuHcp?>M zfuK3(pCPte0i4k>>#*ots)3D;aXqy`kHe5zob)%a-P$)>|@!vc{ z<>jjVc|753hkFfcp??f@TNQ!d?7rd`jK_svBCBk01ja_Md71TP5&{wyn}xjmee`BY zZ9^Sw#RJwn7rZoiDrcLF<7>FHfpSL7e0Ue8m#N7*#g#}O&t=O z{Qs&#(<$VuJobN2cq8irQo#co24OgXw2tED;b{X89|$+G-g6P{2l=Hr2<9*U#TC;w zrIS0bw)@gt*mtxiFd*M)cZoacv=Ydb$AxAgALH)X+Jc}>uc+WK02Ta67ME5Id?_+?^>srE}RGkoJ zIW!>3y;NV%ZPNHCn%8p9Z+6B2$hmb;dEI3%Nya}r-9W(JFYIh0t*T0-UFO(e+xtsh z*Yi~al8NVOI!r=utrMJKOQPw??|<%w@)I=3tX#hllJwB3)2qS_wbkQGeCt+!5?9%+806IQ-eeL;NDpP&12L~VqHFn)KRJ{IEEqgYB z!ty9M#n2xfA^^KVi7x&)JTed7`GhfEp6ZNL6!n;s8_$9{r4I732d` zDxBLRi@-mV`=Gt7py88<{C#ds9F0(%UL_)`#UhZX-B*$@1irbPXOB%+0o>N3oFSBn zY<1Wf0)P%Ftg$W1FdpjRy@Pa%#gb(jtDq1_5_ z-D!NBQ?e(lhn(Ku`4|Ld@>3OvF*m~z@)N&koE+P)vN2;Usj0WNA7{@ zsqawj^f1CFV3yIO^YaZ19|Gg=?u*J85cUIO0@NOSz%bkd3`3z0xIMv z1?G-iCom^BUG@hg&H|BNvAj->_Ec6_8R)9pt0WF-%{@<}3NsN#vs=WK+UkE+$>goS zB8jabL#np!U}E}-8sr6DR#E;72Zt{eoudrHB_@NnFBCPj8K0qWI>dHwAxh`jA-v(? z?owY#wu&+Gnc|gePhVbc24zE?T}%1JZ_;nEo)=yOhe15YrP}8pdk3bHO3>z*+z!I) z2OO{(n}u6{dY+)kBv@Qvu_fgQqN=MpLrFl7SSkGHZlzP5OWowRsC_7YaEyBwag^A< z@XP0{+E`b9M~qDS{)|NmuUW0c*~tz4@s}}x7h`baQ`0drQi6a@?MJ!R5o#UlI#6~n z&4B&c)sMtbZm`Um1B0HP-5ZbU=OiY_*4%O~*Fk1(B)98#T}#NWlp>^}YJIzj1at^D zNMetaN}9U1uFf8CL-LkCS89fU1oS9SjCD@^2!!miIu5JCr;Gg+KDzR7J|~CEx#*-x z0K=ko+En>1MrFOLI;soNg=GK9;n`sHZtRy_k`r+p?@>%O5Kh*Pi+ty3P%ODc2=}(5I4cB>HozwZ@-DDD-4;vEJ_Q zclQmt*^lZ;+icXOO*8E=vKag}PFe+l0IBlvtylyoHkHfh#UX0`h-WJQOkZW~B09!8 zTHBWXrqAUIpCKs%W}Wiw4(!mDHXa^_o!{80A*ed?Pa`c4(%JAg$54u0gP`pQz-cpC;kt+ z9|w0wEH%^pNO?|sl+Y21b8XJ`FL3eeHM6MCNwFKz1jV3f)v0{DtVJhgcyyo}Ag@WA z*?rm6-2Tr5aB?Wl*LupI0v{Q+rWg~r*H(*cs2n@5C>Z=U%89+monett3_J~(u&qL3TRcP4;oD#NegVJpIe(1l#1#J= zht^$()#3UrJInF%596qDIV6Ju_)?^jn~8%11b`aZNms#$6fyn*ik#)# z)5{Spby=>s`<{=PPq6WgR$}xUTN^pU!R;q*9_;7i_`meP)Ac`V)%d$I0|85p zS4rPaUM0Z+HDcpbP}~I(tDEJq9PZhG7Lnn%yt<_QoR(<{yr5(e7S?{_x{JBm2X3L-kn-sxhfOG1nbucoCM)W7roP;Q>R_BIOg;m>0i{rcQtaVYrT&t{Y*{$Ny0M6!p>q$8vLqw)4_6DE$2V zogm65g!vc6z%>;cN8chval@X~$k3CP+vCFI@RKZCwgA(sA%q%c{I$wA$x%~|pH|`# z-Kis7YopXe>#^@d)~|kG#dyuP#El_~pTldQxTdk1hw^r4NI zeQq+kIB2C-CHRGWM2m+5V|+Cp>(#u-dvx$SK=(H70MB-#jOy|}`JKXCZts-uTj8hk zgAXp9%2%DBioQ%xWftD&zwy1}WmT-IPL4kxRh)elmsX;KSnzka8ZL3tm%FxddB&@2 zCLNyR2i^FxTjnVQlQXrukh3;p0bC6myEtaKPInKALIvaPJ0C(y%9e34H+TVgQ(5k7 zxt~i+yitkt_rFKgB&M8t_n$R`UF~l~tLZXDcecLUC0r$otp5wkWGt`#{>9A)p`qRH zU%$R9&+zqe{>9~i?D^TmH-avctu(PQ@NbeYHnm3aE&ET?Z5?%4cVfxyvJ>Xr=li84 zhNJZO$BpHxbF*ajySFe#hbV=(x7qKh%?N4}oWH)aC5=n);3PX=Ko;98grvOknAPQIca)`!%L_s zb9k-1PWms!#dn2k0rfjL@SfcgOd%bgzWFJcgDX|)zT#y25c+)xe;V;3djQ{lkiPyJ z$ljXH53Kvsf5BhNf>6(nl|Zz$bGq=kj7@%^gRWg$>MAhhsoIA~B_6{q128+)E&uPK zINeHg$`#EXH;LR8m=;F2EM!85d{yoSs-M>PHS$?+FSz7qvS#)*2M81y)cF!u4yM-+ zmhc3`iTps?P#Ml{r5I2#kAkSLz z<@xyaJ~Yl;^4En{o^g!-LbY{|%>&GCI$Df_btKUNb=z*=)Bk;OQ<(3-Sk_zTM}D@* zhye=t?Ku(Tw+q-vR(5gzUM9yiCy@wUS7M|5cP;EyvAX>^FIqE`0t{z|Ve}N-;TXje z<0tY*oBbeKHr_LbHc7g?wVIX$13kT5872M^bjErRv-|S^0XOkTAj)03>o5o}2{u)&rc+h;(Oa#T1UDj1F31_^ z$GVYDwhzA_a3xYPVS8<+{VLm&5&kc5{vkzsw(fNMxCNCgdeuFL+2?|_Z`6HX{CGyC zzT$)gHusl%l`-q{9XG+^HkVyo{MBD&aWEfdV~VV=bkWhFxlGBw!#Dl|0&-fiwev56 zw#L9|}yK1aPO5Et?5><^%2AVJRSTgJ_CDCU)j}h-)B5RuIqDUopJo;O_cSK!P9qEIxx+Ev(LafE7%5$HM^cQYML#*vX}+VR-o(#J`B z@dAYASD&!>9`1g0{V{yeJxh zCUJBqQ(*UFXe5uDQPfpvf|I{gh%$fU=kWayFdI@OZiuID*7i(GE@DkAU`jSy4i(R9 zZJW)dl`gh5koNvV0G~HYq2v(?)L^7VUKZsLM+_R*bDyj@ZMbu*4h6K>Nntu;@<=Lu zhgL8$&pPl1$b2=P<`9fi`m`C%B0Cs3mv*__xlVcXanKZ`CalV>B@^2n1QK*YLQ%#E zhb;I$Sb`^Haw-wuoZ2WD6r<2PPaL=STwxax2@$9H_&E|*nb|dolPJ#)(Ylb)o0TYZ zxI1m8rBC3f%Qjm*CkBKE;*o8A=UTDPs8;~+G~V-6N`EkIKn&GY`)&J(tMH4t$}&-v z%klO-4;fjj=XhAbpGLhTBplqaSdvuutN;gmkn6U_bc^;4+XrKJU%^D91s*ssH%c+F%_25;}TnO1R~8m zHojvb0XD(wIFZj3XqS(ICpNLygOG1f4F`3@MOKT>D}qbU7e15b4O#U1`_I@IrA}C; z0>Ue(MzRO5RBrdZjH8h?`hg^&MhQM7W~ z#MQRpu@46c35l$tVqh+f;@QDJjZ)(}<8un@`I_W|eACNx+3W5^;L@|W@(ka^zk-f2P% zq=n>r@LB*Nm{ab+v!2H@@lF=8U``l;4w8bYOiu6PTWMO&ftJtE|<_r&nLvyau2&AGYV)9mQ_HK zbqRZKl_!-s`_FTTCa(xpdU<4MT!5K+?9apCjc-iNz|9<*ByE?jlXMZll=^EzN)VdRUW9rM ze5-*mHGe8gHhlYsBb5OD*K=md07H50_@k6VULbeDk zWgki_Gn}8tCHdf%;hoVu8@-&v$jnS37yRyKiBMSO;zds5{vr(6YfXnr6;iBAF?p?q z{cCG)wca7YH#T@gC7HPkZO?Sd?+3q;oEelw-J}U%Rr0oF7OqWUE`z%f-V<4g*0Vs` zIfOCn4iec~ulmetmK~9H7y2({m5WMCt~lX-Gp%{~!*a-fV7X5gL<~4&f8U7|N%K;f zx}K$m37^wdXiPtM&0T^A@XzsI1rJv^1B#0G&jX{^$w~ii=HlhQa0vv$V~ebcP}eim zK5@C#IN4@?5a1H^1{o%dMv4`boKrAxoVZEqA7sDAa|pViFt9E~6ycOe$-o;?#TEDOW8v`V~QR>=u>m&sGp6)1R)#1%7lU>T;;{E=VZAWl!j z7~~J5K`n_+&AfE!3#dj+o$83;PRKwU6ZyoUbr2juX^M_RrgLIsgCAe_BAh>{# z-0}Fp943W~H@-#WX}s1bb>U*OHmz&y%01Xh6P{>~Gllnv+6Q@?C4z$<*?D6kvZ1{z zWn|Ug^++42IlaChmc{OD5&edWb;>h``9D+>U=Gd8ud`f^Zo=Sh*Zh>vP=W2uz@!wG zpOvwkP_&_fqe3txzqLJR>CZ-oM&G!RD0)~+Sk7yL9%R9~?%1RU%|MTUk*hK(htY9b z0!Hx1k8LsQ{xu|2{`tlGpXNvY-A=5NTN@7j-**$~9UT8Wv0>^kV7pd|QYt9RzDbh* zPMFKFu~D$L6BEn*pid%~4ucKE5tDN@T{1y%r-?*ZqCsc;N zkMweAIDhDAGH+MK_zjp(|2*{o&$6Rl=MxEUpHV-ZJ{xjLkrC4%NMU%vq#OVyYb*22HIU}zuFX^-@dQ<51WNE@o&|x81);5dnS$o8-ILH3&ox{xW zN3qu8eZ6sI&dc=#qsbB0W%r+PlxnPdb{vJJ`YDyO8Kh5qOpanSE;v|e8!lL6mFhaK zcb)u+>2V}cm0~_|sz@(GXC9}6A{B9LU-(+-+A)39j`{l}p08?}-zyu#Z!bZbJzqAP zw&Xh6J5eqgKQ{F^RuRY?Gg~ggPIa89KrICoX)9+PY$&V`#GD?QX`cunSY!^5jU|%4 zsxr6d*4lZlC$5WqU5!}pq;?)p2|~==8{VzsXf1i|&~s$fD^aO0Ke4}8(fmE0BEUPx zb$ep5DT;AE8|(L3{5;eTJO-Odi&l9>#pv{OrXCCawuObSQPI)g+l+ef@$dxoTIdp)>+z1eqFgcU4d}2=PzTaY7auKM7a%p{K75x)vPdMLSA7vK{;JjIoxo2?@8Gz zPth`q?qTR!<#M|aON4daL`zr;){>Km^eRULO9VErphg!2K^!Vgkz1IUd_C(FosV~Z zMRPKwbVTs`+`Ndts%4(|%ndp8r%u~*PwJRwpJa2TMj2|hJRMncD$_Q%q`15AB=gAx zSVBL|o}+bJ$qT+E^R>?`Q76}Db8|DPx`W4Pnr*}_YV1nm+1j?azP?L`TfEzK zJ&L#mf-#pcp2W=?HD-@;usJL9;xMVV%)Ejhu5TzY1ldIxf8aP`dBVJHQ<>C6cCThG zpM-HE{&Mz^imU-ceg@UQ6cQ5R*BjmQMN!USny{DC+12Gh4^*MSV|wD0WbNx<_~#t* z;NK>8$gW#6b(&;?Dj=?Y?_7D!WpFI~d@reAMx+2EN5r`Q54uflnlg$S#Vsf~LyZIf zFX8Pq6;f3nXFb(Ne=`xprvp{et68NEIEswZRc8CEttkGhw2L#vNzHI-edY6!m$6S) ztiIMDUrH=Cuu_R+TK>?Zv?{HW8$!JJ=YZr61Hm(f1X|EC`4df%mycyK!{a1vE_2d zD2g2hC`zQx5-bH-k&RPVj$2&$*gEEBjLEqJmN?L(M^E7<4{C#1FnzTE@k-KMkd2@x zM7%K6-MxKTy8&+p zA?`x#e%(2h%OCPVts2B|*4INe>fNM{{tbaoJ9nOQAqFN)mvF7MS0AO(P$d$cScQ8M zFR`E_*2g>6+J#r1fVj>nS}b74NvyJL&ieOJjxFYsE3!@Bm?sS$<~-ILEUIdTOOKmZ ze7fM#5nI`UXPkVsxW+?&NaE*#aJ(X6gm65FUGD}Sx}h>=48blBNQaa@2(=)C>=tYT zvRQCyW7-Gxj@mHRREe-!Z`Y0xt68E)sSPf~`k-0|Vd@m(D~AHr=k}r+olq&flWRS> zco5_jznMR45JY!2HVcQgtcpT2@WO@H%N_lAPno1gp5orApd*eQtxBKWtQi zu{~}eBff?(bpwHA4*krl_eXgVL0GOf-Cep~o2w-f&mi<5=u7mf?ck=Gmq6wZB^q#W zMYn0=bGfaN9GyQt=rLTz{TD1oocP?`eLM1m1~NFfb#JIHA9s{6s@A-fk%6PawhOS<*}1v>#rF(ss(IENxgRixVlx_2 zZBHX&OgeW-*Vu9d;MqxZ&xN|zuoSsm#Y8KD<#$i^9nK1@QtgV>%X78MDDm0B8Zoi7 zq?i#Lw&>W(?WEE&{^9J8z{;($XOEtRZy^~+Dd_yC93CFEPf(@9nZ7U#pw~+g5qkF+ z(*V2J&BdPO7*5`IxoRFx;}~$wN?IwCyNe2t_VPj)wU3=W3hXiR#Ri*adwB%Ejxj<^ z8bOFArlwx0xsUbCX0q18v$xU%jeqg0k2)>KK$5#({>{MZ)2O*#bM?o1+hX@+#5L}_ zb?cUWnYSNovp)>upG`|#*ddZE$>yaM8%!05uKG38M>2g)nsRb;Gq7~6C>s1%W&RSZ z0@?pIAM#=e}nHL_5VkNZSo5N3v+$)%`RCe8fFFfT~v zKldH-99B?Jw1qg@K@AzHg=8B-sIm2U8|;~MdYkBMHX1V*Gt*am*w*~SiCvd3U(T9k zAsZa_b=ibd=l4h3RD>5~9D?9$5)hJd1=w5OP5;1Qyy{<%sk|2N+&^%zMU-G%f_=_f z12&$L;&sv=0Wpnc%`lV*6p?IgTLAKITjp673icJrvD0=+Z*Z~>aHJI&*stW zw>&TNt}v)LQo-h;>vA+tuQ@%LxC`1^5Qwb^ib6Gvd0#_tM2(9vX!JXG50Cd|ga9DR z;b#BF(fRx*dRcU#$h08rK|-I}fCq8+cGO1KIrY9q=GSJKHG0+?GIsyyS?;Yh@+qyK zKeT6OCC!F$?3?Y2-M#zaMJrf3a$nbeKF%385X0xtFJUml>?m3df(d{P4_ z{b%ygwTu|w*NALDOqtdDb;p}HG4 zZa5KR`;K}rQwMupyvw{FsE>SgJ|}a>t3&UAw~~19J=Zc_5)Ez?1TLVP9)21*m#a3O zFIHrRnsc^3KYQdupVg9k{Oq4P29P}04nUR3EqC$ZZE{3A0x)p&f;zs?%d&qxzCwgj zVH*Ghn!(UTONvZ2rI%AXf;v9*=Ad$%+6md&KoZ%Q!d|lV(%a)XpoG@}2P^Jl{9W*m zWYDbu3qfAA%uk&(B1|2CFqupp$WK84rs@uOSY%EZCB5xw7#Q%1|MJm}iEIG+TNEd6 z0;|NyCatx{#M;{0_+=hr`T!v5p&xhbxS5%`)kt+5wr?!%h(;^HT*Qh#MsIOIPpc{U1Z~s@};G!0;QK}8+P)A)7LFIn8!XneYm)D z!l+?3L4DizF~iNAf_V+^L~8yNg?bqK2N^?F8xR#Y(wc2#msfOQ)-R`{rE(NjI70Xy f#mnw1_-aeEcly-X;kxe=zcoS5dOB9w2Veg;CbuVe literal 0 HcmV?d00001 diff --git a/.screenshots/primer_light.png b/.screenshots/primer_light.png new file mode 100644 index 0000000000000000000000000000000000000000..4e5f32ce508a6003f177595bdcf216d9d5cf4e11 GIT binary patch literal 97541 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 ^+sXf(`t_zh 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�%1SYsV=0L!Y*@IUDZAwVrjteJ-n_bV{l4}c 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 + + 4.0.0 + + io.github.mkpaz + atlantafx-parent + 0.1.0 + + atlantafx-base + + + + ${project.groupId} + atlantafx-styles + + + org.openjfx + javafx-controls + + + org.junit.jupiter + junit-jupiter-api + + + org.junit.jupiter + junit-jupiter-engine + + + org.assertj + assertj-core + + + + + + + + src/main/resources + atlantafx/base + false + + + + ../styles/dist + atlantafx/base/theme + false + + + + + + + com.github.eirslett + frontend-maven-plugin + + ${project.parent.basedir} + + + + + + diff --git a/base/src/main/java/atlantafx/base/controls/BehaviorBase.java b/base/src/main/java/atlantafx/base/controls/BehaviorBase.java new file mode 100755 index 0000000..a1be0ff --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/BehaviorBase.java @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.base.controls; + +import javafx.scene.control.Control; +import javafx.scene.control.SkinBase; + +public abstract class BehaviorBase> { + + private C control; + private S skin; + + protected BehaviorBase(C control, S skin) { + this.control = control; + this.skin = skin; + } + + public C getControl() { + return control; + } + + public S getSkin() { + return skin; + } + + /** Called from {@link SkinBase#dispose()} to clean up the behavior state */ + public void dispose() { + this.control = null; + this.skin = null; + } +} diff --git a/base/src/main/java/atlantafx/base/controls/BehaviorSkinBase.java b/base/src/main/java/atlantafx/base/controls/BehaviorSkinBase.java new file mode 100755 index 0000000..fc8e473 --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/BehaviorSkinBase.java @@ -0,0 +1,53 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.base.controls; + +import javafx.beans.value.ObservableValue; +import javafx.scene.control.Control; +import javafx.scene.control.SkinBase; + +import java.util.function.Consumer; + +public abstract class BehaviorSkinBase> extends SkinBase { + + protected B behavior; + + protected BehaviorSkinBase(C control) { + super(control); + behavior = createDefaultBehavior(); + } + + public abstract B createDefaultBehavior(); + + public C getControl() { + return getSkinnable(); + } + + public B getBehavior() { + return behavior; + } + + /** + * Unbinds all properties and removes any listeners before disposing the skin. + * There's no need to remove listeners, which has been registered using + * {@link SkinBase#registerChangeListener(ObservableValue, Consumer)} method, + * because it will be done automatically from dispose method. + */ + protected void unregisterListeners() { } + + /** + * {@inheritDoc} + */ + @Override + public void dispose() { + unregisterListeners(); + + // unregister weak listeners and remove reference to the control + super.dispose(); + + // cleanup the behavior + if (behavior != null) { + behavior.dispose(); + behavior = null; + } + } +} diff --git a/base/src/main/java/atlantafx/base/controls/Breadcrumbs.java b/base/src/main/java/atlantafx/base/controls/Breadcrumbs.java new file mode 100755 index 0000000..9be791f --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/Breadcrumbs.java @@ -0,0 +1,359 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright (c) 2014, 2020, ControlsFX + * All rights reserved. + *

+ * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of ControlsFX, any associated website, nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + *

+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL CONTROLSFX BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package atlantafx.base.controls; + +import javafx.beans.InvalidationListener; +import javafx.beans.property.*; +import javafx.event.Event; +import javafx.event.EventHandler; +import javafx.event.EventType; +import javafx.scene.Node; +import javafx.scene.control.Button; +import javafx.scene.control.Control; +import javafx.scene.control.Skin; +import javafx.scene.control.TreeItem; +import javafx.scene.paint.Color; +import javafx.scene.shape.*; +import javafx.util.Callback; + +import java.util.UUID; + +/** + * Represents a bread crumb bar. This control is useful to visualize and navigate + * a hierarchical path structure, such as file systems. + */ +@SuppressWarnings("unused") +public class Breadcrumbs extends Control { + + private static final String STYLE_CLASS_FIRST = "first"; + + /** Represents an Event which is fired when a bread crumb was activated. */ + public static class BreadCrumbActionEvent extends Event { + + /** + * The event type that should be listened to by people interested in + * knowing when the {@link Breadcrumbs#selectedCrumbProperty() selected crumb} + * has changed. + */ + public static final EventType> CRUMB_ACTION + = new EventType<>("CRUMB_ACTION" + UUID.randomUUID()); + + private final TreeItem selectedCrumb; + + /** Creates a new event that can subsequently be fired. */ + public BreadCrumbActionEvent(TreeItem selectedCrumb) { + super(CRUMB_ACTION); + this.selectedCrumb = selectedCrumb; + } + + /** Returns the crumb which was the action target. */ + public TreeItem getSelectedCrumb() { + return selectedCrumb; + } + } + + /** + * Construct a tree model from the flat list which then can be set + * as selectedCrumb node to be shown + */ + @SafeVarargs + public static TreeItem buildTreeModel(T... crumbs) { + TreeItem subRoot = null; + for (T crumb : crumbs) { + TreeItem currentNode = new TreeItem<>(crumb); + if (subRoot != null) { + subRoot.getChildren().add(currentNode); + } + subRoot = currentNode; + } + return subRoot; + } + + /** Default crumb node factory. This factory is used when no custom factory is specified by the user. */ + private final Callback, Button> defaultCrumbNodeFactory = + crumb -> new BreadCrumbButton(crumb.getValue() != null ? crumb.getValue().toString() : ""); + + /** Creates an empty bread crumb bar. */ + public Breadcrumbs() { + this(null); + } + + /** + * Creates a bread crumb bar with the given TreeItem as the currently + * selected crumb. + */ + public Breadcrumbs(TreeItem selectedCrumb) { + getStyleClass().add(DEFAULT_STYLE_CLASS); + setSelectedCrumb(selectedCrumb); + setCrumbFactory(defaultCrumbNodeFactory); + } + + /** + * Represents the bottom-most path node (the node on the most-right side in + * terms of the bread crumb bar). The full path is then being constructed + * using getParent() of the tree-items. + * + *

+ * Consider the following hierarchy: + * [Root] > [Folder] > [SubFolder] > [file.txt] + *

+ * To show the above bread crumb bar, you have to set the [file.txt] tree-node as selected crumb. + */ + public final ObjectProperty> selectedCrumbProperty() { + return selectedCrumb; + } + + private final ObjectProperty> selectedCrumb = + new SimpleObjectProperty<>(this, "selectedCrumb"); + + /** Get the current target path. */ + public final TreeItem getSelectedCrumb() { + return selectedCrumb.get(); + } + + /** Select one node in the BreadCrumbBar for being the bottom-most path node. */ + public final void setSelectedCrumb(TreeItem selectedCrumb) { + this.selectedCrumb.set(selectedCrumb); + } + + /** + * Enable or disable auto navigation (default is enabled). + * If auto navigation is enabled, it will automatically navigate to the crumb which was clicked by the user. + * + * @return a {@link BooleanProperty} + */ + public final BooleanProperty autoNavigationEnabledProperty() { + return autoNavigation; + } + + private final BooleanProperty autoNavigation = + new SimpleBooleanProperty(this, "autoNavigationEnabled", true); + + /** + * Return whether auto-navigation is enabled. + * + * @return whether auto-navigation is enabled. + */ + public final boolean isAutoNavigationEnabled() { + return autoNavigation.get(); + } + + /** + * Enable or disable auto navigation (default is enabled). + * If auto navigation is enabled, it will automatically navigate to the crumb which was clicked by the user. + */ + public final void setAutoNavigationEnabled(boolean enabled) { + autoNavigation.set(enabled); + } + + /** + * Return an ObjectProperty of the CrumbFactory. + * + * @return an ObjectProperty of the CrumbFactory. + */ + public final ObjectProperty, Button>> crumbFactoryProperty() { + return crumbFactory; + } + + private final ObjectProperty, Button>> crumbFactory = + new SimpleObjectProperty<>(this, "crumbFactory"); + + /** + * Sets the crumb factory to create (custom) {@link BreadCrumbButton} instances. + * null is not allowed and will result in a fallback to the default factory. + */ + public final void setCrumbFactory(Callback, Button> value) { + if (value == null) { + value = defaultCrumbNodeFactory; + } + crumbFactoryProperty().set(value); + } + + /** + * Returns the cell factory that will be used to create {@link BreadCrumbButton} + * instances + */ + public final Callback, Button> getCrumbFactory() { + return crumbFactory.get(); + } + + /** + * @return an ObjectProperty representing the crumbAction EventHandler being used. + */ + public final ObjectProperty>> onCrumbActionProperty() { + return onCrumbAction; + } + + /** Set a new EventHandler for when a user selects a crumb. */ + public final void setOnCrumbAction(EventHandler> value) { + onCrumbActionProperty().set(value); + } + + /** + * Return the EventHandler currently used when a user selects a crumb. + * + * @return the EventHandler currently used when a user selects a crumb. + */ + public final EventHandler> getOnCrumbAction() { + return onCrumbActionProperty().get(); + } + + private final ObjectProperty>> onCrumbAction = new ObjectPropertyBase<>() { + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + protected void invalidated() { + setEventHandler(BreadCrumbActionEvent.CRUMB_ACTION, (EventHandler) (Object) get()); + } + + @Override + public Object getBean() { + return Breadcrumbs.this; + } + + @Override + public String getName() { + return "onCrumbAction"; + } + }; + + private static final String DEFAULT_STYLE_CLASS = "bread-crumb-bar"; + + /** {@inheritDoc} */ + @Override + protected Skin createDefaultSkin() { + return new BreadcrumbsSkin<>(this); + } + + @SuppressWarnings("FieldCanBeLocal") + public static class BreadCrumbButton extends Button { + + private final ObjectProperty first = new SimpleObjectProperty<>(this, STYLE_CLASS_FIRST); + + private final double arrowWidth = 5; + private final double arrowHeight = 20; + + /** + * Create a BreadCrumbButton + * + * @param text Buttons text + */ + public BreadCrumbButton(String text) { + this(text, null); + } + + /** + * Create a BreadCrumbButton + * + * @param text Buttons text + * @param gfx Gfx of the Button + */ + public BreadCrumbButton(String text, Node gfx) { + super(text, gfx); + first.set(false); + + getStyleClass().addListener((InvalidationListener) obs -> updateShape()); + + updateShape(); + } + + private void updateShape() { + this.setShape(createButtonShape()); + } + + /** Returns the crumb arrow width. */ + public double getArrowWidth() { + return arrowWidth; + } + + /** Creates an arrow path. */ + private Path createButtonShape() { + // build the following shape (or home without left arrow) + + // -------- + // \ \ + // / / + // -------- + Path path = new Path(); + + // begin in the upper left corner + MoveTo e1 = new MoveTo(0, 0); + path.getElements().add(e1); + + // draw a horizontal line that defines the width of the shape + HLineTo e2 = new HLineTo(); + // bind the width of the shape to the width of the button + e2.xProperty().bind(this.widthProperty().subtract(arrowWidth)); + path.getElements().add(e2); + + // draw upper part of right arrow + LineTo e3 = new LineTo(); + // the x endpoint of this line depends on the x property of line e2 + e3.xProperty().bind(e2.xProperty().add(arrowWidth)); + e3.setY(arrowHeight / 2.0); + path.getElements().add(e3); + + // draw lower part of right arrow + LineTo e4 = new LineTo(); + // the x endpoint of this line depends on the x property of line e2 + e4.xProperty().bind(e2.xProperty()); + e4.setY(arrowHeight); + path.getElements().add(e4); + + // draw lower horizontal line + HLineTo e5 = new HLineTo(0); + path.getElements().add(e5); + + if (!getStyleClass().contains(STYLE_CLASS_FIRST)) { + // draw lower part of left arrow + // we simply can omit it for the first Button + LineTo e6 = new LineTo(arrowWidth, arrowHeight / 2.0); + path.getElements().add(e6); + } else { + // draw an arc for the first bread crumb + ArcTo arcTo = new ArcTo(); + arcTo.setSweepFlag(true); + arcTo.setX(0); + arcTo.setY(0); + arcTo.setRadiusX(15.0f); + arcTo.setRadiusY(15.0f); + path.getElements().add(arcTo); + } + + // close path + ClosePath e7 = new ClosePath(); + path.getElements().add(e7); + + // this is a dummy color to fill the shape, it won't be visible + path.setFill(Color.BLACK); + + return path; + } + } +} diff --git a/base/src/main/java/atlantafx/base/controls/BreadcrumbsSkin.java b/base/src/main/java/atlantafx/base/controls/BreadcrumbsSkin.java new file mode 100755 index 0000000..e0f9193 --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/BreadcrumbsSkin.java @@ -0,0 +1,168 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright (c) 2014, 2021, ControlsFX + * All rights reserved. + *

+ * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of ControlsFX, any associated website, nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + *

+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL CONTROLSFX BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package atlantafx.base.controls; + +import javafx.beans.value.ChangeListener; +import javafx.event.Event; +import javafx.event.EventHandler; +import javafx.scene.Node; +import javafx.scene.control.Button; +import javafx.scene.control.SkinBase; +import javafx.scene.control.TreeItem; +import javafx.scene.control.TreeItem.TreeModificationEvent; +import javafx.util.Callback; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class BreadcrumbsSkin extends SkinBase> { + + private static final String STYLE_CLASS_FIRST = "first"; + + public BreadcrumbsSkin(final Breadcrumbs control) { + super(control); + control.selectedCrumbProperty().addListener(selectedPathChangeListener); + updateSelectedPath(getSkinnable().selectedCrumbProperty().get(), null); + } + + @SuppressWarnings("FieldCanBeLocal") + private final ChangeListener> selectedPathChangeListener = + (obs, oldItem, newItem) -> updateSelectedPath(newItem, oldItem); + + private void updateSelectedPath(TreeItem newTarget, TreeItem oldTarget) { + if (oldTarget != null) { + // remove old listener + oldTarget.removeEventHandler(TreeItem.childrenModificationEvent(), treeChildrenModifiedHandler); + } + if (newTarget != null) { + // add new listener + newTarget.addEventHandler(TreeItem.childrenModificationEvent(), treeChildrenModifiedHandler); + } + updateBreadCrumbs(); + } + + private final EventHandler> treeChildrenModifiedHandler = + args -> updateBreadCrumbs(); + + private void updateBreadCrumbs() { + final Breadcrumbs buttonBar = getSkinnable(); + final TreeItem pathTarget = buttonBar.getSelectedCrumb(); + final Callback, Button> factory = buttonBar.getCrumbFactory(); + + getChildren().clear(); + + if (pathTarget != null) { + List> crumbs = constructFlatPath(pathTarget); + + for (int i = 0; i < crumbs.size(); i++) { + Button crumb = createCrumb(factory, crumbs.get(i)); + crumb.setMnemonicParsing(false); + if (i == 0) { + if (!crumb.getStyleClass().contains(STYLE_CLASS_FIRST)) { + crumb.getStyleClass().add(STYLE_CLASS_FIRST); + } + } else { + crumb.getStyleClass().remove(STYLE_CLASS_FIRST); + } + + getChildren().add(crumb); + } + } + } + + @Override + protected void layoutChildren(double x, double y, double w, double h) { + for (int i = 0; i < getChildren().size(); i++) { + Node n = getChildren().get(i); + + double nw = snapSizeX(n.prefWidth(h)); + double nh = snapSizeY(n.prefHeight(-1)); + + if (i > 0) { + // we have to position the bread crumbs slightly overlapping + double ins = n instanceof Breadcrumbs.BreadCrumbButton ? ((Breadcrumbs.BreadCrumbButton) n).getArrowWidth() : 0; + x = snapPositionX(x - ins); + } + + n.resize(nw, nh); + n.relocate(x, y); + x += nw; + } + } + + /** + * Construct a flat list for the crumbs + * + * @param bottomMost The crumb node at the end of the path + */ + private List> constructFlatPath(TreeItem bottomMost) { + List> path = new ArrayList<>(); + + TreeItem current = bottomMost; + do { + path.add(current); + current = current.getParent(); + } while (current != null); + + Collections.reverse(path); + return path; + } + + private Button createCrumb( + final Callback, Button> factory, + final TreeItem selectedCrumb) { + + Button crumb = factory.call(selectedCrumb); + + crumb.getStyleClass().add("crumb"); //$NON-NLS-1$ + + // listen to the action event of each bread crumb + crumb.setOnAction(ae -> onBreadCrumbAction(selectedCrumb)); + + return crumb; + } + + /** + * Occurs when a bread crumb gets the action event + * + * @param crumbModel The crumb which received the action event + */ + protected void onBreadCrumbAction(final TreeItem crumbModel) { + final Breadcrumbs breadCrumbBar = getSkinnable(); + + // fire the composite event in the breadCrumbBar + Event.fireEvent(breadCrumbBar, new Breadcrumbs.BreadCrumbActionEvent<>(crumbModel)); + + // navigate to the clicked crumb + if (breadCrumbBar.isAutoNavigationEnabled()) { + breadCrumbBar.setSelectedCrumb(crumbModel); + } + } +} diff --git a/base/src/main/java/atlantafx/base/controls/CaptionMenuItem.java b/base/src/main/java/atlantafx/base/controls/CaptionMenuItem.java new file mode 100644 index 0000000..c7825fc --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/CaptionMenuItem.java @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.base.controls; + +import atlantafx.base.theme.Styles; +import javafx.beans.property.StringProperty; +import javafx.scene.control.CustomMenuItem; +import javafx.scene.control.Label; + +@SuppressWarnings("unused") +public class CaptionMenuItem extends CustomMenuItem { + + private final Label title = new Label(); + + public CaptionMenuItem() { + this(null); + } + + public CaptionMenuItem(String text) { + super(); + + setTitle(text); + setContent(title); + setHideOnClick(false); + getStyleClass().add(Styles.TEXT_CAPTION); + } + + public String getTitle() { + return title.getText(); + } + + public void setTitle(String text) { + title.setText(text); + } + + public StringProperty titleProperty() { + return title.textProperty(); + } +} diff --git a/base/src/main/java/atlantafx/base/controls/CustomTextField.java b/base/src/main/java/atlantafx/base/controls/CustomTextField.java new file mode 100755 index 0000000..16dfa2a --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/CustomTextField.java @@ -0,0 +1,124 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright (c) 2013, 2015, ControlsFX + * All rights reserved. + *

+ * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of ControlsFX, any associated website, nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + *

+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL CONTROLSFX BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package atlantafx.base.controls; + +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.scene.Node; +import javafx.scene.control.Skin; +import javafx.scene.control.TextField; + +/** + * A base class for people wanting to customize a {@link TextField} to contain nodes + * inside the text field itself, without being on top of the users typed-in text. + */ +@SuppressWarnings("unused") +public class CustomTextField extends TextField { + + /** Instantiates a default CustomTextField. */ + public CustomTextField() { + getStyleClass().add("custom-text-field"); + } + + public CustomTextField(String text) { + this(); + setText(text); + } + + /////////////////////////////////////////////////////////////////////////// + // Properties // + /////////////////////////////////////////////////////////////////////////// + + private final ObjectProperty left = new SimpleObjectProperty<>(this, "left"); + + /** + * @return An ObjectProperty wrapping the {@link Node} that is placed + * on the left of the text field. + */ + public final ObjectProperty leftProperty() { + return left; + } + + /** + * @return the {@link Node} that is placed on the left of the text field. + */ + public final Node getLeft() { + return left.get(); + } + + /** + * Sets the {@link Node} that is placed on the left of the text field. + */ + public final void setLeft(Node value) { + left.set(value); + } + + private final ObjectProperty right = new SimpleObjectProperty<>(this, "right"); + + /** + * Property representing the {@link Node} that is placed on the right of the text field. + */ + public final ObjectProperty rightProperty() { + return right; + } + + /** + * @return The {@link Node} that is placed on the right of the text field. + */ + public final Node getRight() { + return right.get(); + } + + /** + * Sets the {@link Node} that is placed on the right of the text field. + */ + public final void setRight(Node value) { + right.set(value); + } + + /////////////////////////////////////////////////////////////////////////// + // Methods // + /////////////////////////////////////////////////////////////////////////// + + /** {@inheritDoc} */ + @Override + protected Skin createDefaultSkin() { + return new CustomTextFieldSkin(this) { + @Override + public ObjectProperty leftProperty() { + return CustomTextField.this.leftProperty(); + } + + @Override + public ObjectProperty rightProperty() { + return CustomTextField.this.rightProperty(); + } + }; + } +} diff --git a/base/src/main/java/atlantafx/base/controls/CustomTextFieldSkin.java b/base/src/main/java/atlantafx/base/controls/CustomTextFieldSkin.java new file mode 100755 index 0000000..e961c9f --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/CustomTextFieldSkin.java @@ -0,0 +1,173 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright (c) 2013, 2019 ControlsFX + * All rights reserved. + *

+ * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of ControlsFX, any associated website, nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + *

+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL CONTROLSFX BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package atlantafx.base.controls; + +import javafx.beans.property.ObjectProperty; +import javafx.css.PseudoClass; +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.control.TextField; +import javafx.scene.control.skin.TextFieldSkin; +import javafx.scene.layout.StackPane; +import javafx.scene.text.HitInfo; + +public abstract class CustomTextFieldSkin extends TextFieldSkin { + + private static final PseudoClass HAS_NO_SIDE_NODE = PseudoClass.getPseudoClass("no-side-nodes"); + private static final PseudoClass HAS_LEFT_NODE = PseudoClass.getPseudoClass("left-node-visible"); + private static final PseudoClass HAS_RIGHT_NODE = PseudoClass.getPseudoClass("right-node-visible"); + + private StackPane leftPane; + private StackPane rightPane; + + private final TextField control; + + public CustomTextFieldSkin(final TextField control) { + super(control); + + this.control = control; + updateChildren(); + + registerChangeListener(leftProperty(), e -> updateChildren()); + registerChangeListener(rightProperty(), e -> updateChildren()); + } + + public abstract ObjectProperty leftProperty(); + + public abstract ObjectProperty rightProperty(); + + private void updateChildren() { + Node newLeft = leftProperty().get(); + // remove leftPane in any case + getChildren().remove(leftPane); + Node left; + if (newLeft != null) { + leftPane = new StackPane(newLeft); + leftPane.setManaged(false); + leftPane.setAlignment(Pos.CENTER_LEFT); + leftPane.getStyleClass().add("left-pane"); + getChildren().add(leftPane); + left = newLeft; + } else { + leftPane = null; + left = null; + } + + Node newRight = rightProperty().get(); + // remove rightPane in any case + getChildren().remove(rightPane); + Node right; + if (newRight != null) { + rightPane = new StackPane(newRight); + rightPane.setManaged(false); + rightPane.setAlignment(Pos.CENTER_RIGHT); + rightPane.getStyleClass().add("right-pane"); + getChildren().add(rightPane); + right = newRight; + } else { + rightPane = null; + right = null; + } + + control.pseudoClassStateChanged(HAS_LEFT_NODE, left != null); + control.pseudoClassStateChanged(HAS_RIGHT_NODE, right != null); + control.pseudoClassStateChanged(HAS_NO_SIDE_NODE, left == null && right == null); + } + + @Override + protected void layoutChildren(double x, double y, double w, double h) { + final double fullHeight = h + snappedTopInset() + snappedBottomInset(); + + final double leftWidth = leftPane == null ? 0.0 : snapSizeX(leftPane.prefWidth(fullHeight)); + final double rightWidth = rightPane == null ? 0.0 : snapSizeX(rightPane.prefWidth(fullHeight)); + + final double textFieldStartX = snapPositionX(x) + snapSizeX(leftWidth); + final double textFieldWidth = w - snapSizeX(leftWidth) - snapSizeX(rightWidth); + + super.layoutChildren(textFieldStartX, 0, textFieldWidth, fullHeight); + + if (leftPane != null) { + final double leftStartX = 0; + leftPane.resizeRelocate(leftStartX, 0, leftWidth, fullHeight); + } + + if (rightPane != null) { + final double rightStartX = w - rightWidth + snappedLeftInset(); + rightPane.resizeRelocate(rightStartX, 0, rightWidth, fullHeight); + } + } + + @Override + public HitInfo getIndex(double x, double y) { + // This resolves an issue when we have a left Node and the click point is badly returned + // because we weren't considering the shift induced by the leftPane. + final double leftWidth = leftPane == null ? 0.0 : snapSizeX(leftPane.prefWidth(getSkinnable().getHeight())); + return super.getIndex(x - leftWidth, y); + } + + @Override + protected double computePrefWidth(double h, double topInset, double rightInset, double bottomInset, + double leftInset) { + final double pw = super.computePrefWidth(h, topInset, rightInset, bottomInset, leftInset); + final double leftWidth = leftPane == null ? 0.0 : snapSizeX(leftPane.prefWidth(h)); + final double rightWidth = rightPane == null ? 0.0 : snapSizeX(rightPane.prefWidth(h)); + + return pw + leftWidth + rightWidth; + } + + @Override + protected double computePrefHeight(double w, double topInset, double rightInset, double bottomInset, + double leftInset) { + final double ph = super.computePrefHeight(w, topInset, rightInset, bottomInset, leftInset); + final double leftHeight = leftPane == null ? 0.0 : snapSizeX(leftPane.prefHeight(-1)); + final double rightHeight = rightPane == null ? 0.0 : snapSizeX(rightPane.prefHeight(-1)); + + return Math.max(ph, Math.max(leftHeight, rightHeight)); + } + + @Override + protected double computeMinWidth(double h, double topInset, double rightInset, double bottomInset, + double leftInset) { + final double mw = super.computeMinWidth(h, topInset, rightInset, bottomInset, leftInset); + final double leftWidth = leftPane == null ? 0.0 : snapSizeX(leftPane.minWidth(h)); + final double rightWidth = rightPane == null ? 0.0 : snapSizeX(rightPane.minWidth(h)); + + return mw + leftWidth + rightWidth; + } + + @Override + protected double computeMinHeight(double w, double topInset, double rightInset, double bottomInset, + double leftInset) { + final double mh = super.computeMinHeight(w, topInset, rightInset, bottomInset, leftInset); + final double leftHeight = leftPane == null ? 0.0 : snapSizeX(leftPane.minHeight(-1)); + final double rightHeight = rightPane == null ? 0.0 : snapSizeX(rightPane.minHeight(-1)); + + return Math.max(mh, Math.max(leftHeight, rightHeight)); + } +} diff --git a/base/src/main/java/atlantafx/base/controls/InlineDatePicker.java b/base/src/main/java/atlantafx/base/controls/InlineDatePicker.java new file mode 100755 index 0000000..ce15316 --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/InlineDatePicker.java @@ -0,0 +1,295 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package atlantafx.base.controls; + +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.value.WritableValue; +import javafx.css.CssMetaData; +import javafx.css.Styleable; +import javafx.css.StyleableBooleanProperty; +import javafx.css.StyleableProperty; +import javafx.css.converter.BooleanConverter; +import javafx.scene.control.*; +import javafx.util.Callback; + +import java.time.DateTimeException; +import java.time.LocalDate; +import java.time.chrono.Chronology; +import java.time.chrono.IsoChronology; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Locale; + +/** + * The DatePicker control allows the user to select a date. The calendar is based on either + * the standard ISO-8601 chronology or any of the other chronology classes defined in the + * java.time.chrono package. + *

+ * The {@link #valueProperty() value} property represents the currently selected + * {@link LocalDate}. The default value is null. + *

+ * The {@link #chronologyProperty() chronology} property specifies a calendar system to be used + * for parsing, displaying, and choosing dates. + *

+ * The {@link #valueProperty() value} property is always defined in the ISO calendar system, + * however, so applications based on a different chronology may use the conversion methods + * provided in the {@link java.time.chrono.Chronology} API to get or set the corresponding + * {@link java.time.chrono.ChronoLocalDate} value. + */ +public class InlineDatePicker extends Control { + + protected LocalDate lastValidDate = null; + protected Chronology lastValidChronology = IsoChronology.INSTANCE; + + /** Creates a default DatePicker instance with a null date value set. */ + public InlineDatePicker() { + this(null); + + valueProperty().addListener(obs -> { + LocalDate date = getValue(); + Chronology chrono = getChronology(); + + if (isValidDate(chrono, date)) { + lastValidDate = date; + } else { + System.err.println("Restoring value to " + (lastValidDate == null ? "null" : lastValidDate)); + setValue(lastValidDate); + } + }); + + chronologyProperty().addListener(observable -> { + LocalDate date = getValue(); + Chronology chrono = getChronology(); + + if (isValidDate(chrono, date)) { + lastValidChronology = chrono; + } else { + System.err.println("Restoring value to " + lastValidChronology); + setChronology(lastValidChronology); + } + }); + } + + /** + * Creates a DatePicker instance and sets the {@link #valueProperty() value} to the given date. + * + * @param localDate to be set as the currently selected date in the DatePicker. Can be null. + */ + public InlineDatePicker(LocalDate localDate) { + setValue(localDate); + getStyleClass().add(DEFAULT_STYLE_CLASS); + } + + /** {@inheritDoc} */ + @Override + protected Skin createDefaultSkin() { + return new InlineDatePickerSkin(this); + } + + /////////////////////////////////////////////////////////////////////////// + // Properties // + /////////////////////////////////////////////////////////////////////////// + + private final ObjectProperty value = new SimpleObjectProperty<>(this, "value"); + + public final LocalDate getValue() { + return valueProperty().get(); + } + + public final void setValue(LocalDate value) { + valueProperty().set(value); + } + + public ObjectProperty valueProperty() { return value; } + + /** + * A custom cell factory can be provided to customize individual day cells + * Refer to {@link DateCell} and {@link Cell} for more information on cell factories. + */ + private ObjectProperty> dayCellFactory; + + public final void setDayCellFactory(Callback value) { + dayCellFactoryProperty().set(value); + } + + public final Callback getDayCellFactory() { + return (dayCellFactory != null) ? dayCellFactory.get() : null; + } + + public final ObjectProperty> dayCellFactoryProperty() { + if (dayCellFactory == null) { + dayCellFactory = new SimpleObjectProperty<>(this, "dayCellFactory"); + } + return dayCellFactory; + } + + /** + * The calendar system used for parsing, displaying, and choosing dates in the DatePicker + * control. + *

+ * The default is usually {@link IsoChronology} unless provided explicitly + * in the {@link Locale} by use of a Locale calendar extension. + *

+ * Setting the value to null will restore the default chronology. + * + * @return a property representing the Chronology being used + */ + public ObjectProperty chronologyProperty() { + return chronology; + } + + private final ObjectProperty chronology = new SimpleObjectProperty<>(this, "chronology", null); + + public final Chronology getChronology() { + Chronology chrono = chronology.get(); + if (chrono == null) { + try { + chrono = Chronology.ofLocale(Locale.getDefault(Locale.Category.FORMAT)); + } catch (Exception e) { + e.printStackTrace(); + } + if (chrono == null) { + chrono = IsoChronology.INSTANCE; + } + } + return chrono; + } + + public final void setChronology(Chronology value) { + chronology.setValue(value); + } + + /** + * Whether the DatePicker popup should display a column showing week numbers. + *

+ * The default value is specified in a resource bundle, and depends on the country of the + * current locale. + * + * @return true if popup should display a column showing week numbers + */ + public final BooleanProperty showWeekNumbersProperty() { + if (showWeekNumbers == null) { + showWeekNumbers = new StyleableBooleanProperty(false) { + @Override + public CssMetaData getCssMetaData() { + return StyleableProperties.SHOW_WEEK_NUMBERS; + } + + @Override + public Object getBean() { + return InlineDatePicker.this; + } + + @Override + public String getName() { + return "showWeekNumbers"; + } + }; + } + return showWeekNumbers; + } + + private BooleanProperty showWeekNumbers; + + public final void setShowWeekNumbers(boolean value) { + showWeekNumbersProperty().setValue(value); + } + + public final boolean isShowWeekNumbers() { + return showWeekNumbersProperty().getValue(); + } + + /////////////////////////////////////////////////////////////////////////// + // Stylesheet Handling // + /////////////////////////////////////////////////////////////////////////// + + private static final String DEFAULT_STYLE_CLASS = "inline-date-picker"; + + private static class StyleableProperties { + + private static final List> STYLEABLES; + + private static final CssMetaData SHOW_WEEK_NUMBERS = + new CssMetaData<>("-fx-show-week-numbers", BooleanConverter.getInstance(), false) { + @Override + public boolean isSettable(InlineDatePicker n) { + return n.showWeekNumbers == null || !n.showWeekNumbers.isBound(); + } + + @Override + @SuppressWarnings("RedundantCast") + public StyleableProperty getStyleableProperty(InlineDatePicker n) { + return (StyleableProperty) (WritableValue) n.showWeekNumbersProperty(); + } + }; + + static { + final List> styleables = new ArrayList<>(Control.getClassCssMetaData()); + Collections.addAll(styleables, SHOW_WEEK_NUMBERS); + STYLEABLES = Collections.unmodifiableList(styleables); + } + } + + /** + * @return The CssMetaData associated with this class, which may include the + * CssMetaData of its superclasses. + */ + public static List> getClassCssMetaData() { + return StyleableProperties.STYLEABLES; + } + + /** {@inheritDoc} */ + @Override + public List> getControlCssMetaData() { + return getClassCssMetaData(); + } + + static boolean isValidDate(Chronology chrono, LocalDate date, int offset, ChronoUnit unit) { + if (date != null) { + try { + return isValidDate(chrono, date.plus(offset, unit)); + } catch (DateTimeException e) { + e.printStackTrace(); + } + } + return false; + } + + static boolean isValidDate(Chronology chrono, LocalDate date) { + try { + if (date != null) { chrono.date(date); } + return true; + } catch (DateTimeException e) { + e.printStackTrace(); + return false; + } + } +} diff --git a/base/src/main/java/atlantafx/base/controls/InlineDatePickerBehavior.java b/base/src/main/java/atlantafx/base/controls/InlineDatePickerBehavior.java new file mode 100755 index 0000000..d4a948a --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/InlineDatePickerBehavior.java @@ -0,0 +1,86 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.base.controls; + +import javafx.scene.input.KeyEvent; +import javafx.scene.input.MouseEvent; + +import java.time.LocalDate; + +import static atlantafx.base.util.PlatformUtils.isMac; +import static java.time.temporal.ChronoUnit.MONTHS; +import static java.time.temporal.ChronoUnit.YEARS; +import static javafx.scene.input.KeyCode.ESCAPE; + +public class InlineDatePickerBehavior extends BehaviorBase { + + public InlineDatePickerBehavior(InlineDatePicker control, InlineDatePickerSkin skin) { + super(control, skin); + } + + public void onKeyPressed(KeyEvent e) { + getSkin().rememberFocusedDayCell(); + + if (e.getEventType() == KeyEvent.KEY_PRESSED) { + switch (e.getCode()) { + case HOME -> { + getSkin().goToDate(LocalDate.now(), true); + e.consume(); + } + case PAGE_UP -> { + if ((isMac() && e.isMetaDown()) || (!isMac() && e.isControlDown())) { + if (getSkin().canGoYearForward()) { + getSkin().forward(1, YEARS, true); + } + } else { + if (getSkin().canGoMonthForward()) { + getSkin().forward(1, MONTHS, true); + } + } + e.consume(); + } + case PAGE_DOWN -> { + if ((isMac() && e.isMetaDown()) || (!isMac() && e.isControlDown())) { + if (getSkin().canGoYearBack()) { + getSkin().forward(-1, YEARS, true); + } + } else { + if (getSkin().canGoMonthBack()) { + getSkin().forward(-1, MONTHS, true); + } + } + e.consume(); + } + } + getSkin().rememberFocusedDayCell(); + } + + // prevents any other key events but ESC from reaching the control owner + if (e.getCode() != ESCAPE) { e.consume(); } + } + + public void moveForward(MouseEvent e) { + if ((isMac() && e.isMetaDown()) || (!isMac() && e.isControlDown())) { + if (getSkin().canGoYearForward()) { + getSkin().forward(1, YEARS, true); + } + } else { + if (getSkin().canGoMonthForward()) { + getSkin().forward(1, MONTHS, true); + } + } + e.consume(); + } + + public void moveBackward(MouseEvent e) { + if ((isMac() && e.isMetaDown()) || (!isMac() && e.isControlDown())) { + if (getSkin().canGoYearBack()) { + getSkin().forward(-1, YEARS, true); + } + } else { + if (getSkin().canGoMonthBack()) { + getSkin().forward(-1, MONTHS, true); + } + } + e.consume(); + } +} diff --git a/base/src/main/java/atlantafx/base/controls/InlineDatePickerSkin.java b/base/src/main/java/atlantafx/base/controls/InlineDatePickerSkin.java new file mode 100755 index 0000000..f4ef86a --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/InlineDatePickerSkin.java @@ -0,0 +1,585 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package atlantafx.base.controls; + +import javafx.beans.binding.Bindings; +import javafx.beans.binding.ObjectBinding; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.Node; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.DateCell; +import javafx.scene.control.Label; +import javafx.scene.input.MouseButton; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.*; +import javafx.util.Callback; + +import java.time.DateTimeException; +import java.time.LocalDate; +import java.time.YearMonth; +import java.time.chrono.ChronoLocalDate; +import java.time.chrono.Chronology; +import java.time.format.DateTimeFormatter; +import java.time.format.DecimalStyle; +import java.time.temporal.ChronoUnit; +import java.time.temporal.ValueRange; +import java.time.temporal.WeekFields; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Objects; + +import static atlantafx.base.controls.InlineDatePicker.isValidDate; +import static java.time.temporal.ChronoField.DAY_OF_WEEK; +import static java.time.temporal.ChronoField.MONTH_OF_YEAR; +import static java.time.temporal.ChronoUnit.*; +import static javafx.scene.layout.Region.USE_PREF_SIZE; + +public class InlineDatePickerSkin extends BehaviorSkinBase { + + // formatters + final DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("y"); + final DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MMMM"); + final DateTimeFormatter weekNumberFormatter = DateTimeFormatter.ofPattern("w"); + final DateTimeFormatter dayCellFormatter = DateTimeFormatter.ofPattern("d"); + final DateTimeFormatter monthFormatterSO = DateTimeFormatter.ofPattern("LLLL"); // standalone month name + final DateTimeFormatter weekDayNameFormatter = DateTimeFormatter.ofPattern("ccc"); // standalone day name + + // UI + protected final VBox rootPane = new VBox(); + protected CalendarGrid calendarGrid; + + protected Button forwardButton; + protected Button backButton; + protected Label monthLabel; + protected Label yearLabel; + + // model + protected final List dayNameCells = new ArrayList<>(); + protected final List weekNumberCells = new ArrayList<>(); + protected final List dayCells = new ArrayList<>(); + protected LocalDate[] dayCellDates; + protected DateCell lastFocusedDayCell = null; + protected final int daysPerWeek = getDaysPerWeek(); + + private final ObjectProperty displayedYearMonth = new SimpleObjectProperty<>(this, "displayedYearMonth"); + + public ObjectProperty displayedYearMonthProperty() { return displayedYearMonth; } + + private final ObjectBinding firstDayOfMonth = Bindings.createObjectBinding(() -> displayedYearMonth.get().atDay(1), displayedYearMonth); + + public LocalDate getFirstDayOfMonth() { return firstDayOfMonth.get(); } + + public InlineDatePickerSkin(InlineDatePicker datePicker) { + super(datePicker); + + createUI(); + + registerChangeListener(datePicker.valueProperty(), e -> { + LocalDate date = datePicker.getValue(); + displayedYearMonthProperty().set((date != null) ? YearMonth.from(date) : YearMonth.now()); + updateValues(); + datePicker.fireEvent(new ActionEvent()); + }); + + registerChangeListener(datePicker.showWeekNumbersProperty(), e -> { + updateGrid(); + updateWeekNumberCells(); + }); + } + + @Override + public InlineDatePickerBehavior createDefaultBehavior() { + return new InlineDatePickerBehavior(getControl(), this); + } + + public Locale getLocale() { + return Locale.getDefault(Locale.Category.FORMAT); + } + + public Scene getScene() { + return getControl().getScene(); + } + + /** + * The primary chronology for display. This may be overridden to be different from the + * DatePicker chronology. For example DatePickerHijrahContent uses ISO as primary and Hijrah + * as a secondary chronology. + */ + public Chronology getPrimaryChronology() { + return getControl().getChronology(); + } + + public int getMonthsPerYear() { + ValueRange range = getPrimaryChronology().range(MONTH_OF_YEAR); + return (int) (range.getMaximum() - range.getMinimum() + 1); + } + + public int getDaysPerWeek() { + ValueRange range = getPrimaryChronology().range(DAY_OF_WEEK); + return (int) (range.getMaximum() - range.getMinimum() + 1); + } + + /////////////////////////////////////////////////////////////////////////// + // UI // + /////////////////////////////////////////////////////////////////////////// + + protected void createUI() { + // YearMonth // + + LocalDate value = getControl().getValue(); + displayedYearMonth.set(value != null ? YearMonth.from(value) : YearMonth.now()); + displayedYearMonth.addListener((observable, oldValue, newValue) -> updateValues()); + + rootPane.getChildren().add(createMonthYearPane()); + + // Calendar // + + calendarGrid = new CalendarGrid(); + calendarGrid.getStyleClass().add("calendar-grid"); + calendarGrid.setFocusTraversable(true); + calendarGrid.setVgap(-1); + calendarGrid.setHgap(-1); + + // get the weekday labels starting with the weekday that is the first-day-of-the-week + // according to the locale in the displayed LocalDate + for (int i = 0; i < daysPerWeek; i++) { + DateCell cell = new DateCell(); + cell.getStyleClass().add("day-name-cell"); + dayNameCells.add(cell); + } + + // week number column + for (int i = 0; i < 6; i++) { + DateCell cell = new DateCell(); + cell.getStyleClass().add("week-number-cell"); + weekNumberCells.add(cell); + } + + createDayCells(); + updateGrid(); + + // preserve default class name for compatibility reasons + rootPane.getStyleClass().addAll("date-picker-popup", "inline-date-picker"); + rootPane.getChildren().add(calendarGrid); + + getChildren().add(rootPane); + + getControl().setOnKeyPressed(e -> behavior.onKeyPressed(e)); + + refresh(); + } + + protected HBox createMonthYearPane() { + HBox monthYearPane = new HBox(); + monthYearPane.getStyleClass().add("month-year-pane"); + + backButton = new Button(); + backButton.getStyleClass().addAll("back-button"); + backButton.setOnMouseClicked(e -> behavior.moveBackward(e)); + + StackPane leftArrow = new StackPane(); + leftArrow.getStyleClass().add("left-arrow"); + leftArrow.setMaxSize(USE_PREF_SIZE, USE_PREF_SIZE); + backButton.setGraphic(leftArrow); + + Region leftSpacer = new Region(); + HBox.setHgrow(leftSpacer, Priority.ALWAYS); + + monthLabel = new Label(); + monthLabel.getStyleClass().add("month-label"); + + yearLabel = new Label(); + yearLabel.getStyleClass().add("year-label"); + + Region rightSpacer = new Region(); + HBox.setHgrow(rightSpacer, Priority.ALWAYS); + + forwardButton = new Button(); + forwardButton.getStyleClass().addAll("forward-button"); + forwardButton.setOnMouseClicked(e -> behavior.moveForward(e)); + + StackPane rightArrow = new StackPane(); + rightArrow.getStyleClass().add("right-arrow"); + rightArrow.setMaxSize(USE_PREF_SIZE, USE_PREF_SIZE); + forwardButton.setGraphic(rightArrow); + + monthYearPane.getChildren().addAll(backButton, leftSpacer, monthLabel, yearLabel, rightSpacer, forwardButton); + + return monthYearPane; + } + + protected class CalendarGrid extends GridPane { + + @Override + protected double computePrefWidth(double height) { + final double width = super.computePrefWidth(height); + + // Make sure width snaps to pixel when divided by number of columns. + // GridPane doesn't do this with percentage width constraints. + // See GridPane.adjustColumnWidths(). + final int nCols = daysPerWeek + (getControl().isShowWeekNumbers() ? 1 : 0); + final double snapHGap = snapSpaceX(getHgap()); + final double hGaps = snapHGap * (nCols - 1); + final double left = snapSpaceX(getInsets().getLeft()); + final double right = snapSpaceX(getInsets().getRight()); + final double contentWidth = width - left - right - hGaps; + return ((snapSizeX(contentWidth / nCols)) * nCols) + left + right + hGaps; + } + + @Override + protected void layoutChildren() { + // prevent AssertionError in GridPane + if (getWidth() > 0 && getHeight() > 0) { + super.layoutChildren(); + } + } + } + + /////////////////////////////////////////////////////////////////////////// + // API // + /////////////////////////////////////////////////////////////////////////// + + public void refresh() { + updateDayNameCells(); + updateValues(); + } + + public void updateValues() { + // preserve this order + updateWeekNumberCells(); + updateDayCells(); + updateMonthYearPane(); + } + + public void updateGrid() { + calendarGrid.getColumnConstraints().clear(); + calendarGrid.getChildren().clear(); + + final int nCols = daysPerWeek + (getControl().isShowWeekNumbers() ? 1 : 0); + + // column constraints + ColumnConstraints columnConstraints = new ColumnConstraints(); + columnConstraints.setPercentWidth(100); // treated as weight + for (int i = 0; i < nCols; i++) { + calendarGrid.getColumnConstraints().add(columnConstraints); + } + + // day names row + for (int i = 0; i < daysPerWeek; i++) { + calendarGrid.add(dayNameCells.get(i), i + nCols - daysPerWeek, 1); + } + + // week number column + if (getControl().isShowWeekNumbers()) { + for (int i = 0; i < 6; i++) { + calendarGrid.add(weekNumberCells.get(i), 0, i + 2); + } + } + + // setup 6 rows of daysPerWeek, which is the maximum number of cells + // required in the worst case layout + for (int row = 0; row < 6; row++) { + for (int col = 0; col < daysPerWeek; col++) { + calendarGrid.add(dayCells.get(row * daysPerWeek + col), col + nCols - daysPerWeek, row + 2); + } + } + } + + public void updateDayNameCells() { + // first day of week, 1 = monday, 7 = sunday + final int firstDayOfWeek = WeekFields.of(getLocale()).getFirstDayOfWeek().getValue(); + + // july 13th 2009 is a Monday, so a firstDayOfWeek = 1 must come out of the 13th + final LocalDate date = LocalDate.of(2009, 7, 12 + firstDayOfWeek); + for (int i = 0; i < daysPerWeek; i++) { + String name = weekDayNameFormatter.withLocale(getLocale()).format(date.plus(i, DAYS)); + dayNameCells.get(i).setText(capitalize(name)); + } + } + + public void updateWeekNumberCells() { + if (getControl().isShowWeekNumbers()) { + final Locale locale = getLocale(); + final int maxWeeksPerMonth = 6; + + final LocalDate firstOfMonth = displayedYearMonth.get().atDay(1); + for (int i = 0; i < maxWeeksPerMonth; i++) { + LocalDate date = firstOfMonth.plus(i, WEEKS); + // use a formatter to ensure correct localization + // such as when Thai numerals are required. + String cellText = weekNumberFormatter + .withLocale(locale) + .withDecimalStyle(DecimalStyle.of(locale)) + .format(date); + weekNumberCells.get(i).setText(cellText); + } + } + } + + public void updateDayCells() { + final Locale locale = getLocale(); + final Chronology chrono = getPrimaryChronology(); + final YearMonth curMonth = displayedYearMonth.get(); + final int firstOfMonthIdx = determineFirstOfMonthDayOfWeek(); + + YearMonth prevMonth = null; + YearMonth nextMonth = null; + int daysInCurMonth = -1; + int daysInPrevMonth = -1; + + for (int i = 0; i < 6 * daysPerWeek; i++) { + final DateCell dayCell = dayCells.get(i); + dayCell.getStyleClass().setAll("cell", "date-cell", "day-cell"); + dayCell.setDisable(false); + dayCell.setStyle(null); + dayCell.setGraphic(null); + dayCell.setTooltip(null); + + try { + daysInCurMonth = daysInCurMonth == -1 ? curMonth.lengthOfMonth() : daysInCurMonth; + YearMonth month = curMonth; + int day = i - firstOfMonthIdx + 1; + + if (i < firstOfMonthIdx) { + if (prevMonth == null) { + prevMonth = curMonth.minusMonths(1); + daysInPrevMonth = prevMonth.lengthOfMonth(); + } + month = prevMonth; + day = i + daysInPrevMonth - firstOfMonthIdx + 1; + dayCell.getStyleClass().add("previous-month"); + } else if (i >= firstOfMonthIdx + daysInCurMonth) { + if (nextMonth == null) { + nextMonth = curMonth.plusMonths(1); + } + month = nextMonth; + day = i - daysInCurMonth - firstOfMonthIdx + 1; + dayCell.getStyleClass().add("next-month"); + } + + LocalDate date = month.atDay(day); + dayCellDates[i] = date; + ChronoLocalDate cDate = chrono.date(date); + + dayCell.setDisable(false); + + if (isToday(date)) { + dayCell.getStyleClass().add("today"); + } + + if (date.equals(getControl().getValue())) { + dayCell.getStyleClass().add("selected"); + } + + String cellText = dayCellFormatter.withLocale(locale) + .withChronology(chrono) + .withDecimalStyle(DecimalStyle.of(locale)) + .format(cDate); + + dayCell.setText(cellText); + dayCell.updateItem(date, false); + } catch (DateTimeException ex) { + // date is out of range + dayCell.setText(" "); + dayCell.setDisable(true); + } + } + } + + // determine on which day of week idx the first of the months is + private int determineFirstOfMonthDayOfWeek() { + // determine with which cell to start + int firstDayOfWeek = WeekFields.of(getLocale()).getFirstDayOfWeek().getValue(); + int firstOfMonthIdx = displayedYearMonth.get().atDay(1).getDayOfWeek().getValue() - firstDayOfWeek; + return firstOfMonthIdx < 0 ? firstOfMonthIdx + daysPerWeek : firstOfMonthIdx; + } + + public void updateMonthYearPane() { + YearMonth yearMonth = displayedYearMonth.get(); + monthLabel.setText(formatMonth(yearMonth)); + yearLabel.setText(formatYear(yearMonth)); + backButton.setDisable(!canGoMonthBack()); + forwardButton.setDisable(!canGoMonthForward()); + } + + protected String formatMonth(YearMonth yearMonth) { + Chronology chrono = getPrimaryChronology(); + try { + ChronoLocalDate chronoDate = chrono.date(yearMonth.atDay(1)); + String str = monthFormatterSO.withLocale(getLocale()) + .withChronology(chrono) + .format(chronoDate); + if (Character.isDigit(str.charAt(0))) { + // fallback: if standalone format returned a number, use standard format instead + str = monthFormatter.withLocale(getLocale()) + .withChronology(chrono) + .format(chronoDate); + } + return capitalize(str); + } catch (DateTimeException ex) { + // date is out of range + return ""; + } + } + + protected String formatYear(YearMonth yearMonth) { + Chronology chrono = getPrimaryChronology(); + try { + ChronoLocalDate chronoDate = chrono.date(yearMonth.atDay(1)); + return yearFormatter.withLocale(getLocale()) + .withChronology(chrono) + .withDecimalStyle(DecimalStyle.of(getLocale())) + .format(chronoDate); + } catch (DateTimeException ex) { + // date is out of range + return ""; + } + } + + public void forward(int offset, ChronoUnit unit, boolean focusDayCell) { + YearMonth yearMonth = displayedYearMonth.get(); + DateCell dateCell = lastFocusedDayCell; + if (dateCell == null || !getDayCellDate(dateCell).getMonth().equals(yearMonth.getMonth())) { + dateCell = findDayCellForDate(yearMonth.atDay(1)); + } + goToDayCell(dateCell, offset, unit, focusDayCell); + } + + public void goToDayCell(DateCell dateCell, int offset, ChronoUnit unit, boolean focusDayCell) { + goToDate(getDayCellDate(dateCell).plus(offset, unit), focusDayCell); + } + + public void goToDate(LocalDate date, boolean focusDayCell) { + if (isValidDate(getPrimaryChronology(), date)) { + displayedYearMonth.set(YearMonth.from(date)); + if (focusDayCell) { + findDayCellForDate(date).requestFocus(); + } + } + } + + private DateCell findDayCellForDate(LocalDate date) { + for (int i = 0; i < dayCellDates.length; i++) { + if (date.equals(dayCellDates[i])) { + return dayCells.get(i); + } + } + return dayCells.get(dayCells.size() / 2 + 1); + } + + public void selectDayCell(DateCell dateCell) { + getControl().setValue(getDayCellDate(dateCell)); + } + + private LocalDate getDayCellDate(DateCell dateCell) { + return dayCellDates[dayCells.indexOf(dateCell)]; + } + + protected void createDayCells() { + EventHandler dayCellActionHandler = e -> { + if (e.getButton() != MouseButton.PRIMARY) { return; } + DateCell dayCell = (DateCell) e.getSource(); + selectDayCell(dayCell); + lastFocusedDayCell = dayCell; + }; + + for (int row = 0; row < 6; row++) { + for (int col = 0; col < daysPerWeek; col++) { + DateCell dayCell = createDayCell(); + dayCell.addEventHandler(MouseEvent.MOUSE_CLICKED, dayCellActionHandler); + dayCells.add(dayCell); + } + } + + dayCellDates = new LocalDate[6 * daysPerWeek]; + } + + protected DateCell createDayCell() { + Callback factory = getControl().getDayCellFactory(); + return Objects.requireNonNullElseGet( + factory != null ? factory.call(getControl()) : null, + DateCell::new + ); + } + + public void rememberFocusedDayCell() { + Node node = getControl().getScene().getFocusOwner(); + if (node instanceof DateCell) { + lastFocusedDayCell = (DateCell) node; + } + } + + public boolean canGoMonthBack() { + return isValidDate(getPrimaryChronology(), getFirstDayOfMonth(), -1, DAYS); + } + + public boolean canGoMonthForward() { + return isValidDate(getPrimaryChronology(), getFirstDayOfMonth(), +1, MONTHS); + } + + public boolean canGoYearBack() { + return isValidDate(getPrimaryChronology(), getFirstDayOfMonth(), -1, YEARS); + } + + public boolean canGoYearForward() { + return isValidDate(getPrimaryChronology(), getFirstDayOfMonth(), +1, YEARS); + } + + public void clearFocus() { + LocalDate focusDate = Objects.requireNonNullElseGet(getControl().getValue(), LocalDate::now); + if (YearMonth.from(focusDate).equals(displayedYearMonth.get())) { + goToDate(focusDate, true); // focus date + } else { + backButton.requestFocus(); // should not happen + } + } + + private static String capitalize(String word) { + if (word.length() > 0) { + int firstChar = word.codePointAt(0); + if (!Character.isTitleCase(firstChar)) { + word = new String(new int[] { + Character.toTitleCase(firstChar) }, 0, 1) + + word.substring(Character.offsetByCodePoints(word, 0, 1)); + } + } + return word; + } + + private static boolean isToday(LocalDate date) { + return date != null && date.equals(today()); + } + + private static LocalDate today() { + return LocalDate.now(); + } +} diff --git a/base/src/main/java/atlantafx/base/controls/Popover.java b/base/src/main/java/atlantafx/base/controls/Popover.java new file mode 100755 index 0000000..cc9fa0f --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/Popover.java @@ -0,0 +1,920 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright (c) 2013, 2022 ControlsFX + * All rights reserved. + *

+ * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of ControlsFX, any associated website, nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + *

+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL CONTROLSFX BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package atlantafx.base.controls; + +import javafx.animation.FadeTransition; +import javafx.application.Platform; +import javafx.beans.InvalidationListener; +import javafx.beans.WeakInvalidationListener; +import javafx.beans.property.*; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.WeakChangeListener; +import javafx.event.EventHandler; +import javafx.event.WeakEventHandler; +import javafx.geometry.Bounds; +import javafx.geometry.Insets; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.control.PopupControl; +import javafx.scene.control.Skin; +import javafx.scene.layout.StackPane; +import javafx.stage.Window; +import javafx.stage.WindowEvent; +import javafx.util.Duration; + +import java.util.Objects; +import java.util.Timer; +import java.util.TimerTask; + +import static java.util.Objects.requireNonNull; +import static javafx.scene.input.MouseEvent.MOUSE_CLICKED; + +/** + * The Popover control provides detailed information about an owning node in a + * popup window. The popup window has a very lightweight appearance (no default + * window decorations) and an arrow pointing at the owner. Due to the nature of + * popup windows the Popover will move around with the parent window when the + * user drags it. + *

+ * The Popover can be detached from the owning node by dragging it away from the + * owner. It stops displaying an arrow and starts displaying a title and a close + * icon. + */ +@SuppressWarnings("unused") +public class Popover extends PopupControl { + + private static final String DEFAULT_STYLE_CLASS = "popover"; + private static final Duration DEFAULT_FADE_DURATION = Duration.seconds(.2); + + private double targetX; + private double targetY; + + private final SimpleBooleanProperty animated = new SimpleBooleanProperty(true); + private final ObjectProperty fadeInDuration = new SimpleObjectProperty<>(DEFAULT_FADE_DURATION); + private final ObjectProperty fadeOutDuration = new SimpleObjectProperty<>(DEFAULT_FADE_DURATION); + + /** Creates a popover with a label as the content node. */ + public Popover() { + super(); + + getStyleClass().add(DEFAULT_STYLE_CLASS); + + setAnchorLocation(AnchorLocation.WINDOW_TOP_LEFT); + setOnHiding(evt -> setDetached(false)); + + /* Create some initial content */ + Label label = new Label("No Content"); + label.setPrefSize(200, 200); + label.setPadding(new Insets(4)); + setContentNode(label); + + InvalidationListener repositionListener = observable -> { + if (isShowing() && !isDetached()) { + show(getOwnerNode(), targetX, targetY); + adjustWindowLocation(); + } + }; + + arrowSize.addListener(repositionListener); + cornerRadius.addListener(repositionListener); + arrowLocation.addListener(repositionListener); + arrowIndent.addListener(repositionListener); + headerAlwaysVisible.addListener(repositionListener); + + // a detached popover should of course not automatically hide itself + detached.addListener(it -> setAutoHide(!isDetached())); + + setAutoHide(true); + } + + /** + * Creates a popover with the given node as the content node. + * + * @param content The content shown by the popover + */ + public Popover(Node content) { + this(); + + setContentNode(content); + } + + @Override + protected Skin createDefaultSkin() { + return new PopoverSkin(this); + } + + private final StackPane root = new StackPane(); + + /** + * The root pane stores the content node of the popover. It is accessible + * via this method in order to support proper styling. + * + * Example: + * + *

+     * Popover popOver = new Popover();
+     * popOver.getRoot().getStylesheets().add(...);
+     * 
+ * + * @return the root pane + */ + public final StackPane getRoot() { + return root; + } + + private final ObjectProperty contentNode = new SimpleObjectProperty<>(this, "contentNode") { + @Override + public void setValue(Node node) { + if (node == null) { throw new IllegalArgumentException("content node can not be null"); } + } + }; + + /** + * Returns the content shown by the popover. + * + * @return the content node property + */ + public final ObjectProperty contentNodeProperty() { + return contentNode; + } + + /** + * Returns the value of the content property + * + * @return the content node + * + * @see #contentNodeProperty() + */ + public final Node getContentNode() { + return contentNodeProperty().get(); + } + + /** + * Sets the value of the content property. + * + * @param content the new content node value + * + * @see #contentNodeProperty() + */ + public final void setContentNode(Node content) { + contentNodeProperty().set(content); + } + + private final InvalidationListener hideListener = observable -> { + if (!isDetached()) { + hide(Duration.ZERO); + } + }; + + private final WeakInvalidationListener weakHideListener = new WeakInvalidationListener(hideListener); + + private final ChangeListener xListener = (value, oldX, newX) -> { + if (!isDetached()) { + setAnchorX(getAnchorX() + (newX.doubleValue() - oldX.doubleValue())); + } + }; + + private final WeakChangeListener weakXListener = new WeakChangeListener<>(xListener); + + private final ChangeListener yListener = (value, oldY, newY) -> { + if (!isDetached()) { + setAnchorY(getAnchorY() + (newY.doubleValue() - oldY.doubleValue())); + } + }; + + private final WeakChangeListener weakYListener = new WeakChangeListener<>(yListener); + + private Window ownerWindow; + private final EventHandler closePopoverOnOwnerWindowCloseLambda = event -> ownerWindowHiding(); + private final WeakEventHandler closePopoverOnOwnerWindowClose = + new WeakEventHandler<>(closePopoverOnOwnerWindowCloseLambda); + + /** + * Shows the popover in a position relative to the edges of the given owner + * node. The position is dependent on the arrow location. If the arrow is + * pointing to the right then the popover will be placed to the left of the + * given owner. If the arrow points up then the popover will be placed + * below the given owner node. The arrow will slightly overlap with the + * owner node. + * + * @param owner the owner of the popover + */ + public final void show(Node owner) { + show(owner, 4); + } + + /** + * Shows the popover in a position relative to the edges of the given owner + * node. The position is dependent on the arrow location. If the arrow is + * pointing to the right then the popover will be placed to the left of the + * given owner. If the arrow points up then the popover will be placed + * below the given owner node. + * + * @param owner the owner of the popover + * @param offset if negative specifies the distance to the owner node or when + * positive specifies the number of pixels that the arrow will + * overlap with the owner node (positive values are recommended) + */ + public final void show(Node owner, double offset) { + requireNonNull(owner); + + Bounds bounds = owner.localToScreen(owner.getBoundsInLocal()); + + switch (getArrowLocation()) { + case BOTTOM_CENTER, BOTTOM_LEFT, BOTTOM_RIGHT -> show( + owner, bounds.getMinX() + bounds.getWidth() / 2, bounds.getMinY() + offset + ); + case LEFT_BOTTOM, LEFT_CENTER, LEFT_TOP -> show( + owner, bounds.getMaxX() - offset, bounds.getMinY() + bounds.getHeight() / 2 + ); + case RIGHT_BOTTOM, RIGHT_CENTER, RIGHT_TOP -> show( + owner, bounds.getMinX() + offset, bounds.getMinY() + bounds.getHeight() / 2 + ); + case TOP_CENTER, TOP_LEFT, TOP_RIGHT -> show( + owner, bounds.getMinX() + bounds.getWidth() / 2, bounds.getMinY() + bounds.getHeight() - offset + ); + } + } + + /** {@inheritDoc} */ + @Override + public final void show(Window owner) { + super.show(owner); + ownerWindow = owner; + + if (isAnimated()) { + showFadeInAnimation(getFadeInDuration()); + } + + ownerWindow.addEventFilter(WindowEvent.WINDOW_HIDING, closePopoverOnOwnerWindowClose); + } + + /** {@inheritDoc} */ + @Override + public final void show(Window ownerWindow, double anchorX, double anchorY) { + super.show(ownerWindow, anchorX, anchorY); + this.ownerWindow = ownerWindow; + + if (isAnimated()) { + showFadeInAnimation(getFadeInDuration()); + } + + ownerWindow.addEventFilter(WindowEvent.WINDOW_HIDING, closePopoverOnOwnerWindowClose); + } + + /** + * Makes the popover visible at the give location and associates it with + * the given owner node. The x and y coordinate will be the target location + * of the arrow of the popover and not the location of the window. + * + * @param owner the owning node + * @param x the x coordinate for the popover arrow tip + * @param y the y coordinate for the popover arrow tip + */ + @Override + public final void show(Node owner, double x, double y) { + show(owner, x, y, getFadeInDuration()); + } + + /** + * Makes the popover visible at the give location and associates it with + * the given owner node. The x and y coordinate will be the target location + * of the arrow of the popover and not the location of the window. + * + * @param owner the owning node + * @param x the x coordinate for the popover arrow tip + * @param y the y coordinate for the popover arrow tip + * @param fadeInDuration the time it takes for the popover to be fully visible. + * This duration takes precedence over the fade-in property without setting. + */ + public final void show(Node owner, double x, double y, Duration fadeInDuration) { + /* + * Calling show() a second time without first closing the popover + * causes it to be placed at the wrong location. + */ + if (ownerWindow != null && isShowing()) { + super.hide(); + } + + targetX = x; + targetY = y; + + if (owner == null) { + throw new IllegalArgumentException("owner can not be null"); + } + + // this is all needed because children windows do not get their x and y + // coordinate updated when the owning window gets moved by the user + if (ownerWindow != null) { + ownerWindow.xProperty().removeListener(weakXListener); + ownerWindow.yProperty().removeListener(weakYListener); + ownerWindow.widthProperty().removeListener(weakHideListener); + ownerWindow.heightProperty().removeListener(weakHideListener); + } + + ownerWindow = owner.getScene().getWindow(); + ownerWindow.xProperty().addListener(weakXListener); + ownerWindow.yProperty().addListener(weakYListener); + ownerWindow.widthProperty().addListener(weakHideListener); + ownerWindow.heightProperty().addListener(weakHideListener); + + setOnShown(evt -> { + // the user clicked somewhere into the transparent background, + // if this is the case then hide the window (when attached) + getScene().addEventHandler(MOUSE_CLICKED, mouseEvent -> { + if (mouseEvent.getTarget().equals(getScene().getRoot())) { + if (!isDetached()) { hide(); } + } + }); + + // move the window so that the arrow will end up pointing at the target coordinates + adjustWindowLocation(); + + // Popover flickering fix: + // The reason of flickering is that for calculating popup bounds show() method have to + // be called PRIOR TO adjusting window position. So, in a very short period we see the + // window in its initial position. Ideally, we have to call adjustWindowLocation() right + // after window is added to the scene, but before it's rendered, which is not possible + // due to JavaFX async nature. The only way seems to start popover as invisible (not opaque) + // and then restore its visibility after a fixed delay to hide window repositioning. + // Still it's not a 100% guarantee,but better than nothing. + int delay = Math.min((int) Objects.requireNonNullElse(fadeInDuration, DEFAULT_FADE_DURATION).toMillis() / 2, 250); + new Timer().schedule(new TimerTask() { + @Override + public void run() { + Platform.runLater(() -> getSkin().getNode().setVisible(true)); + } + }, delay); + }); + + super.show(owner, x, y); + + if (isAnimated()) { + showFadeInAnimation(Objects.requireNonNullElse(fadeInDuration, DEFAULT_FADE_DURATION)); + } + + ownerWindow.addEventFilter(WindowEvent.WINDOW_HIDING, closePopoverOnOwnerWindowClose); + } + + private void showFadeInAnimation(Duration fadeInDuration) { + // fade in + Node skinNode = getSkin().getNode(); + skinNode.setOpacity(0); + + FadeTransition fadeIn = new FadeTransition(fadeInDuration, skinNode); + fadeIn.setFromValue(0); + fadeIn.setToValue(1); + fadeIn.play(); + } + + private void ownerWindowHiding() { + hide(Duration.ZERO); + if (ownerWindow != null) { + // remove EventFilter to prevent memory leak + ownerWindow.removeEventFilter(WindowEvent.WINDOW_HIDING, closePopoverOnOwnerWindowClose); + } + } + + /** + * Hides the popover by quickly changing its opacity to 0. + * + * @see #hide(Duration) + */ + @Override + public final void hide() { + hide(getFadeOutDuration()); + } + + /** + * Hides the popover by quickly changing its opacity to 0. + * + * @param fadeOutDuration the duration of the fade transition that is being used to + * change the opacity of the popover + */ + public final void hide(Duration fadeOutDuration) { + if (fadeOutDuration == null) { + fadeOutDuration = DEFAULT_FADE_DURATION; + } + + if (isShowing()) { + if (isAnimated()) { + // fade out + Node skinNode = getSkin().getNode(); + + FadeTransition fadeOut = new FadeTransition(fadeOutDuration, skinNode); + fadeOut.setFromValue(skinNode.getOpacity()); + fadeOut.setToValue(0); + fadeOut.setOnFinished(evt -> super.hide()); + fadeOut.play(); + } else { + super.hide(); + } + getSkin().getNode().setVisible(false); + } + } + + private void adjustWindowLocation() { + Bounds bounds = getSkin().getNode().getBoundsInParent(); + switch (getArrowLocation()) { + case TOP_CENTER, TOP_LEFT, TOP_RIGHT -> { + setAnchorX(getAnchorX() + bounds.getMinX() - computeXOffset()); + setAnchorY(getAnchorY() + bounds.getMinY() + getArrowSize()); + } + case LEFT_TOP, LEFT_CENTER, LEFT_BOTTOM -> { + setAnchorX(getAnchorX() + bounds.getMinX() + getArrowSize()); + setAnchorY(getAnchorY() + bounds.getMinY() - computeYOffset()); + } + case BOTTOM_CENTER, BOTTOM_LEFT, BOTTOM_RIGHT -> { + setAnchorX(getAnchorX() + bounds.getMinX() - computeXOffset()); + setAnchorY(getAnchorY() - bounds.getMinY() - bounds.getMaxY() - 1); + } + case RIGHT_TOP, RIGHT_BOTTOM, RIGHT_CENTER -> { + setAnchorX(getAnchorX() - bounds.getMinX() - bounds.getMaxX() - 1); + setAnchorY(getAnchorY() + bounds.getMinY() - computeYOffset()); + } + } + } + + private double computeXOffset() { + return switch (getArrowLocation()) { + case TOP_LEFT, BOTTOM_LEFT -> ( + getCornerRadius() + getArrowIndent() + getArrowSize() + ); + case TOP_CENTER, BOTTOM_CENTER -> ( + getContentNode().prefWidth(-1) / 2 + ); + case TOP_RIGHT, BOTTOM_RIGHT -> ( + getContentNode().prefWidth(-1) - getArrowIndent() - getCornerRadius() - getArrowSize() + ); + default -> 0; + }; + } + + private double computeYOffset() { + double prefContentHeight = getContentNode().prefHeight(-1); + + return switch (getArrowLocation()) { + case LEFT_TOP, RIGHT_TOP -> ( + getCornerRadius() + getArrowIndent() + getArrowSize() + ); + case LEFT_CENTER, RIGHT_CENTER -> ( + Math.max(prefContentHeight, 2 * (getCornerRadius() + getArrowIndent() + getArrowSize())) / 2 + ); + case LEFT_BOTTOM, RIGHT_BOTTOM -> ( + Math.max(prefContentHeight - getCornerRadius() - getArrowIndent() - getArrowSize(), + getCornerRadius() + getArrowIndent() + getArrowSize() + ) + ); + default -> 0; + }; + } + + /** + * Detaches the popover from the owning node. The popover will no longer + * display an arrow pointing at the owner node. + */ + public final void detach() { + if (isDetachable()) { + setDetached(true); + } + } + + private final BooleanProperty headerAlwaysVisible = new SimpleBooleanProperty(this, "headerAlwaysVisible"); + + /** + * Determines whether the {@link Popover} header should remain visible or not, + * even while attached. + */ + public final BooleanProperty headerAlwaysVisibleProperty() { + return headerAlwaysVisible; + } + + /** + * Sets the value of the headerAlwaysVisible property. + * + * @param visible if true, then the header is visible even while attached + * + * @see #headerAlwaysVisibleProperty() + */ + public final void setHeaderAlwaysVisible(boolean visible) { + headerAlwaysVisible.setValue(visible); + } + + /** + * Returns the value of the detachable property. + * + * @return true if the header is visible even while attached + * + * @see #headerAlwaysVisibleProperty() + */ + public final boolean isHeaderAlwaysVisible() { + return headerAlwaysVisible.getValue(); + } + + private final BooleanProperty closeButtonEnabled = new SimpleBooleanProperty(this, "closeButtonEnabled", true); + + /** + * Determines whether the header's close button should be available or not. + */ + public final BooleanProperty closeButtonEnabledProperty() { + return closeButtonEnabled; + } + + /** + * Sets the value of the closeButtonEnabled property. + * + * @param enabled if false, the popover will not be closeable by the header's close button + * + * @see #closeButtonEnabledProperty() + */ + public final void setCloseButtonEnabled(boolean enabled) { + closeButtonEnabled.setValue(enabled); + } + + /** + * Returns the value of the closeButtonEnabled property. + * + * @return true if the header's close button is enabled + * + * @see #closeButtonEnabledProperty() + */ + public final boolean isCloseButtonEnabled() { + return closeButtonEnabled.getValue(); + } + + private final BooleanProperty detachable = new SimpleBooleanProperty(this, "detachable", true); + + /** + * Determines if the popover is detachable at all. + */ + public final BooleanProperty detachableProperty() { + return detachable; + } + + /** + * Sets the value of the detachable property. + * + * @param detachable if true then the user can detach / tear off the popover + * + * @see #detachableProperty() + */ + public final void setDetachable(boolean detachable) { + detachableProperty().set(detachable); + } + + /** + * Returns the value of the detachable property. + * + * @return true if the user is allowed to detach / tear off the popover + * + * @see #detachableProperty() + */ + public final boolean isDetachable() { + return detachableProperty().get(); + } + + private final BooleanProperty detached = new SimpleBooleanProperty(this, "detached", false); + + /** + * Determines whether the popover is detached from the owning node or not. + * A detached popover no longer shows an arrow pointing at the owner and + * features its own title bar. + * + * @return the detached property + */ + public final BooleanProperty detachedProperty() { + return detached; + } + + /** + * Sets the value of the detached property. + * + * @param detached if true the popover will change its appearance to "detached" + * mode + * + * @see #detachedProperty() + */ + public final void setDetached(boolean detached) { + detachedProperty().set(detached); + } + + /** + * Returns the value of the detached property. + * + * @return true if the popover is currently detached. + * + * @see #detachedProperty() + */ + public final boolean isDetached() { + return detachedProperty().get(); + } + + private final DoubleProperty arrowSize = new SimpleDoubleProperty(this, "arrowSize", 12); + + /** + * Controls the size of the arrow. Default value is 12. + * + * @return the arrow size property + */ + public final DoubleProperty arrowSizeProperty() { + return arrowSize; + } + + /** + * Returns the value of the arrow size property. + * + * @return the arrow size property value + * + * @see #arrowSizeProperty() + */ + public final double getArrowSize() { + return arrowSizeProperty().get(); + } + + /** + * Sets the value of the arrow size property. + * + * @param size the new value of the arrow size property + * + * @see #arrowSizeProperty() + */ + public final void setArrowSize(double size) { + arrowSizeProperty().set(size); + } + + private final DoubleProperty arrowIndent = new SimpleDoubleProperty(this, "arrowIndent", 12); + + /** + * Controls the distance between the arrow and the corners of the popover. + * The default value is 12. + * + * @return the arrow indent property + */ + public final DoubleProperty arrowIndentProperty() { + return arrowIndent; + } + + /** + * Returns the value of the arrow indent property. + * + * @return the arrow indent value + * + * @see #arrowIndentProperty() + */ + public final double getArrowIndent() { + return arrowIndentProperty().get(); + } + + /** + * Sets the value of the arrow indent property. + * + * @param size the arrow indent value + * + * @see #arrowIndentProperty() + */ + public final void setArrowIndent(double size) { + arrowIndentProperty().set(size); + } + + private final DoubleProperty cornerRadius = new SimpleDoubleProperty(this, "cornerRadius", 6); + + /** + * Returns the corner radius property for the popover. + * + * @return the corner radius property (default is 6) + */ + public final DoubleProperty cornerRadiusProperty() { + return cornerRadius; + } + + /** + * Returns the value of the corner radius property. + * + * @return the corner radius + * + * @see #cornerRadiusProperty() + */ + public final double getCornerRadius() { + return cornerRadiusProperty().get(); + } + + /** + * Sets the value of the corner radius property. + * + * @param radius the corner radius + * + * @see #cornerRadiusProperty() + */ + public final void setCornerRadius(double radius) { + cornerRadiusProperty().set(radius); + } + + private final StringProperty title = new SimpleStringProperty(this, "title", "Info"); + + /** + * Stores the title to display in the Popover's header. + * + * @return the title property + */ + public final StringProperty titleProperty() { + return title; + } + + /** + * Returns the value of the title property. + * + * @return the detached title + * + * @see #titleProperty() + */ + public final String getTitle() { + return titleProperty().get(); + } + + /** + * Sets the value of the title property. + * + * @param title the title to use when detached + * + * @see #titleProperty() + */ + public final void setTitle(String title) { + if (title == null) { + throw new IllegalArgumentException("title can not be null"); + } + titleProperty().set(title); + } + + private final ObjectProperty arrowLocation = new SimpleObjectProperty<>(this, "arrowLocation", ArrowLocation.LEFT_TOP); + + /** + * Stores the preferred arrow location. This might not be the actual + * location of the arrow if auto fix is enabled. + * + * @return the arrow location property + * + * @see #setAutoFix(boolean) + */ + public final ObjectProperty arrowLocationProperty() { + return arrowLocation; + } + + /** + * Sets the value of the arrow location property. + * + * @param location the requested location + * + * @see #arrowLocationProperty() + */ + public final void setArrowLocation(ArrowLocation location) { + arrowLocationProperty().set(location); + } + + /** + * Returns the value of the arrow location property. + * + * @return the preferred arrow location + * + * @see #arrowLocationProperty() + */ + public final ArrowLocation getArrowLocation() { + return arrowLocationProperty().get(); + } + + /** All possible arrow locations */ + public enum ArrowLocation { + LEFT_TOP, + LEFT_CENTER, + LEFT_BOTTOM, + RIGHT_TOP, + RIGHT_CENTER, + RIGHT_BOTTOM, + TOP_LEFT, + TOP_CENTER, + TOP_RIGHT, + BOTTOM_LEFT, + BOTTOM_CENTER, + BOTTOM_RIGHT + } + + /** + * Stores the fade-in duration. This should be set before calling Popover.show(..). + * + * @return the fade-in duration property + */ + public final ObjectProperty fadeInDurationProperty() { + return fadeInDuration; + } + + /** + * Stores the fade-out duration. + * + * @return the fade-out duration property + */ + public final ObjectProperty fadeOutDurationProperty() { + return fadeOutDuration; + } + + /** + * Returns the value of the fade-in duration property. + * + * @return the fade-in duration + * + * @see #fadeInDurationProperty() + */ + public final Duration getFadeInDuration() { + return fadeInDurationProperty().get(); + } + + /** + * Sets the value of the fade-in duration property. This should be set before calling + * Popover.show(..). + * + * @param duration the requested fade-in duration + * + * @see #fadeInDurationProperty() + */ + public final void setFadeInDuration(Duration duration) { + fadeInDurationProperty().setValue(duration); + } + + /** + * Returns the value of the fade-out duration property. + * + * @return the fade-out duration + * + * @see #fadeOutDurationProperty() + */ + public final Duration getFadeOutDuration() { + return fadeOutDurationProperty().get(); + } + + /** + * Sets the value of the fade-out duration property. + * + * @param duration the requested fade-out duration + * + * @see #fadeOutDurationProperty() + */ + public final void setFadeOutDuration(Duration duration) { + fadeOutDurationProperty().setValue(duration); + } + + /** + * Stores the "animated" flag. If true then the Popover will be shown / hidden with a short + * fade in / out animation. + * + * @return the "animated" property + */ + public final BooleanProperty animatedProperty() { + return animated; + } + + /** + * Returns the value of the "animated" property. + * + * @return true if the Popover will be shown and hidden with a short fade animation + * + * @see #animatedProperty() + */ + public final boolean isAnimated() { + return animatedProperty().get(); + } + + /** + * Sets the value of the "animated" property. + * + * @param animated if true the Popover will be shown and hidden with a short fade animation + * + * @see #animatedProperty() + */ + public final void setAnimated(boolean animated) { + animatedProperty().set(animated); + } +} diff --git a/base/src/main/java/atlantafx/base/controls/PopoverSkin.java b/base/src/main/java/atlantafx/base/controls/PopoverSkin.java new file mode 100755 index 0000000..d96b4f8 --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/PopoverSkin.java @@ -0,0 +1,667 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright (c) 2013 - 2015, ControlsFX + * All rights reserved. + *

+ * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of ControlsFX, any associated website, nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + *

+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL CONTROLSFX BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package atlantafx.base.controls; + +import javafx.beans.InvalidationListener; +import javafx.beans.binding.Bindings; +import javafx.beans.property.DoubleProperty; +import javafx.beans.property.SimpleDoubleProperty; +import javafx.event.EventHandler; +import javafx.geometry.Point2D; +import javafx.geometry.Pos; +import javafx.scene.Group; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.control.Skin; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.StackPane; +import javafx.scene.shape.*; +import javafx.stage.Window; + +import java.util.ArrayList; +import java.util.List; + +import static atlantafx.base.controls.Popover.ArrowLocation; +import static java.lang.Double.MAX_VALUE; +import static javafx.geometry.Pos.TOP_RIGHT; +import static javafx.scene.control.ContentDisplay.GRAPHIC_ONLY; +import static javafx.scene.paint.Color.YELLOW; + +public class PopoverSkin implements Skin { + + private static final String DETACHED_STYLE_CLASS = "detached"; + + private double xOffset; + private double yOffset; + private boolean tornOff; + + private final Path path; + private final Path clip; + + private final BorderPane content; + private final StackPane titlePane; + private final StackPane stackPane; + + private Point2D dragStartLocation; + private final Popover popover; + + public PopoverSkin(final Popover popover) { + this.popover = popover; + + stackPane = popover.getRoot(); + stackPane.setPickOnBounds(false); + + Bindings.bindContent(stackPane.getStyleClass(), popover.getStyleClass()); + + // the min width and height equal (2 * corner radius + 2 * arrow indent + 2 * arrow size) + stackPane.minWidthProperty().bind( + Bindings.add(Bindings.multiply(2, popover.arrowSizeProperty()), + Bindings.add( + Bindings.multiply(2, popover.cornerRadiusProperty()), + Bindings.multiply(2, popover.arrowIndentProperty()) + ) + ) + ); + + stackPane.minHeightProperty().bind(stackPane.minWidthProperty()); + + Label title = new Label(); + title.textProperty().bind(popover.titleProperty()); + title.setMaxSize(MAX_VALUE, MAX_VALUE); + title.setAlignment(Pos.CENTER); + title.getStyleClass().add("text"); + + Label closeIcon = new Label(); + closeIcon.setGraphic(createCloseIcon()); + closeIcon.setMaxSize(MAX_VALUE, MAX_VALUE); + closeIcon.setContentDisplay(GRAPHIC_ONLY); + closeIcon.visibleProperty().bind( + popover.closeButtonEnabledProperty().and( + popover.detachedProperty().or(popover.headerAlwaysVisibleProperty()))); + closeIcon.getStyleClass().add("icon"); + closeIcon.setAlignment(TOP_RIGHT); + closeIcon.getGraphic().setOnMouseClicked(evt -> popover.hide()); + + titlePane = new StackPane(); + titlePane.getChildren().add(title); + titlePane.getChildren().add(closeIcon); + titlePane.getStyleClass().add("title"); + + content = new BorderPane(); + content.setCenter(popover.getContentNode()); + content.getStyleClass().add("content"); + + if (popover.isDetached() || popover.isHeaderAlwaysVisible()) { + content.setTop(titlePane); + } + + if (popover.isDetached()) { + popover.getStyleClass().add(DETACHED_STYLE_CLASS); + content.getStyleClass().add(DETACHED_STYLE_CLASS); + } + + popover.headerAlwaysVisibleProperty().addListener((o, oV, isVisible) -> { + if (isVisible) { + content.setTop(titlePane); + } else if (!popover.isDetached()) { + content.setTop(null); + } + }); + + InvalidationListener updatePathListener = observable -> updatePath(); + getPopupWindow().xProperty().addListener(updatePathListener); + getPopupWindow().yProperty().addListener(updatePathListener); + popover.arrowLocationProperty().addListener(updatePathListener); + popover.contentNodeProperty().addListener((obs, oldContent, newContent) -> content.setCenter(newContent)); + popover.detachedProperty().addListener((value, oldDetached, newDetached) -> { + if (newDetached) { + popover.getStyleClass().add(DETACHED_STYLE_CLASS); + content.getStyleClass().add(DETACHED_STYLE_CLASS); + content.setTop(titlePane); + + switch (getSkinnable().getArrowLocation()) { + case LEFT_TOP, LEFT_CENTER, LEFT_BOTTOM -> popover.setAnchorX( + popover.getAnchorX() + popover.getArrowSize() + ); + case TOP_LEFT, TOP_CENTER, TOP_RIGHT -> popover.setAnchorY( + popover.getAnchorY() + popover.getArrowSize() + ); + } + } else { + popover.getStyleClass().remove(DETACHED_STYLE_CLASS); + content.getStyleClass().remove(DETACHED_STYLE_CLASS); + + if (!popover.isHeaderAlwaysVisible()) { + content.setTop(null); + } + } + + popover.sizeToScene(); + + updatePath(); + }); + + path = new Path(); + path.getStyleClass().add("border"); + path.setManaged(false); + + clip = new Path(); + + // the clip is a path and the path has to be filled with a color, + // otherwise clipping will not work. + clip.setFill(YELLOW); + + createPathElements(); + updatePath(); + + final EventHandler mousePressedHandler = evt -> { + if (popover.isDetachable() || popover.isDetached()) { + tornOff = false; + + xOffset = evt.getScreenX(); + yOffset = evt.getScreenY(); + + dragStartLocation = new Point2D(xOffset, yOffset); + } + }; + + final EventHandler mouseReleasedHandler = evt -> { + if (tornOff && !getSkinnable().isDetached()) { + tornOff = false; + getSkinnable().detach(); + } + }; + + final EventHandler mouseDragHandler = evt -> { + if (popover.isDetachable() || popover.isDetached()) { + double deltaX = evt.getScreenX() - xOffset; + double deltaY = evt.getScreenY() - yOffset; + + Window window = getSkinnable().getScene().getWindow(); + + window.setX(window.getX() + deltaX); + window.setY(window.getY() + deltaY); + + xOffset = evt.getScreenX(); + yOffset = evt.getScreenY(); + + if (dragStartLocation.distance(xOffset, yOffset) > 20) { + tornOff = true; + updatePath(); + } else if (tornOff) { + tornOff = false; + updatePath(); + } + } + }; + + stackPane.setOnMousePressed(mousePressedHandler); + stackPane.setOnMouseDragged(mouseDragHandler); + stackPane.setOnMouseReleased(mouseReleasedHandler); + + stackPane.setVisible(false); + stackPane.getChildren().add(path); + stackPane.getChildren().add(content); + + content.setClip(clip); + } + + @Override + public Node getNode() { + return stackPane; + } + + @Override + public Popover getSkinnable() { + return popover; + } + + @Override + public void dispose() { } + + private Node createCloseIcon() { + Group group = new Group(); + group.getStyleClass().add("graphics"); + + Circle circle = new Circle(); + circle.getStyleClass().add("circle"); + circle.setRadius(12); + circle.setCenterX(12); + circle.setCenterY(12); + group.getChildren().add(circle); + + Line line1 = new Line(); + line1.getStyleClass().add("line"); + line1.setStartX(8); + line1.setStartY(8); + line1.setEndX(16); + line1.setEndY(16); + group.getChildren().add(line1); + + Line line2 = new Line(); + line2.getStyleClass().add("line"); + line2.setStartX(16); + line2.setStartY(8); + line2.setEndX(8); + line2.setEndY(16); + group.getChildren().add(line2); + + return group; + } + + private MoveTo moveTo; + + private QuadCurveTo topCurveTo, rightCurveTo, bottomCurveTo, leftCurveTo; + + private HLineTo lineBTop, lineETop, lineHTop, lineKTop; + private LineTo lineCTop, lineDTop, lineFTop, lineGTop, lineITop, lineJTop; + + private VLineTo lineBRight, lineERight, lineHRight, lineKRight; + private LineTo lineCRight, lineDRight, lineFRight, lineGRight, lineIRight, + lineJRight; + + private HLineTo lineBBottom, lineEBottom, lineHBottom, lineKBottom; + private LineTo lineCBottom, lineDBottom, lineFBottom, lineGBottom, + lineIBottom, lineJBottom; + + private VLineTo lineBLeft, lineELeft, lineHLeft, lineKLeft; + private LineTo lineCLeft, lineDLeft, lineFLeft, lineGLeft, lineILeft, + lineJLeft; + + private void createPathElements() { + DoubleProperty centerYProperty = new SimpleDoubleProperty(); + DoubleProperty centerXProperty = new SimpleDoubleProperty(); + + DoubleProperty leftEdgeProperty = new SimpleDoubleProperty(); + DoubleProperty leftEdgePlusRadiusProperty = new SimpleDoubleProperty(); + + DoubleProperty topEdgeProperty = new SimpleDoubleProperty(); + DoubleProperty topEdgePlusRadiusProperty = new SimpleDoubleProperty(); + + DoubleProperty rightEdgeProperty = new SimpleDoubleProperty(); + DoubleProperty rightEdgeMinusRadiusProperty = new SimpleDoubleProperty(); + + DoubleProperty bottomEdgeProperty = new SimpleDoubleProperty(); + DoubleProperty bottomEdgeMinusRadiusProperty = new SimpleDoubleProperty(); + + DoubleProperty cornerProperty = getSkinnable().cornerRadiusProperty(); + + DoubleProperty arrowSizeProperty = getSkinnable().arrowSizeProperty(); + DoubleProperty arrowIndentProperty = getSkinnable() + .arrowIndentProperty(); + + centerYProperty.bind(Bindings.divide(stackPane.heightProperty(), 2)); + centerXProperty.bind(Bindings.divide(stackPane.widthProperty(), 2)); + + leftEdgePlusRadiusProperty.bind(Bindings.add(leftEdgeProperty, + getSkinnable().cornerRadiusProperty())); + + topEdgePlusRadiusProperty.bind(Bindings.add(topEdgeProperty, + getSkinnable().cornerRadiusProperty())); + + rightEdgeProperty.bind(stackPane.widthProperty()); + rightEdgeMinusRadiusProperty.bind(Bindings.subtract(rightEdgeProperty, + getSkinnable().cornerRadiusProperty())); + + bottomEdgeProperty.bind(stackPane.heightProperty()); + bottomEdgeMinusRadiusProperty.bind(Bindings.subtract( + bottomEdgeProperty, getSkinnable().cornerRadiusProperty())); + + // == INIT == + moveTo = new MoveTo(); + moveTo.xProperty().bind(leftEdgePlusRadiusProperty); + moveTo.yProperty().bind(topEdgeProperty); + + // == TOP EDGE == + lineBTop = new HLineTo(); + lineBTop.xProperty().bind( + Bindings.add(leftEdgePlusRadiusProperty, arrowIndentProperty)); + + lineCTop = new LineTo(); + lineCTop.xProperty().bind( + Bindings.add(lineBTop.xProperty(), arrowSizeProperty)); + lineCTop.yProperty().bind( + Bindings.subtract(topEdgeProperty, arrowSizeProperty)); + + lineDTop = new LineTo(); + lineDTop.xProperty().bind( + Bindings.add(lineCTop.xProperty(), arrowSizeProperty)); + lineDTop.yProperty().bind(topEdgeProperty); + + lineETop = new HLineTo(); + lineETop.xProperty().bind( + Bindings.subtract(centerXProperty, arrowSizeProperty)); + + lineFTop = new LineTo(); + lineFTop.xProperty().bind(centerXProperty); + lineFTop.yProperty().bind( + Bindings.subtract(topEdgeProperty, arrowSizeProperty)); + + lineGTop = new LineTo(); + lineGTop.xProperty().bind( + Bindings.add(centerXProperty, arrowSizeProperty)); + lineGTop.yProperty().bind(topEdgeProperty); + + lineHTop = new HLineTo(); + lineHTop.xProperty().bind( + Bindings.subtract(Bindings.subtract( + rightEdgeMinusRadiusProperty, arrowIndentProperty), + Bindings.multiply(arrowSizeProperty, 2))); + + lineITop = new LineTo(); + lineITop.xProperty().bind( + Bindings.subtract(Bindings.subtract( + rightEdgeMinusRadiusProperty, arrowIndentProperty), + arrowSizeProperty)); + lineITop.yProperty().bind( + Bindings.subtract(topEdgeProperty, arrowSizeProperty)); + + lineJTop = new LineTo(); + lineJTop.xProperty().bind( + Bindings.subtract(rightEdgeMinusRadiusProperty, + arrowIndentProperty)); + lineJTop.yProperty().bind(topEdgeProperty); + + lineKTop = new HLineTo(); + lineKTop.xProperty().bind(rightEdgeMinusRadiusProperty); + + // == RIGHT EDGE == + rightCurveTo = new QuadCurveTo(); + rightCurveTo.xProperty().bind(rightEdgeProperty); + rightCurveTo.yProperty().bind( + Bindings.add(topEdgeProperty, cornerProperty)); + rightCurveTo.controlXProperty().bind(rightEdgeProperty); + rightCurveTo.controlYProperty().bind(topEdgeProperty); + + lineBRight = new VLineTo(); + lineBRight.yProperty().bind( + Bindings.add(topEdgePlusRadiusProperty, arrowIndentProperty)); + + lineCRight = new LineTo(); + lineCRight.xProperty().bind( + Bindings.add(rightEdgeProperty, arrowSizeProperty)); + lineCRight.yProperty().bind( + Bindings.add(lineBRight.yProperty(), arrowSizeProperty)); + + lineDRight = new LineTo(); + lineDRight.xProperty().bind(rightEdgeProperty); + lineDRight.yProperty().bind( + Bindings.add(lineCRight.yProperty(), arrowSizeProperty)); + + lineERight = new VLineTo(); + lineERight.yProperty().bind( + Bindings.subtract(centerYProperty, arrowSizeProperty)); + + lineFRight = new LineTo(); + lineFRight.xProperty().bind( + Bindings.add(rightEdgeProperty, arrowSizeProperty)); + lineFRight.yProperty().bind(centerYProperty); + + lineGRight = new LineTo(); + lineGRight.xProperty().bind(rightEdgeProperty); + lineGRight.yProperty().bind( + Bindings.add(centerYProperty, arrowSizeProperty)); + + lineHRight = new VLineTo(); + lineHRight.yProperty().bind( + Bindings.subtract(Bindings.subtract( + bottomEdgeMinusRadiusProperty, arrowIndentProperty), + Bindings.multiply(arrowSizeProperty, 2))); + + lineIRight = new LineTo(); + lineIRight.xProperty().bind( + Bindings.add(rightEdgeProperty, arrowSizeProperty)); + lineIRight.yProperty().bind( + Bindings.subtract(Bindings.subtract( + bottomEdgeMinusRadiusProperty, arrowIndentProperty), + arrowSizeProperty)); + + lineJRight = new LineTo(); + lineJRight.xProperty().bind(rightEdgeProperty); + lineJRight.yProperty().bind( + Bindings.subtract(bottomEdgeMinusRadiusProperty, + arrowIndentProperty)); + + lineKRight = new VLineTo(); + lineKRight.yProperty().bind(bottomEdgeMinusRadiusProperty); + + // == BOTTOM EDGE == + bottomCurveTo = new QuadCurveTo(); + bottomCurveTo.xProperty().bind(rightEdgeMinusRadiusProperty); + bottomCurveTo.yProperty().bind(bottomEdgeProperty); + bottomCurveTo.controlXProperty().bind(rightEdgeProperty); + bottomCurveTo.controlYProperty().bind(bottomEdgeProperty); + + lineBBottom = new HLineTo(); + lineBBottom.xProperty().bind( + Bindings.subtract(rightEdgeMinusRadiusProperty, + arrowIndentProperty)); + + lineCBottom = new LineTo(); + lineCBottom.xProperty().bind( + Bindings.subtract(lineBBottom.xProperty(), arrowSizeProperty)); + lineCBottom.yProperty().bind( + Bindings.add(bottomEdgeProperty, arrowSizeProperty)); + + lineDBottom = new LineTo(); + lineDBottom.xProperty().bind( + Bindings.subtract(lineCBottom.xProperty(), arrowSizeProperty)); + lineDBottom.yProperty().bind(bottomEdgeProperty); + + lineEBottom = new HLineTo(); + lineEBottom.xProperty().bind( + Bindings.add(centerXProperty, arrowSizeProperty)); + + lineFBottom = new LineTo(); + lineFBottom.xProperty().bind(centerXProperty); + lineFBottom.yProperty().bind( + Bindings.add(bottomEdgeProperty, arrowSizeProperty)); + + lineGBottom = new LineTo(); + lineGBottom.xProperty().bind( + Bindings.subtract(centerXProperty, arrowSizeProperty)); + lineGBottom.yProperty().bind(bottomEdgeProperty); + + lineHBottom = new HLineTo(); + lineHBottom.xProperty().bind( + Bindings.add(Bindings.add(leftEdgePlusRadiusProperty, + arrowIndentProperty), Bindings.multiply( + arrowSizeProperty, 2))); + + lineIBottom = new LineTo(); + lineIBottom.xProperty().bind( + Bindings.add(Bindings.add(leftEdgePlusRadiusProperty, + arrowIndentProperty), arrowSizeProperty)); + lineIBottom.yProperty().bind( + Bindings.add(bottomEdgeProperty, arrowSizeProperty)); + + lineJBottom = new LineTo(); + lineJBottom.xProperty().bind( + Bindings.add(leftEdgePlusRadiusProperty, arrowIndentProperty)); + lineJBottom.yProperty().bind(bottomEdgeProperty); + + lineKBottom = new HLineTo(); + lineKBottom.xProperty().bind(leftEdgePlusRadiusProperty); + + // == LEFT EDGE == + leftCurveTo = new QuadCurveTo(); + leftCurveTo.xProperty().bind(leftEdgeProperty); + leftCurveTo.yProperty().bind( + Bindings.subtract(bottomEdgeProperty, cornerProperty)); + leftCurveTo.controlXProperty().bind(leftEdgeProperty); + leftCurveTo.controlYProperty().bind(bottomEdgeProperty); + + lineBLeft = new VLineTo(); + lineBLeft.yProperty().bind( + Bindings.subtract(bottomEdgeMinusRadiusProperty, + arrowIndentProperty)); + + lineCLeft = new LineTo(); + lineCLeft.xProperty().bind( + Bindings.subtract(leftEdgeProperty, arrowSizeProperty)); + lineCLeft.yProperty().bind( + Bindings.subtract(lineBLeft.yProperty(), arrowSizeProperty)); + + lineDLeft = new LineTo(); + lineDLeft.xProperty().bind(leftEdgeProperty); + lineDLeft.yProperty().bind( + Bindings.subtract(lineCLeft.yProperty(), arrowSizeProperty)); + + lineELeft = new VLineTo(); + lineELeft.yProperty().bind( + Bindings.add(centerYProperty, arrowSizeProperty)); + + lineFLeft = new LineTo(); + lineFLeft.xProperty().bind( + Bindings.subtract(leftEdgeProperty, arrowSizeProperty)); + lineFLeft.yProperty().bind(centerYProperty); + + lineGLeft = new LineTo(); + lineGLeft.xProperty().bind(leftEdgeProperty); + lineGLeft.yProperty().bind( + Bindings.subtract(centerYProperty, arrowSizeProperty)); + + lineHLeft = new VLineTo(); + lineHLeft.yProperty().bind( + Bindings.add(Bindings.add(topEdgePlusRadiusProperty, + arrowIndentProperty), Bindings.multiply( + arrowSizeProperty, 2))); + + lineILeft = new LineTo(); + lineILeft.xProperty().bind( + Bindings.subtract(leftEdgeProperty, arrowSizeProperty)); + lineILeft.yProperty().bind( + Bindings.add(Bindings.add(topEdgePlusRadiusProperty, + arrowIndentProperty), arrowSizeProperty)); + + lineJLeft = new LineTo(); + lineJLeft.xProperty().bind(leftEdgeProperty); + lineJLeft.yProperty().bind( + Bindings.add(topEdgePlusRadiusProperty, arrowIndentProperty)); + + lineKLeft = new VLineTo(); + lineKLeft.yProperty().bind(topEdgePlusRadiusProperty); + + topCurveTo = new QuadCurveTo(); + topCurveTo.xProperty().bind(leftEdgePlusRadiusProperty); + topCurveTo.yProperty().bind(topEdgeProperty); + topCurveTo.controlXProperty().bind(leftEdgeProperty); + topCurveTo.controlYProperty().bind(topEdgeProperty); + } + + private Window getPopupWindow() { + return getSkinnable().getScene().getWindow(); + } + + private boolean showArrow(ArrowLocation location) { + ArrowLocation arrowLocation = getSkinnable().getArrowLocation(); + return location.equals(arrowLocation) && !getSkinnable().isDetached() && !tornOff; + } + + private void updatePath() { + List elements = new ArrayList<>(); + elements.add(moveTo); + + if (showArrow(ArrowLocation.TOP_LEFT)) { + elements.add(lineBTop); + elements.add(lineCTop); + elements.add(lineDTop); + } + if (showArrow(ArrowLocation.TOP_CENTER)) { + elements.add(lineETop); + elements.add(lineFTop); + elements.add(lineGTop); + } + if (showArrow(ArrowLocation.TOP_RIGHT)) { + elements.add(lineHTop); + elements.add(lineITop); + elements.add(lineJTop); + } + elements.add(lineKTop); + elements.add(rightCurveTo); + + if (showArrow(ArrowLocation.RIGHT_TOP)) { + elements.add(lineBRight); + elements.add(lineCRight); + elements.add(lineDRight); + } + if (showArrow(ArrowLocation.RIGHT_CENTER)) { + elements.add(lineERight); + elements.add(lineFRight); + elements.add(lineGRight); + } + if (showArrow(ArrowLocation.RIGHT_BOTTOM)) { + elements.add(lineHRight); + elements.add(lineIRight); + elements.add(lineJRight); + } + elements.add(lineKRight); + elements.add(bottomCurveTo); + + if (showArrow(ArrowLocation.BOTTOM_RIGHT)) { + elements.add(lineBBottom); + elements.add(lineCBottom); + elements.add(lineDBottom); + } + if (showArrow(ArrowLocation.BOTTOM_CENTER)) { + elements.add(lineEBottom); + elements.add(lineFBottom); + elements.add(lineGBottom); + } + if (showArrow(ArrowLocation.BOTTOM_LEFT)) { + elements.add(lineHBottom); + elements.add(lineIBottom); + elements.add(lineJBottom); + } + elements.add(lineKBottom); + elements.add(leftCurveTo); + + if (showArrow(ArrowLocation.LEFT_BOTTOM)) { + elements.add(lineBLeft); + elements.add(lineCLeft); + elements.add(lineDLeft); + } + if (showArrow(ArrowLocation.LEFT_CENTER)) { + elements.add(lineELeft); + elements.add(lineFLeft); + elements.add(lineGLeft); + } + if (showArrow(ArrowLocation.LEFT_TOP)) { + elements.add(lineHLeft); + elements.add(lineILeft); + elements.add(lineJLeft); + } + elements.add(lineKLeft); + elements.add(topCurveTo); + + path.getElements().setAll(elements); + clip.getElements().setAll(elements); + } +} diff --git a/base/src/main/java/atlantafx/base/controls/Spacer.java b/base/src/main/java/atlantafx/base/controls/Spacer.java new file mode 100644 index 0000000..f826e73 --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/Spacer.java @@ -0,0 +1,45 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.base.controls; + +import javafx.geometry.Orientation; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.Region; +import javafx.scene.layout.VBox; + +public class Spacer extends Region { + + public Spacer() { + this(Orientation.HORIZONTAL); + } + + public Spacer(Orientation orientation) { + super(); + + switch (orientation) { + case HORIZONTAL -> HBox.setHgrow(this, Priority.ALWAYS); + case VERTICAL -> VBox.setVgrow(this, Priority.ALWAYS); + } + } + + public Spacer(double size) { + this(size, Orientation.HORIZONTAL); + } + + public Spacer(double size, Orientation orientation) { + super(); + + switch (orientation) { + case HORIZONTAL -> { + setMinWidth(size); + setPrefWidth(size); + setMaxWidth(size); + } + case VERTICAL -> { + setMinHeight(size); + setPrefHeight(size); + setMaxHeight(size); + } + } + } +} diff --git a/base/src/main/java/atlantafx/base/controls/ToggleSwitch.java b/base/src/main/java/atlantafx/base/controls/ToggleSwitch.java new file mode 100755 index 0000000..67a4d94 --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/ToggleSwitch.java @@ -0,0 +1,125 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright (c) 2015, ControlsFX + * All rights reserved. + *

+ * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of ControlsFX, any associated website, nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + *

+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL CONTROLSFX BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package atlantafx.base.controls; + +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.BooleanPropertyBase; +import javafx.css.PseudoClass; +import javafx.event.ActionEvent; +import javafx.scene.control.Labeled; +import javafx.scene.control.Skin; + +@SuppressWarnings("unused") +public class ToggleSwitch extends Labeled { + + protected static final String DEFAULT_STYLE_CLASS = "toggle-switch"; + protected static final PseudoClass PSEUDO_CLASS_SELECTED = PseudoClass.getPseudoClass("selected"); + + /** Creates a toggle switch with empty string for its label. */ + public ToggleSwitch() { + initialize(); + } + + /** + * Creates a toggle switch with the specified label + * + * @param text The label string of the control + */ + public ToggleSwitch(String text) { + super(text); + initialize(); + } + + private void initialize() { + getStyleClass().setAll(DEFAULT_STYLE_CLASS); + } + + /////////////////////////////////////////////////////////////////////////// + // Properties // + /////////////////////////////////////////////////////////////////////////// + + /** Indicates whether this switch is selected. */ + private BooleanProperty selected; + + /** Sets the selected value. */ + public final void setSelected(boolean value) { + selectedProperty().set(value); + } + + /** Returns whether this Toggle Switch is selected. */ + public final boolean isSelected() { + return selected != null && selected.get(); + } + + /** Returns the selected property. */ + public final BooleanProperty selectedProperty() { + if (selected == null) { + selected = new BooleanPropertyBase() { + @Override + protected void invalidated() { + final boolean v = get(); + pseudoClassStateChanged(PSEUDO_CLASS_SELECTED, v); + } + + @Override + public Object getBean() { + return ToggleSwitch.this; + } + + @Override + public String getName() { + return "selected"; + } + }; + } + + return selected; + } + + /////////////////////////////////////////////////////////////////////////// + // Methods // + /////////////////////////////////////////////////////////////////////////// + + /** + * Toggles the state of the {@code Switch}. The {@code Switch} will cycle + * through the selected and unselected states. + */ + public void fire() { + if (!isDisabled()) { + setSelected(!isSelected()); + fireEvent(new ActionEvent()); + } + } + + /** {@inheritDoc} */ + @Override + protected Skin createDefaultSkin() { + return new ToggleSwitchSkin(this); + } +} diff --git a/base/src/main/java/atlantafx/base/controls/ToggleSwitchSkin.java b/base/src/main/java/atlantafx/base/controls/ToggleSwitchSkin.java new file mode 100755 index 0000000..9c3b972 --- /dev/null +++ b/base/src/main/java/atlantafx/base/controls/ToggleSwitchSkin.java @@ -0,0 +1,249 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright (c) 2015, 2020, 2021, ControlsFX + * All rights reserved. + *

+ * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of ControlsFX, any associated website, nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + *

+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL CONTROLSFX BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package atlantafx.base.controls; + +import javafx.animation.Animation; +import javafx.animation.TranslateTransition; +import javafx.beans.property.DoubleProperty; +import javafx.beans.value.WritableValue; +import javafx.css.CssMetaData; +import javafx.css.Styleable; +import javafx.css.StyleableDoubleProperty; +import javafx.css.StyleableProperty; +import javafx.css.converter.SizeConverter; +import javafx.geometry.Pos; +import javafx.scene.control.Label; +import javafx.scene.control.SkinBase; +import javafx.scene.layout.StackPane; +import javafx.util.Duration; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class ToggleSwitchSkin extends SkinBase { + + protected final StackPane thumb; + protected final StackPane thumbArea; + protected final Label label; + protected final StackPane labelContainer; + protected final TranslateTransition transition; + + public ToggleSwitchSkin(ToggleSwitch control) { + super(control); + + thumb = new StackPane(); + thumbArea = new StackPane(); + label = new Label(); + labelContainer = new StackPane(); + labelContainer.getStyleClass().add("label-container"); + transition = new TranslateTransition(Duration.millis(getThumbMoveAnimationTime()), thumb); + transition.setFromX(0.0); + + label.textProperty().bind(control.textProperty()); + getChildren().addAll(labelContainer, thumbArea, thumb); + labelContainer.getChildren().addAll(label); + StackPane.setAlignment(label, Pos.CENTER_LEFT); + + thumb.getStyleClass().setAll("thumb"); + thumbArea.getStyleClass().setAll("thumb-area"); + + thumbArea.setOnMouseReleased(event -> mousePressedOnToggleSwitch(control)); + thumb.setOnMouseReleased(event -> mousePressedOnToggleSwitch(control)); + control.selectedProperty().addListener((observable, oldValue, newValue) -> { + if (newValue.booleanValue() != oldValue.booleanValue()) + selectedStateChanged(); + }); + } + + protected void selectedStateChanged() { + // stop the transition if it was already running, has no effect otherwise + transition.stop(); + if (getSkinnable().isSelected()) { + transition.setRate(1.0); + transition.jumpTo(Duration.ZERO); + } else { + // if we are not selected, we need to go from right to left + transition.setRate(-1.0); + transition.jumpTo(transition.getDuration()); + } + transition.play(); + } + + private void mousePressedOnToggleSwitch(ToggleSwitch toggleSwitch) { + toggleSwitch.setSelected(!toggleSwitch.isSelected()); + } + + /** + * How many milliseconds it should take for the thumb to go from + * one edge to the other + */ + private DoubleProperty thumbMoveAnimationTime = null; + + private DoubleProperty thumbMoveAnimationTimeProperty() { + if (thumbMoveAnimationTime == null) { + thumbMoveAnimationTime = new StyleableDoubleProperty(200) { + + @Override + public Object getBean() { + return ToggleSwitchSkin.this; + } + + @Override + public String getName() { + return "thumbMoveAnimationTime"; + } + + @Override + public CssMetaData getCssMetaData() { + return THUMB_MOVE_ANIMATION_TIME; + } + }; + } + return thumbMoveAnimationTime; + } + + protected double getThumbMoveAnimationTime() { + return thumbMoveAnimationTime == null ? 200 : thumbMoveAnimationTime.get(); + } + + @Override + protected void layoutChildren(double contentX, double contentY, double contentWidth, double contentHeight) { + ToggleSwitch toggleSwitch = getSkinnable(); + double thumbWidth = snapSizeX(thumb.prefWidth(-1)); + double thumbHeight = snapSizeX(thumb.prefHeight(-1)); + thumb.resize(thumbWidth, thumbHeight); + + double thumbAreaWidth = snapSizeX(thumbArea.prefWidth(-1)); + double thumbAreaHeight = snapSizeX(thumbArea.prefHeight(-1)); + double thumbAreaY = snapPositionX(contentY + (contentHeight / 2) - (thumbAreaHeight / 2)); + + thumbArea.resize(thumbAreaWidth, thumbAreaHeight); + thumbArea.setLayoutX(contentWidth - thumbAreaWidth); + thumbArea.setLayoutY(thumbAreaY); + + labelContainer.resize(contentWidth - thumbAreaWidth, thumbAreaHeight); + labelContainer.setLayoutY(thumbAreaY); + + // layout the thumb on the "unselected" position + thumb.setLayoutX(thumbArea.getLayoutX()); + thumb.setLayoutY(thumbAreaY + (thumbAreaHeight - thumbHeight) / 2); + + // each time the layout is done, recompute the thumb "selected" position and apply it to the transition target + final double thumbTarget = thumbAreaWidth - thumbWidth; + transition.setToX(thumbTarget); + + if (transition.getStatus() == Animation.Status.RUNNING) { + // if the transition is running, it must be restarted for the value to be properly updated + final Duration currentTime = transition.getCurrentTime(); + transition.stop(); + transition.playFrom(currentTime); + } else { + // if the transition is not running, simply apply the translateX value + thumb.setTranslateX(toggleSwitch.isSelected() ? thumbTarget : 0.0); + } + } + + @Override + protected double computeMinWidth(double height, double topInset, double rightInset, + double bottomInset, double leftInset) { + return leftInset + label.prefWidth(-1) + thumbArea.prefWidth(-1) + rightInset; + } + + @Override + protected double computeMinHeight(double width, double topInset, double rightInset, + double bottomInset, double leftInset) { + return topInset + Math.max(thumb.prefHeight(-1), label.prefHeight(-1)) + bottomInset; + } + + @Override + protected double computePrefWidth(double height, double topInset, double rightInset, + double bottomInset, double leftInset) { + return leftInset + label.prefWidth(-1) + 1 + thumbArea.prefWidth(-1) + rightInset; + } + + @Override + protected double computePrefHeight(double width, double topInset, double rightInset, + double bottomInset, double leftInset) { + return computeMinHeight(width, topInset, rightInset, bottomInset, leftInset); + } + + @Override + protected double computeMaxWidth(double height, double topInset, double rightInset, + double bottomInset, double leftInset) { + return getSkinnable().prefWidth(height); + } + + @Override + protected double computeMaxHeight(double width, double topInset, double rightInset, + double bottomInset, double leftInset) { + return getSkinnable().prefHeight(width); + } + + private static final CssMetaData THUMB_MOVE_ANIMATION_TIME = + new CssMetaData<>("-fx-thumb-move-animation-time", SizeConverter.getInstance(), 200) { + + @Override + public boolean isSettable(ToggleSwitch toggleSwitch) { + final ToggleSwitchSkin skin = (ToggleSwitchSkin) toggleSwitch.getSkin(); + return skin.thumbMoveAnimationTime == null || skin.thumbMoveAnimationTime.isBound(); + } + + @Override + @SuppressWarnings("RedundantCast") + public StyleableProperty getStyleableProperty(ToggleSwitch toggleSwitch) { + final ToggleSwitchSkin skin = (ToggleSwitchSkin) toggleSwitch.getSkin(); + return (StyleableProperty) (WritableValue) skin.thumbMoveAnimationTimeProperty(); + } + }; + + private static final List> STYLEABLES; + + static { + final List> styleables = new ArrayList<>(SkinBase.getClassCssMetaData()); + styleables.add(THUMB_MOVE_ANIMATION_TIME); + STYLEABLES = Collections.unmodifiableList(styleables); + } + + /** + * @return The CssMetaData associated with this class, which may include the + * CssMetaData of its super classes. + */ + public static List> getClassCssMetaData() { + return STYLEABLES; + } + + /** + * {@inheritDoc} + */ + @Override + public List> getCssMetaData() { + return getClassCssMetaData(); + } +} diff --git a/base/src/main/java/atlantafx/base/theme/AbstractTheme.java b/base/src/main/java/atlantafx/base/theme/AbstractTheme.java new file mode 100644 index 0000000..b47f1a6 --- /dev/null +++ b/base/src/main/java/atlantafx/base/theme/AbstractTheme.java @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.base.theme; + +import java.net.URI; +import java.util.LinkedHashSet; +import java.util.Objects; +import java.util.Set; + +public abstract class AbstractTheme implements Theme { + + private final Set stylesheets; + + public AbstractTheme() { + this(new LinkedHashSet<>()); + } + + public AbstractTheme(URI... stylesheets) { + this(Set.of(stylesheets)); + } + + public AbstractTheme(Set stylesheets) { + this.stylesheets = Objects.requireNonNull(stylesheets); + } + + @Override + public Set getStylesheets() { + return stylesheets; + } + + @Override + public String toString() { + return getClass().getSimpleName() + + "{" + + "name=" + getName() + + ", userAgentStylesheet=" + getUserAgentStylesheet() + + ", stylesheets=" + stylesheets + + ", isDarkMode=" + isDarkMode() + + '}'; + } +} diff --git a/base/src/main/java/atlantafx/base/theme/PrimerDark.java b/base/src/main/java/atlantafx/base/theme/PrimerDark.java new file mode 100755 index 0000000..139b378 --- /dev/null +++ b/base/src/main/java/atlantafx/base/theme/PrimerDark.java @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.base.theme; + +import java.net.URI; +import java.util.Set; + +public class PrimerDark extends AbstractTheme { + + public PrimerDark() {} + + public PrimerDark(URI... stylesheets) { + super(stylesheets); + } + + public PrimerDark(Set stylesheets) { + super(stylesheets); + } + + @Override + public String getName() { + return "Primer Dark"; + } + + @Override + public String getUserAgentStylesheet() { + return "/atlantafx/base/theme/primer-dark.css"; + } + + @Override + public boolean isDarkMode() { + return true; + } +} diff --git a/base/src/main/java/atlantafx/base/theme/PrimerLight.java b/base/src/main/java/atlantafx/base/theme/PrimerLight.java new file mode 100755 index 0000000..6922332 --- /dev/null +++ b/base/src/main/java/atlantafx/base/theme/PrimerLight.java @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.base.theme; + +import java.net.URI; +import java.util.Set; + +public class PrimerLight extends AbstractTheme { + + public PrimerLight() {} + + public PrimerLight(URI... stylesheets) { + super(stylesheets); + } + + public PrimerLight(Set stylesheets) { + super(stylesheets); + } + + @Override + public String getName() { + return "Primer Light"; + } + + @Override + public String getUserAgentStylesheet() { + return "/atlantafx/base/theme/primer-light.css"; + } + + @Override + public boolean isDarkMode() { + return false; + } +} diff --git a/base/src/main/java/atlantafx/base/theme/Styles.java b/base/src/main/java/atlantafx/base/theme/Styles.java new file mode 100644 index 0000000..dec8a8c --- /dev/null +++ b/base/src/main/java/atlantafx/base/theme/Styles.java @@ -0,0 +1,113 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.base.theme; + +import javafx.css.PseudoClass; +import javafx.scene.Node; + +import java.util.Objects; + +@SuppressWarnings("unused") +public final class Styles { + + // @formatter:off + + // Colors + + public static final String ACCENT = "accent"; + public static final String SUCCESS = "success"; + public static final String WARNING = "warning"; + public static final String DANGER = "danger"; + + public static final PseudoClass STATE_ACCENT = PseudoClass.getPseudoClass(ACCENT); + public static final PseudoClass STATE_SUCCESS = PseudoClass.getPseudoClass(SUCCESS); + public static final PseudoClass STATE_WARNING = PseudoClass.getPseudoClass(WARNING); + public static final PseudoClass STATE_DANGER = PseudoClass.getPseudoClass(DANGER); + + // Controls + + public static final String TEXT = "text"; + public static final String FONT_ICON = "font-icon"; + + public static final String BUTTON_CIRCLE = "button-circle"; + public static final String BUTTON_ICON = "button-icon"; + public static final String BUTTON_OUTLINED = "button-outlined"; + + public static final String LEFT_PILL = "left-pill"; + public static final String CENTER_PILL = "center-pill"; + public static final String RIGHT_PILL = "right-pill"; + + public static final String SMALL = "small"; + public static final String MEDIUM = "medium"; + public static final String LARGE = "large"; + + public static final String TOP = "top"; + public static final String RIGHT = "right"; + public static final String BOTTOM = "bottom"; + public static final String LEFT = "left"; + public static final String CENTER = "center"; + + public static final String FLAT = "flat"; + public static final String BORDERED = "bordered"; + public static final String DENSE = "dense"; + public static final String ELEVATED_1 = "elevated-1"; + public static final String ELEVATED_2 = "elevated-2"; + public static final String ELEVATED_3 = "elevated-3"; + public static final String ELEVATED_4 = "elevated-4"; + public static final String INTERACTIVE = "interactive"; + public static final String STRIPED = "striped"; + + // Text + + public static final String TITLE_1 = "title-1"; + public static final String TITLE_2 = "title-2"; + public static final String TITLE_3 = "title-3"; + public static final String TITLE_4 = "title-4"; + public static final String TEXT_CAPTION = "text-caption"; + public static final String TEXT_SMALL = "text-small"; + + public static final String TEXT_BOLD = "text-bold"; + public static final String TEXT_BOLDER = "text-bolder"; + public static final String TEXT_NORMAL = "text-normal"; + public static final String TEXT_LIGHTER = "text-lighter"; + + public static final String TEXT_ITALIC = "text-italic"; + public static final String TEXT_OBLIQUE = "text-oblique"; + public static final String TEXT_STRIKETHROUGH = "text-strikethrough"; + public static final String TEXT_UNDERLINED = "text-underlined"; + + // @formatter:on + + public static void toggleStyleClass(Node node, String styleClass) { + Objects.requireNonNull(node); + Objects.requireNonNull(styleClass); + + int idx = node.getStyleClass().indexOf(styleClass); + if (idx > 0) { + node.getStyleClass().remove(idx); + } else { + node.getStyleClass().add(styleClass); + } + } + + public static void addStyleClass(Node node, String styleClass, String... excludes) { + Objects.requireNonNull(node); + Objects.requireNonNull(styleClass); + + if (excludes != null && excludes.length > 0) { + node.getStyleClass().removeAll(excludes); + } + node.getStyleClass().add(styleClass); + } + + public static void activatePseudoClass(Node node, PseudoClass pseudoClass, PseudoClass... excludes) { + Objects.requireNonNull(node); + Objects.requireNonNull(pseudoClass); + + if (excludes != null && excludes.length > 0) { + for (PseudoClass exclude : excludes) { + node.pseudoClassStateChanged(exclude, false); + } + } + node.pseudoClassStateChanged(pseudoClass, true); + } +} diff --git a/base/src/main/java/atlantafx/base/theme/Theme.java b/base/src/main/java/atlantafx/base/theme/Theme.java new file mode 100755 index 0000000..86fefd2 --- /dev/null +++ b/base/src/main/java/atlantafx/base/theme/Theme.java @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.base.theme; + +import java.net.URI; +import java.util.Set; + +import static javafx.application.Application.STYLESHEET_CASPIAN; +import static javafx.application.Application.STYLESHEET_MODENA; + +// This is merely a wrapper around stylesheet paths. +// Let's hope JavaFX theme support will be merged. +// https://github.com/openjdk/jfx/pull/511 +public interface Theme { + + String getName(); + + String getUserAgentStylesheet(); + + Set getStylesheets(); + + boolean isDarkMode(); + + default boolean isDefault() { + return STYLESHEET_MODENA.equals(getUserAgentStylesheet()) || STYLESHEET_CASPIAN.equals(getUserAgentStylesheet()); + } +} diff --git a/base/src/main/java/atlantafx/base/util/DoubleStringConverter.java b/base/src/main/java/atlantafx/base/util/DoubleStringConverter.java new file mode 100644 index 0000000..a77a357 --- /dev/null +++ b/base/src/main/java/atlantafx/base/util/DoubleStringConverter.java @@ -0,0 +1,181 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.base.util; + +import javafx.application.Platform; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.control.Spinner; +import javafx.scene.control.SpinnerValueFactory; +import javafx.scene.control.TextField; +import javafx.scene.control.Tooltip; +import javafx.util.StringConverter; + +import java.text.DecimalFormat; + +/** + * Converts between user-edited strings and {@link Double} values. + * Accepts an optional {@link Runnable} that resets the editor on {@link NumberFormatException}, + * or a {@link TextField} or {@link Spinner} that is preemptively monitored for invalid + * input during typing, and restricts valid input to a specified range when committed. + *

+ * This implementation shows up to two decimal digits, but only if a fractional part exists. + * The default implementation always shows one decimal digit which hinders typing.

+ * + * @author Christoph Nahr + * @version 1.0.2 + */ +public class DoubleStringConverter extends StringConverter { + + private final DecimalFormat _format = new DecimalFormat("0.##"); + private Runnable _reset; + + /** + * Creates a {@link DoubleStringConverter}. + * Swallows {@link NumberFormatException} but does nothing + * in response until {@link #setReset} is defined. + */ + public DoubleStringConverter() { } + + /** + * Creates a {@link DoubleStringConverter} with an editor reset callback. + * Specifying {@code null} has the same effect as the default constructor. + * + * @param reset the {@link Runnable} to call upon {@link NumberFormatException} + */ + public DoubleStringConverter(Runnable reset) { + _reset = reset; + } + + /** + * Creates a {@link DoubleStringConverter} with the specified input range. + * Preemptively monitors {@code input} to reject any invalid characters during + * typing, restricts {@code input} to [{@code min}, {@code max}] (inclusive) when + * valid text is committed, and resets {@code input} to the closest value to zero + * within [{@code min}, {@code max}] when invalid text is committed. + * + * @param input the {@link TextField} providing user-edited strings + * @param min the smallest valid {@link Double} value + * @param max the greatest valid {@link Double} value + * @throws NullPointerException if {@code input} is {@code null} + */ + public DoubleStringConverter(TextField input, double min, double max) { + if (input == null) { throw new NullPointerException("input"); } + + final double resetValue = Math.min(Math.max(0, min), max); + _reset = () -> input.setText(_format.format(resetValue)); + + // bound JavaFX properties cannot be explicitly set + // if (!input.tooltipProperty().isBound()) { + // input.setTooltip(new Tooltip(String.format("Enter a value between %.2f and %.2f", min, max))); + // } + + // restrict direct input to valid numerical characters + input.textProperty().addListener((ov, oldValue, newValue) -> { + if (newValue == null || newValue.isEmpty()) { return; } + + // special case: minus sign if negative values allowed + if (min < 0 && newValue.endsWith("-")) { + if (newValue.length() > 1) { Platform.runLater(() -> input.setText("-")); } + return; + } + + // revert to oldValue if newValue cannot be parsed + try { + Double.parseDouble(newValue); + } catch (NumberFormatException e) { + Platform.runLater(() -> input.setText(oldValue)); + } + }); + + // validate committed input and restrict to legal range + final EventHandler oldHandler = input.getOnAction(); + input.setOnAction(t -> { + // fromString performs input validation + final double value = fromString(input.getText()); + + // redundant for Spinner but not harmful + final double restricted = Math.min(Math.max(value, min), max); + if (value != restricted) { input.setText(_format.format(restricted)); } + + // required for Spinner which handles onAction + if (oldHandler != null) { oldHandler.handle(t); } + }); + } + + /** + * Creates a {@link DoubleStringConverter} for the specified {@link Spinner}. + * Uses the {@link TextField} and minimum and maximum values of the specified + * {@link Spinner} for construction, and also sets the new {@link DoubleStringConverter} + * on its {@link SpinnerValueFactory.DoubleSpinnerValueFactory}. + * + * @param spinner the {@link Spinner} to create a {@link DoubleStringConverter} for + * @return the new {@link DoubleStringConverter} + * @throws NullPointerException if {@code spinner} is {@code null} + */ + public static DoubleStringConverter createFor(Spinner spinner) { + final SpinnerValueFactory.DoubleSpinnerValueFactory factory = + (SpinnerValueFactory.DoubleSpinnerValueFactory) spinner.getValueFactory(); + + final DoubleStringConverter converter = new DoubleStringConverter( + spinner.getEditor(), factory.getMin(), factory.getMax()); + + factory.setConverter(converter); + spinner.setTooltip(new Tooltip(String.format( + "Enter a value between %.2f and %.2f", + factory.getMin(), factory.getMax()))); + + return converter; + } + + /** + * Sets the editor reset callback. + * Specify {@code null} to clear a previously set {@link Runnable}. When creating + * a {@link DoubleStringConverter} for a {@link TextField} or {@link Spinner}, + * this callback is automatically defined to reset committed invalid input to the + * closest value to zero within the legal range. Setting a different callback + * will overwrite this functionality. + * + * @param reset the {@link Runnable} to call upon {@link NumberFormatException} + * @see #fromString + */ + public void setReset(Runnable reset) { + _reset = reset; + } + + /** + * Converts the specified {@link String} into its {@link Double} value. + * A {@code null}, empty, or otherwise invalid argument returns zero + * and also executes the editor reset callback, if any. + * + * @param s the {@link String} to convert + * @return the {@link Double} value of {@code s} + * @see #setReset + */ + @Override + public Double fromString(String s) { + if (s == null || s.isEmpty()) { + if (_reset != null) { _reset.run(); } + return 0.0; + } + + try { + return Double.valueOf(s); + } catch (NumberFormatException e) { + if (_reset != null) { _reset.run(); } + return 0.0; + } + } + + /** + * Converts the specified {@link Double} into its {@link String} form. + * A {@code null} argument is converted into the literal string "0". + * + * @param value the {@link Double} to convert + * @return the {@link String} form of {@code value} + */ + @Override + public String toString(Double value) { + if (value == null) { return "0"; } + return _format.format(value); + } +} diff --git a/base/src/main/java/atlantafx/base/util/IntegerStringConverter.java b/base/src/main/java/atlantafx/base/util/IntegerStringConverter.java new file mode 100644 index 0000000..2bc5521 --- /dev/null +++ b/base/src/main/java/atlantafx/base/util/IntegerStringConverter.java @@ -0,0 +1,175 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.base.util; + +import javafx.application.Platform; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.control.Spinner; +import javafx.scene.control.SpinnerValueFactory; +import javafx.scene.control.TextField; +import javafx.scene.control.Tooltip; +import javafx.util.StringConverter; + +/** + * Converts between user-edited strings and {@link Integer} values. + * Accepts an optional {@link Runnable} that resets the editor on {@link NumberFormatException}, + * or a {@link TextField} or {@link Spinner} that is preemptively monitored for invalid + * input during typing, and restricts valid input to a specified range when committed. + * + * @author Christoph Nahr + * @version 1.0.2 + */ +public class IntegerStringConverter extends StringConverter { + + private Runnable _reset; + + /** + * Creates an {@link IntegerStringConverter}. + * Swallows {@link NumberFormatException} but does nothing + * in response until {@link #setReset} is defined. + */ + public IntegerStringConverter() { } + + /** + * Creates an {@link IntegerStringConverter} with an editor reset callback. + * Specifying {@code null} has the same effect as the default constructor. + * + * @param reset the {@link Runnable} to call upon {@link NumberFormatException} + */ + public IntegerStringConverter(Runnable reset) { + _reset = reset; + } + + /** + * Creates an {@link IntegerStringConverter} with the specified input range. + * Preemptively monitors {@code input} to reject any invalid characters during + * typing, restricts {@code input} to [{@code min}, {@code max}] (inclusive) when + * valid text is committed, and resets {@code input} to the closest value to zero + * within [{@code min}, {@code max}] when invalid text is committed. + * + * @param input the {@link TextField} providing user-edited strings + * @param min the smallest valid {@link Integer} value + * @param max the greatest valid {@link Integer} value + * @throws NullPointerException if {@code input} is {@code null} + */ + public IntegerStringConverter(TextField input, int min, int max) { + if (input == null) { throw new NullPointerException("input"); } + + final int resetValue = Math.min(Math.max(0, min), max); + _reset = () -> input.setText(Integer.toString(resetValue)); + + // bound JavaFX properties cannot be explicitly set + // if (!input.tooltipProperty().isBound()) { + // input.setTooltip(new Tooltip(String.format("Enter a value between %d and %d", min, max))); + // } + + // restrict direct input to valid numerical characters + input.textProperty().addListener((ov, oldValue, newValue) -> { + if (newValue == null || newValue.isEmpty()) { return; } + + // special case: minus sign if negative values allowed + if (min < 0 && newValue.endsWith("-")) { + if (newValue.length() > 1) { Platform.runLater(() -> input.setText("-")); } + return; + } + + // revert to oldValue if newValue cannot be parsed + try { + Integer.parseInt(newValue); + } catch (NumberFormatException e) { + Platform.runLater(() -> input.setText(oldValue)); + } + }); + + // validate committed input and restrict to legal range + final EventHandler oldHandler = input.getOnAction(); + input.setOnAction(t -> { + // fromString performs input validation + final int value = fromString(input.getText()); + + // redundant for Spinner but not harmful + final int restricted = Math.min(Math.max(value, min), max); + if (value != restricted) { input.setText(Integer.toString(restricted)); } + + // required for Spinner which handles onAction + if (oldHandler != null) { oldHandler.handle(t); } + }); + } + + /** + * Creates an {@link IntegerStringConverter} for the specified {@link Spinner}. + * Uses the {@link TextField} and minimum and maximum values of the specified + * {@link Spinner} for construction, and also sets the new {@link IntegerStringConverter} + * on its {@link SpinnerValueFactory.IntegerSpinnerValueFactory}. + * + * @param spinner the {@link Spinner} to create an {@link IntegerStringConverter} for + * @return the new {@link IntegerStringConverter} + * @throws NullPointerException if {@code spinner} is {@code null} + */ + public static IntegerStringConverter createFor(Spinner spinner) { + final SpinnerValueFactory.IntegerSpinnerValueFactory factory = + (SpinnerValueFactory.IntegerSpinnerValueFactory) spinner.getValueFactory(); + + final IntegerStringConverter converter = new IntegerStringConverter( + spinner.getEditor(), factory.getMin(), factory.getMax()); + + factory.setConverter(converter); + spinner.setTooltip(new Tooltip(String.format( + "Enter a value between %d and %d", + factory.getMin(), factory.getMax()))); + + return converter; + } + + /** + * Sets the editor reset callback. + * Specify {@code null} to clear a previously set {@link Runnable}. When creating + * an {@link IntegerStringConverter} for a {@link TextField} or {@link Spinner}, + * this callback is automatically defined to reset committed invalid input to the + * closest value to zero within the legal range. Setting a different callback + * will overwrite this functionality. + * + * @param reset the {@link Runnable} to call upon {@link NumberFormatException} + * @see #fromString + */ + public void setReset(Runnable reset) { + _reset = reset; + } + + /** + * Converts the specified {@link String} into its {@link Integer} value. + * A {@code null}, empty, or otherwise invalid argument returns zero + * and also executes the editor reset callback, if any. + * + * @param s the {@link String} to convert + * @return the {@link Integer} value of {@code s} + * @see #setReset + */ + @Override + public Integer fromString(String s) { + if (s == null || s.isEmpty()) { + if (_reset != null) { _reset.run(); } + return 0; + } + + try { + return Integer.valueOf(s); + } catch (NumberFormatException e) { + if (_reset != null) { _reset.run(); } + return 0; + } + } + + /** + * Converts the specified {@link Integer} into its {@link String} form. + * A {@code null} argument is converted into the literal string "0". + * + * @param value the {@link Integer} to convert + * @return the {@link String} form of {@code value} + */ + @Override + public String toString(Integer value) { + if (value == null) { return "0"; } + return Integer.toString(value); + } +} diff --git a/base/src/main/java/atlantafx/base/util/PlatformUtils.java b/base/src/main/java/atlantafx/base/util/PlatformUtils.java new file mode 100755 index 0000000..ed3691e --- /dev/null +++ b/base/src/main/java/atlantafx/base/util/PlatformUtils.java @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.base.util; + +public final class PlatformUtils { + + private static final String OS = System.getProperty("os.name"); + private static final boolean MAC = OS.startsWith("Mac"); + + public static boolean isMac() { + return MAC; + } +} diff --git a/base/src/main/java/module-info.java b/base/src/main/java/module-info.java new file mode 100755 index 0000000..c586c47 --- /dev/null +++ b/base/src/main/java/module-info.java @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: MIT */ + +module atlantafx.base { + + requires transitive javafx.controls; + + exports atlantafx.base.controls; + exports atlantafx.base.theme; + exports atlantafx.base.util; + + opens atlantafx.base.theme; +} diff --git a/mvnw b/mvnw new file mode 100755 index 0000000..5643201 --- /dev/null +++ b/mvnw @@ -0,0 +1,316 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..8a15b7f --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,188 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% diff --git a/package-lock.json b/package-lock.json new file mode 100755 index 0000000..bbdca2f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2514 @@ +{ + "name": "atlanta", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "atlanta", + "version": "1.0.0", + "devDependencies": { + "grunt": "^1.4.1", + "grunt-cli": "^1.4.1", + "grunt-contrib-concat": "^2.0.0", + "grunt-contrib-cssmin": "^4.0.0", + "grunt-sass": "^3.1.0", + "sass": "^1.49.9" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clean-css": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", + "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "dependencies": { + "glob": "~5.0.0" + }, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/findup-sync/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/grunt": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.4.1.tgz", + "integrity": "sha512-ZXIYXTsAVrA7sM+jZxjQdrBOAg7DyMUplOMhTaspMRExei+fD0BTwdWXnn0W5SXqhb/Q/nlkzXclSi3IH55PIA==", + "dev": true, + "dependencies": { + "dateformat": "~3.0.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~0.3.0", + "glob": "~7.1.6", + "grunt-cli": "~1.4.2", + "grunt-known-options": "~2.0.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.1", + "iconv-lite": "~0.4.13", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "mkdirp": "~1.0.4", + "nopt": "~3.0.6", + "rimraf": "~3.0.2" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dev": true, + "dependencies": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-cli/node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/grunt-contrib-concat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-2.0.0.tgz", + "integrity": "sha512-/cfWwsGiprVTOl7c2bZwMdQ8hIf3e1f4szm1i7qhY9hOnR/X2KL+Xe7dynNweTYHa6aWPZx2B5GPsUpxAXNCaA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "source-map": "^0.5.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "grunt": ">=1.4.1" + } + }, + "node_modules/grunt-contrib-cssmin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-4.0.0.tgz", + "integrity": "sha512-jXU+Zlk8Q8XztOGNGpjYlD/BDQ0n95IHKrQKtFR7Gd8hZrzgqiG1Ra7cGYc8h2DD9vkSFGNlweb9Q00rBxOK2w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "clean-css": "^5.0.1", + "maxmin": "^3.0.0" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "dev": true, + "dependencies": { + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "dev": true, + "dependencies": { + "chalk": "~4.1.0", + "lodash": "~4.17.19" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "dev": true, + "dependencies": { + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-sass": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/grunt-sass/-/grunt-sass-3.1.0.tgz", + "integrity": "sha512-90s27H7FoCDcA8C8+R0GwC+ntYD3lG6S/jqcavWm3bn9RiJTmSfOvfbFa1PXx4NbBWuiGQMLfQTj/JvvqT5w6A==", + "dev": true, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "grunt": ">=1" + } + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dev": true, + "dependencies": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/liftup/node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/maxmin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-3.0.0.tgz", + "integrity": "sha512-wcahMInmGtg/7c6a75fr21Ch/Ks1Tb+Jtoan5Ft4bAI0ZvJqyOw8kkM7e7p8hDSzY805vmxwHT50KcjGwKyJ0g==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "figures": "^3.2.0", + "gzip-size": "^5.1.1", + "pretty-bytes": "^5.3.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.49.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", + "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "dev": true, + "dependencies": { + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/underscore.string/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "clean-css": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", + "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "requires": { + "glob": "~5.0.0" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "dev": true + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "grunt": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.4.1.tgz", + "integrity": "sha512-ZXIYXTsAVrA7sM+jZxjQdrBOAg7DyMUplOMhTaspMRExei+fD0BTwdWXnn0W5SXqhb/Q/nlkzXclSi3IH55PIA==", + "dev": true, + "requires": { + "dateformat": "~3.0.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~0.3.0", + "glob": "~7.1.6", + "grunt-cli": "~1.4.2", + "grunt-known-options": "~2.0.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.1", + "iconv-lite": "~0.4.13", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "mkdirp": "~1.0.4", + "nopt": "~3.0.6", + "rimraf": "~3.0.2" + } + }, + "grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dev": true, + "requires": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + } + } + }, + "grunt-contrib-concat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-2.0.0.tgz", + "integrity": "sha512-/cfWwsGiprVTOl7c2bZwMdQ8hIf3e1f4szm1i7qhY9hOnR/X2KL+Xe7dynNweTYHa6aWPZx2B5GPsUpxAXNCaA==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "source-map": "^0.5.3" + } + }, + "grunt-contrib-cssmin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-4.0.0.tgz", + "integrity": "sha512-jXU+Zlk8Q8XztOGNGpjYlD/BDQ0n95IHKrQKtFR7Gd8hZrzgqiG1Ra7cGYc8h2DD9vkSFGNlweb9Q00rBxOK2w==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "clean-css": "^5.0.1", + "maxmin": "^3.0.0" + } + }, + "grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "dev": true + }, + "grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "dev": true, + "requires": { + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" + } + }, + "grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "dev": true, + "requires": { + "chalk": "~4.1.0", + "lodash": "~4.17.19" + } + }, + "grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "dev": true, + "requires": { + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" + } + }, + "grunt-sass": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/grunt-sass/-/grunt-sass-3.1.0.tgz", + "integrity": "sha512-90s27H7FoCDcA8C8+R0GwC+ntYD3lG6S/jqcavWm3bn9RiJTmSfOvfbFa1PXx4NbBWuiGQMLfQTj/JvvqT5w6A==", + "dev": true, + "requires": {} + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dev": true, + "requires": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "dependencies": { + "findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + } + } + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "maxmin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-3.0.0.tgz", + "integrity": "sha512-wcahMInmGtg/7c6a75fr21Ch/Ks1Tb+Jtoan5Ft4bAI0ZvJqyOw8kkM7e7p8hDSzY805vmxwHT50KcjGwKyJ0g==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "figures": "^3.2.0", + "gzip-size": "^5.1.1", + "pretty-bytes": "^5.3.0" + } + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass": { + "version": "1.49.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", + "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "dev": true, + "requires": { + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100755 index 0000000..7943691 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "atlanta", + "version": "1.0.0", + "devDependencies": { + "grunt": "^1.4.1", + "grunt-cli": "^1.4.1", + "grunt-contrib-concat": "^2.0.0", + "grunt-contrib-cssmin": "^4.0.0", + "grunt-sass": "^3.1.0", + "sass": "^1.49.9" + } +} diff --git a/pom.xml b/pom.xml new file mode 100755 index 0000000..e0ef91d --- /dev/null +++ b/pom.xml @@ -0,0 +1,359 @@ + + + 4.0.0 + + io.github.mkpaz + atlantafx-parent + pom + 0.1.0 + + AtlantaFX + JavaFX CSS theme collection plus additional controls + https://github.com/mkpaz/atlantafx + + + + MIT License + https://raw.githubusercontent.com/mkpaz/atlantafx/master/LICENSE + repo + + + + + + mkpaz + mkpaz + + + + + scm:git:https://github.com/mkpaz/atlantafx.git + ${project.scm.developerConnection} + ${project.url} + + + + + ossrh + https://s01.oss.sonatype.org/content/repositories/snapshots + + + ossrh + https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + + base + sampler + styles + + + + UTF-8 + UTF-8 + + ${java.version} + ${java.version} + + 17 + 17.0.0.1 + v16.14.2 + + AtlantaFX + ${project.version} + + 3.12.0 + 11.5.1 + 12.2.0 + 1.3.0 + 22.0.0 + 3.21.0 + 5.8.1 + + + + + + ${project.groupId} + atlantafx-styles + ${project.version} + + + ${project.groupId} + atlantafx-base + ${project.version} + + + + org.openjfx + javafx-controls + ${openjfx.version} + + + org.openjfx + javafx-swing + ${openjfx.version} + + + org.openjfx + javafx-web + ${openjfx.version} + + + org.kordamp.ikonli + ikonli-javafx + ${lib.ikonli.version} + + + org.kordamp.ikonli + ikonli-feather-pack + ${lib.ikonli.version} + + + + fr.brouillard.oss + cssfx + ${lib.cssfx.version} + + + net.datafaker + datafaker + ${lib.datafaker.version} + + + + org.assertj + assertj-core + ${test.assertj.version} + test + + + org.junit.jupiter + junit-jupiter-api + ${test.junit.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${test.junit.version} + test + + + + + + + + + org.apache.maven.plugins + maven-antrun-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + + org.apache.maven.plugins + maven-clean-plugin + 3.1.0 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.2.0 + + + org.apache.maven.plugins + maven-deploy-plugin + 3.0.0 + + + com.github.eirslett + frontend-maven-plugin + 1.9.1 + + + org.apache.maven.plugins + maven-gpg-plugin + 3.0.1 + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.4.0 + + + org.apache.maven.plugins + maven-install-plugin + 3.0.0-M1 + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.0 + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 3.1.2 + + + org.apache.maven.plugins + maven-resources-plugin + 3.2.0 + + + org.apache.maven.plugins + maven-site-plugin + 3.9.1 + + + org.apache.maven.plugins + maven-source-plugin + 3.2.1 + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M5 + + + + io.github.wiverson + jtoolprovider-plugin + 1.0.34 + + + org.moditect + moditect-maven-plugin + 1.0.0.RC1 + + + org.openjfx + javafx-maven-plugin + 0.0.6 + + + + + + com.github.eirslett + frontend-maven-plugin + + ${nodejs.version} + ${project.basedir} + + + + install-node-and-npm + + install-node-and-npm + + + + install-npm-packages + generate-resources + + npm + + + install + + + + + + + + + + linux-active + + + unix + + + + linux + + + + windows-active + + + windows + + + + win + + + + sonatype + + false + + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-source + compile + + jar-no-fork + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + + + org.apache.maven.plugins + maven-gpg-plugin + + + sign-artifacts + verify + + sign + + + + + + + + + + diff --git a/sampler/icons/app-icon.ico b/sampler/icons/app-icon.ico new file mode 100755 index 0000000000000000000000000000000000000000..a56b1b986c7d5f6830c080d74595814ac9df064d GIT binary patch literal 38078 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 + + 4.0.0 + + io.github.mkpaz + atlantafx-parent + 0.1.0 + + atlantafx-sampler + + + atlantafx.sampler.Launcher + atlantafx.sampler + + ${app.name}-${app.version}-${platform}-${os.arch} + + ${project.build.directory}${file.separator}dependencies + + ${project.build.directory}${file.separator}platform-modules + + ${project.build.directory}${file.separator}app-image + + ${project.build.directory}${file.separator}app-dir + + ${project.build.directory}${file.separator}runtime-image + + ${project.build.directory}${file.separator}package-scripts + + ${project.build.directory}${file.separator}package-temp + + ${project.build.directory}${file.separator}release + + + + + ${project.groupId} + atlantafx-base + + + org.openjfx + javafx-controls + + + org.openjfx + javafx-swing + + + org.openjfx + javafx-web + + + org.kordamp.ikonli + ikonli-javafx + + + org.kordamp.ikonli + ikonli-feather-pack + + + fr.brouillard.oss + cssfx + + + net.datafaker + datafaker + + + org.junit.jupiter + junit-jupiter-api + + + org.junit.jupiter + junit-jupiter-engine + + + org.assertj + assertj-core + + + + + + + + src/main/resources + atlantafx/sampler + false + + + src/main/resources + atlantafx/sampler + true + + application.properties + + + + + src/main/java/atlantafx/sampler/page + atlantafx/sampler/page + false + + **/AbstractPage.java + **/CodeViewer.java + **/Page.java + **/SampleBlock.java + + + + + icons + atlantafx/sampler/assets + false + + + icons + false + ${project.build.directory} + + + + src/package-scripts + true + ${build.package.scriptsDir} + + + + + + org.openjfx + javafx-maven-plugin + + ${java.home}/bin/java + ${app.launcher} + + + + run + + + + + com.github.eirslett + frontend-maven-plugin + + ${project.parent.basedir} + + + + org.apache.maven.plugins + maven-dependency-plugin + + + + copy-dependencies + prepare-package + + copy-dependencies + + + ${build.dependenciesDir} + runtime + org.openjfx + + + + + copy-openjfx + prepare-package + + copy-dependencies + + + ${build.platformModulesDir} + org.openjfx + + + + + + org.apache.maven.plugins + maven-install-plugin + + + true + + + + org.apache.maven.plugins + maven-jar-plugin + + + ${build.dependenciesDir} + + + + io.github.wiverson + jtoolprovider-plugin + + + + create-runtime-image + package + + java-tool + + + jlink + java.base,java.logging,jdk.localedata,java.desktop,javafx.controls,javafx.swing,javafx.web + ${build.platformModulesDir} + ${build.package.runtimeImageDir} + + + --compress=2 + --include-locales=en + --no-header-files + --no-man-pages + --strip-debug + --verbose + + + + + + create-app-image + package + + java-tool + + + jpackage + ${build.package.tempDir} + + @${build.package.scriptsDir}${file.separator}args-base.txt + @${build.package.scriptsDir}${file.separator}args-app-image.txt + + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + assembly + install + + single + + + ${build.releaseDir} + ${build.artifactName} + false + false + posix + + src/package-scripts/app-image.xml + + + + + + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + + + + + linux-active + + + unix + + + + ${project.build.directory}/app-icon.png + tar.gz + + + + windows-active + + + windows + + + + ${project.build.directory}\app-icon.ico + zip + + + + + diff --git a/sampler/src/main/java/atlantafx/sampler/Launcher.java b/sampler/src/main/java/atlantafx/sampler/Launcher.java new file mode 100755 index 0000000..d6a7089 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/Launcher.java @@ -0,0 +1,107 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler; + +import atlantafx.sampler.layout.ApplicationWindow; +import atlantafx.sampler.theme.ThemeManager; +import fr.brouillard.oss.cssfx.CSSFX; +import fr.brouillard.oss.cssfx.api.URIToPathConverter; +import fr.brouillard.oss.cssfx.impl.log.CSSFXLogger; +import javafx.application.Application; +import javafx.application.Platform; +import javafx.scene.Scene; +import javafx.scene.image.Image; +import javafx.stage.Stage; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URI; +import java.nio.file.Paths; +import java.util.Properties; + +import static java.nio.charset.StandardCharsets.UTF_8; + +public class Launcher extends Application { + + public static final boolean IS_DEV_MODE = "DEV".equalsIgnoreCase( + Resources.getPropertyOrEnv("atlantafx.mode", "ATLANTAFX_MODE") + ); + + private static class DefaultExceptionHandler implements Thread.UncaughtExceptionHandler { + + @Override + public void uncaughtException(Thread t, Throwable e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + launch(args); + } + + @Override + public void start(Stage stage) { + Thread.currentThread().setUncaughtExceptionHandler(new DefaultExceptionHandler()); + + if (IS_DEV_MODE) { + System.out.println("[WARNING] Application is running in development mode."); + } + + loadApplicationProperties(); + var appIcon = new Image(Resources.getResourceAsStream("assets/app-icon.png")); + + var root = new ApplicationWindow(); + var scene = new Scene(root, 1200, 768); + + var tm = ThemeManager.getInstance(); + tm.setTheme(scene, tm.getAvailableThemes().get(0)); + if (IS_DEV_MODE) { startCssFX(scene); } + + scene.getStylesheets().addAll( + Resources.resolve("assets/fonts/index.css"), + Resources.resolve("assets/styles/index.css") + ); + + stage.setScene(scene); + stage.setTitle(System.getProperty("app.name")); + stage.getIcons().add(appIcon); + stage.setResizable(true); + stage.setOnCloseRequest(t -> Platform.exit()); + + Platform.runLater(() -> { + stage.show(); + stage.requestFocus(); + }); + } + + private void loadApplicationProperties() { + try { + var properties = new Properties(); + properties.load(new InputStreamReader(Resources.getResourceAsStream("application.properties"), UTF_8)); + properties.forEach((key, value) -> System.setProperty( + String.valueOf(key), + String.valueOf(value) + )); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void startCssFX(Scene scene) { + URIToPathConverter fileUrlConverter = uri -> { + try { + if (uri != null && uri.startsWith("file:")) { + return Paths.get(URI.create(uri)); + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + }; + + CSSFX.addConverter(fileUrlConverter).start(); + CSSFXLogger.setLoggerFactory(loggerName -> (level, message, args) -> + System.out.println("[CSSFX] " + String.format(message, args)) + ); + CSSFX.start(scene); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/Resources.java b/sampler/src/main/java/atlantafx/sampler/Resources.java new file mode 100755 index 0000000..29c5df4 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/Resources.java @@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler; + +import java.io.InputStream; +import java.net.URI; +import java.net.URL; +import java.util.Objects; + +public final class Resources { + + public static final String MODULE_DIR = "/atlantafx/sampler/"; + + public static InputStream getResourceAsStream(String resource) { + String path = resolve(resource); + return Objects.requireNonNull( + Launcher.class.getResourceAsStream(resolve(path)), + "Resource not found: " + path + ); + } + + public static URI getResource(String resource) { + String path = resolve(resource); + URL url = Objects.requireNonNull(Launcher.class.getResource(resolve(path)), "Resource not found: " + path); + return URI.create(url.toExternalForm()); + } + + public static String resolve(String resource) { + Objects.requireNonNull(resource); + return resource.startsWith("/") ? resource : MODULE_DIR + resource; + } + + public static String getPropertyOrEnv(String propertyKey, String envKey) { + return System.getProperty(propertyKey, System.getenv(envKey)); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/fake/SampleMenuBar.java b/sampler/src/main/java/atlantafx/sampler/fake/SampleMenuBar.java new file mode 100644 index 0000000..4a70453 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/fake/SampleMenuBar.java @@ -0,0 +1,145 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.fake; + +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.control.*; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import net.datafaker.Faker; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.stream.IntStream; + +import static atlantafx.sampler.util.Controls.menuItem; +import static javafx.scene.input.KeyCombination.CONTROL_DOWN; +import static javafx.scene.input.KeyCombination.SHIFT_DOWN; + +public class SampleMenuBar extends MenuBar { + + private static final EventHandler PRINT_SOURCE = System.out::println; + + public SampleMenuBar(Faker faker) { + getMenus().addAll( + fileMenu(faker), + editMenu(), + viewMenu(), + toolsMenu(), + aboutMenu() + ); + } + + private Menu fileMenu(Faker faker) { + var fileMenu = new Menu("_File"); + fileMenu.setMnemonicParsing(true); + fileMenu.setOnAction(PRINT_SOURCE); + + var newMenu = menuItem("_New", null, new KeyCodeCombination(KeyCode.N, CONTROL_DOWN)); + newMenu.setMnemonicParsing(true); + newMenu.setOnAction(PRINT_SOURCE); + + var openRecentMenu = new Menu("Open _Recent"); + openRecentMenu.setMnemonicParsing(true); + openRecentMenu.setOnAction(PRINT_SOURCE); + openRecentMenu.getItems().addAll( + IntStream.range(0, 10).mapToObj(x -> new MenuItem(faker.file().fileName())).toList() + ); + + fileMenu.getItems().addAll( + newMenu, + new SeparatorMenuItem(), + menuItem("Open", Feather.FOLDER, new KeyCodeCombination(KeyCode.O, CONTROL_DOWN)), + openRecentMenu, + new SeparatorMenuItem(), + menuItem("Save", Feather.SAVE, new KeyCodeCombination(KeyCode.S, CONTROL_DOWN)), + new MenuItem("Save As"), + new SeparatorMenuItem(), + new MenuItem("Exit") + ); + return fileMenu; + } + + private Menu editMenu() { + var editMenu = new Menu("_Edit"); + editMenu.setMnemonicParsing(true); + editMenu.setOnAction(PRINT_SOURCE); + + editMenu.getItems().addAll( + menuItem("Undo", Feather.CORNER_DOWN_LEFT, new KeyCodeCombination(KeyCode.Z, CONTROL_DOWN)), + menuItem("Redo", Feather.CORNER_DOWN_RIGHT, new KeyCodeCombination(KeyCode.Y, CONTROL_DOWN)), + new SeparatorMenuItem(), + menuItem("Cut", Feather.SCISSORS, new KeyCodeCombination(KeyCode.X, CONTROL_DOWN)), + menuItem("Copy", Feather.COPY, new KeyCodeCombination(KeyCode.C, CONTROL_DOWN), true), + menuItem("Paste", Feather.CORNER_DOWN_LEFT, new KeyCodeCombination(KeyCode.V, CONTROL_DOWN)) + ); + return editMenu; + } + + private Menu viewMenu() { + var viewMenu = new Menu("_View"); + viewMenu.setMnemonicParsing(true); + viewMenu.setOnAction(PRINT_SOURCE); + + var showToolbarItem = new CheckMenuItem("Show Toolbar", new FontIcon(Feather.TOOL)); + showToolbarItem.setSelected(true); + showToolbarItem.setAccelerator(new KeyCodeCombination(KeyCode.T, CONTROL_DOWN)); + + var showGridItem = new CheckMenuItem("Show Grid", new FontIcon(Feather.GRID)); + + var viewToggleGroup = new ToggleGroup(); + + var toggleItem1 = new RadioMenuItem("Single"); + toggleItem1.setSelected(true); + toggleItem1.setToggleGroup(viewToggleGroup); + + var toggleItem2 = new RadioMenuItem("Two Columns"); + toggleItem2.setToggleGroup(viewToggleGroup); + + var toggleItem3 = new RadioMenuItem("Three Columns"); + toggleItem3.setToggleGroup(viewToggleGroup); + + viewMenu.getItems().addAll( + showToolbarItem, + showGridItem, + new SeparatorMenuItem(), + toggleItem1, + toggleItem2, + toggleItem3 + ); + return viewMenu; + } + + private Menu toolsMenu() { + var toolsMenu = new Menu("_Tools"); + toolsMenu.setMnemonicParsing(true); + toolsMenu.setOnAction(PRINT_SOURCE); + toolsMenu.setDisable(true); + return toolsMenu; + } + + private Menu aboutMenu() { + var aboutMenu = new Menu("_About", new FontIcon(Feather.HELP_CIRCLE)); + aboutMenu.setMnemonicParsing(true); + aboutMenu.setOnAction(PRINT_SOURCE); + + var deeplyNestedMenu = new Menu("Very...", null, + new Menu("Very...", null, + new Menu("Deeply", null, + new Menu("Nested", null, + new MenuItem("Menu") + )))); + // NOTE: this won't be displayed because right container is reserved for submenu indication + deeplyNestedMenu.setAccelerator(new KeyCodeCombination( + KeyCode.DIGIT1, SHIFT_DOWN, CONTROL_DOWN) + ); + + aboutMenu.getItems().addAll( + new MenuItem("Help"), + new MenuItem("About"), + new SeparatorMenuItem(), + deeplyNestedMenu + ); + return aboutMenu; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/fake/domain/Book.java b/sampler/src/main/java/atlantafx/sampler/fake/domain/Book.java new file mode 100644 index 0000000..477a785 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/fake/domain/Book.java @@ -0,0 +1,68 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.fake.domain; + +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; +import net.datafaker.Faker; + +import java.util.Objects; +import java.util.UUID; +import java.util.function.Function; + +public final class Book { + + private UUID id; + private final BooleanProperty state; + private String author; + private String title; + private String isbn; + + public Book(UUID id, + BooleanProperty state, + String author, + String title, + String isbn) { + this.id = id; + this.state = state; + this.author = author; + this.title = title; + this.isbn = isbn; + } + + public UUID getId() { return id; } + + public void setId(UUID id) { this.id = id; } + + public boolean getState() { return state.get(); } + + public void setState(boolean state) { this.state.set(state); } + + public BooleanProperty stateProperty() { return state; } + + public String getAuthor() { return author; } + + public void setAuthor(String author) { this.author = author; } + + public String getTitle() { return title; } + + public void setTitle(String title) { this.title = title; } + + public String getIsbn() { return isbn; } + + public void setIsbn(String isbn) { this.isbn = isbn; } + + public static Book random(Faker faker) { + return new Book( + UUID.randomUUID(), + new SimpleBooleanProperty(), + faker.book().author(), + faker.book().title(), + faker.code().isbn10() + ); + } + + public String toString(Function f) { + Objects.requireNonNull(f); + return f.apply(this); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/fake/domain/Product.java b/sampler/src/main/java/atlantafx/sampler/fake/domain/Product.java new file mode 100644 index 0000000..ac07ff7 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/fake/domain/Product.java @@ -0,0 +1,92 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.fake.domain; + +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; +import net.datafaker.Faker; + +import java.util.Objects; +import java.util.function.Function; + +public final class Product { + + private static final int MAX_STOCK_SIZE = 999; + + private int id; + private final BooleanProperty state; + private String brand; + private String name; + private String price; + private Integer count; + + public Product(int id, + BooleanProperty state, + String brand, + String name, + String price, + Integer count + ) { + this.id = id; + this.state = state; + this.brand = brand; + this.name = name; + this.price = price; + this.count = count; + } + + public int getId() { return id; } + + public void setId(int id) { this.id = id; } + + public boolean getState() { return state.get(); } + + public BooleanProperty stateProperty() { return state; } + + public void setState(boolean state) { this.state.set(state); } + + public String getBrand() { return brand; } + + public void setBrand(String brand) { this.brand = brand; } + + public String getName() { return name; } + + public void setName(String name) { this.name = name; } + + public String getPrice() { return price; } + + public void setPrice(String price) { this.price = price; } + + public Integer getCount() { return count; } + + public void setCount(Integer count) { this.count = count; } + + public double getAvailability() { + return count * 1.0 / MAX_STOCK_SIZE; + } + + public static Product random(int id, Faker faker) { + return new Product( + id, + new SimpleBooleanProperty(), + faker.commerce().brand(), + faker.commerce().productName(), + faker.commerce().price(), + faker.random().nextInt(0, MAX_STOCK_SIZE) + ); + } + + public static Product random(int id, String brand, Faker faker) { + var product = random(id, faker); + product.setBrand(brand); + return product; + } + + public static Product empty(int id) { + return new Product(id, new SimpleBooleanProperty(), "", "", "", 0); + } + + public String toString(Function f) { + Objects.requireNonNull(f); + return f.apply(this); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/layout/ApplicationWindow.java b/sampler/src/main/java/atlantafx/sampler/layout/ApplicationWindow.java new file mode 100755 index 0000000..7f6bfef --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/layout/ApplicationWindow.java @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.layout; + +import atlantafx.sampler.page.Page; +import atlantafx.sampler.page.components.OverviewPage; +import javafx.application.Platform; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.StackPane; + +import static javafx.scene.layout.Priority.ALWAYS; + +public class ApplicationWindow extends BorderPane { + + public ApplicationWindow() { + var sidebar = new Sidebar(); + sidebar.setMinWidth(200); + + final var pageContainer = new StackPane(); + HBox.setHgrow(pageContainer, ALWAYS); + + sidebar.setOnSelect(pageClass -> { + try { + Page page = pageClass.getDeclaredConstructor().newInstance(); + pageContainer.getChildren().setAll(page.getView()); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + + // ~ + setLeft(sidebar); + setCenter(pageContainer); + + sidebar.select(OverviewPage.class); + Platform.runLater(sidebar::requestFocus); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/layout/Sidebar.java b/sampler/src/main/java/atlantafx/sampler/layout/Sidebar.java new file mode 100644 index 0000000..d1014b4 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/layout/Sidebar.java @@ -0,0 +1,215 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.layout; + +import atlantafx.base.controls.Spacer; +import atlantafx.base.theme.Styles; +import atlantafx.sampler.page.Page; +import atlantafx.sampler.page.components.*; +import atlantafx.sampler.page.general.ThemePage; +import atlantafx.sampler.page.general.TypographyPage; +import atlantafx.sampler.util.Containers; +import javafx.beans.binding.Bindings; +import javafx.beans.property.ReadOnlyObjectWrapper; +import javafx.collections.FXCollections; +import javafx.collections.transformation.FilteredList; +import javafx.css.PseudoClass; +import javafx.geometry.Orientation; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Region; +import javafx.scene.layout.VBox; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; + +import static javafx.scene.layout.Priority.ALWAYS; + +public class Sidebar extends VBox { + + private static final PseudoClass SELECTED = PseudoClass.getPseudoClass("selected"); + + private final FilteredList navigationMenu = navigationMenu(); + private final ReadOnlyObjectWrapper selectedLink = new ReadOnlyObjectWrapper<>(); + private Consumer> navigationHandler; + + public Sidebar() { + super(); + setId("sidebar"); + + createView(); + + selectedLink.addListener((obs, old, val) -> { + if (navigationHandler != null) { + navigationHandler.accept(val != null ? val.getPageClass() : null); + } + }); + } + + public void select(Class pageClass) { + navigationMenu.stream() + .filter(region -> region instanceof NavLink link && pageClass.equals(link.getPageClass())) + .findFirst() + .ifPresent(link -> navigate((NavLink) link)); + } + + public void setOnSelect(Consumer> c) { + navigationHandler = c; + } + + private void createView() { + var navContainer = new VBox(); + navContainer.getStyleClass().add("nav-menu"); + Bindings.bindContent(navContainer.getChildren(), navigationMenu); + + var navScroll = new ScrollPane(navContainer); + Containers.setScrollConstraints(navScroll, + ScrollPane.ScrollBarPolicy.AS_NEEDED, true, + ScrollPane.ScrollBarPolicy.AS_NEEDED, true + ); + VBox.setVgrow(navScroll, ALWAYS); + + // == SEARCH FORM == + + var searchField = new TextField(); + searchField.setPromptText("Search"); + HBox.setHgrow(searchField, ALWAYS); + searchField.textProperty().addListener((obs, old, val) -> { + if (val == null || val.isBlank()) { + navigationMenu.setPredicate(c -> true); + return; + } + navigationMenu.setPredicate(c -> c instanceof NavLink link && link.matches(val)); + }); + + var searchForm = new HBox(searchField); + searchForm.setId("search-form"); + searchForm.setAlignment(Pos.CENTER_LEFT); + + // ~ + + getChildren().addAll(searchForm, navScroll); + } + + private Label caption(String text) { + var label = new Label(text); + label.getStyleClass().add("caption"); + label.setMaxWidth(Double.MAX_VALUE); + return label; + } + + private FilteredList navigationMenu() { + return new FilteredList<>(FXCollections.observableArrayList( + caption("GENERAL"), + navLink(ThemePage.NAME, ThemePage.class), + navLink(TypographyPage.NAME, TypographyPage.class), + new Separator(), + caption("COMPONENTS"), + navLink(OverviewPage.NAME, OverviewPage.class), + navLink(InputGroupPage.NAME, InputGroupPage.class), + new Spacer(10, Orientation.VERTICAL), + navLink(AccordionPage.NAME, AccordionPage.class), + navLink(BreadcrumbsPage.NAME, BreadcrumbsPage.class), + navLink(ButtonPage.NAME, ButtonPage.class), + navLink(ChartPage.NAME, ChartPage.class), + navLink(CheckBoxPage.NAME, CheckBoxPage.class), + navLink(ColorPickerPage.NAME, ColorPickerPage.class), + navLink(ComboBoxPage.NAME, ComboBoxPage.class, "ChoiceBox"), + navLink(CustomTextFieldPage.NAME, CustomTextFieldPage.class), + navLink(DatePickerPage.NAME, DatePickerPage.class), + navLink(DialogPage.NAME, DialogPage.class), + navLink(HTMLEditorPage.NAME, HTMLEditorPage.class), + navLink(ListPage.NAME, ListPage.class), + navLink(MenuPage.NAME, MenuPage.class), + navLink(MenuButtonPage.NAME, MenuButtonPage.class, "SplitMenuButton"), + navLink(PaginationPage.NAME, PaginationPage.class), + navLink(PopoverPage.NAME, PopoverPage.class), + navLink(ProgressPage.NAME, ProgressPage.class), + navLink(RadioButtonPage.NAME, RadioButtonPage.class), + navLink(ScrollPanePage.NAME, ScrollPanePage.class), + navLink(SeparatorPage.NAME, SeparatorPage.class), + navLink(SliderPage.NAME, SliderPage.class), + navLink(SpinnerPage.NAME, SpinnerPage.class), + navLink(SplitPanePage.NAME, SplitPanePage.class), + navLink(TablePage.NAME, TablePage.class), + navLink(TabPanePage.NAME, TabPanePage.class), + navLink(TextAreaPage.NAME, TextAreaPage.class), + navLink(TextFieldPage.NAME, TextFieldPage.class, "PasswordField"), + navLink(TitledPanePage.NAME, TitledPanePage.class), + navLink(ToggleButtonPage.NAME, ToggleButtonPage.class), + navLink(ToggleSwitchPage.NAME, ToggleSwitchPage.class), + navLink(ToolBarPage.NAME, ToolBarPage.class), + navLink(TooltipPage.NAME, TooltipPage.class), + navLink(TreePage.NAME, TreePage.class), + navLink(TreeTablePage.NAME, TreeTablePage.class) + )); + } + + private NavLink navLink(String text, Class pageClass, String... keywords) { + return navLink(text, pageClass, false, keywords); + } + + @SuppressWarnings("SameParameterValue") + private NavLink navLink(String text, Class pageClass, boolean isNew, String... keywords) { + var link = new NavLink(text, pageClass, isNew); + + if (keywords != null && keywords.length > 0) { + link.getSearchKeywords().addAll(Arrays.asList(keywords)); + } + + link.setOnMouseClicked(e -> { + if (e.getSource() instanceof NavLink dest) { navigate(dest); } + }); + + return link; + } + + private void navigate(NavLink link) { + if (selectedLink.get() != null) { selectedLink.get().pseudoClassStateChanged(SELECTED, false); } + link.pseudoClassStateChanged(SELECTED, true); + selectedLink.set(link); + } + + /////////////////////////////////////////////////////////////////////////// + + private static class NavLink extends Label { + + private final Class pageClass; + private final List searchKeywords = new ArrayList<>(); + + public NavLink(String text, Class pageClass, boolean isNew) { + super(Objects.requireNonNull(text)); + this.pageClass = Objects.requireNonNull(pageClass); + + getStyleClass().add("nav-link"); + setMaxWidth(Double.MAX_VALUE); + setContentDisplay(ContentDisplay.RIGHT); + + if (isNew) { + var tag = new Label("new"); + tag.getStyleClass().addAll("tag", Styles.TEXT_SMALL); + setGraphic(tag); + } + } + + public Class getPageClass() { + return pageClass; + } + + public List getSearchKeywords() { + return searchKeywords; + } + + public boolean matches(String filter) { + Objects.requireNonNull(filter); + return contains(getText(), filter) || searchKeywords.stream().anyMatch(keyword -> contains(keyword, filter)); + } + + private boolean contains(String text, String filter) { + return text.toLowerCase().contains(filter.toLowerCase()); + } + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/AbstractPage.java b/sampler/src/main/java/atlantafx/sampler/page/AbstractPage.java new file mode 100755 index 0000000..6ed19d4 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/AbstractPage.java @@ -0,0 +1,161 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page; + +import atlantafx.base.controls.Spacer; +import atlantafx.base.theme.Styles; +import atlantafx.sampler.theme.HighlightJSTheme; +import atlantafx.sampler.theme.ThemeManager; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.Tooltip; +import javafx.scene.layout.*; +import net.datafaker.Faker; +import org.kordamp.ikonli.Ikon; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.io.IOException; +import java.util.List; +import java.util.Objects; +import java.util.Random; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static atlantafx.base.theme.Styles.BUTTON_ICON; +import static atlantafx.sampler.util.Containers.setScrollConstraints; + +public abstract class AbstractPage extends BorderPane implements Page { + + protected static final int HEADER_HEIGHT = 50; + + protected static final Faker FAKER = new Faker(); + protected static final Random RANDOM = new Random(); + protected static final EventHandler PRINT_SOURCE = System.out::println; + private static final Ikon ICON_CODE = Feather.CODE; + private static final Ikon ICON_SAMPLE = Feather.LAYOUT; + + protected Button sourceCodeToggleBtn; + protected StackPane codeViewerWrapper; + protected CodeViewer codeViewer; + protected VBox userContent; + protected boolean isRendered = false; + + protected AbstractPage() { + super(); + + getStyleClass().add("page"); + createPageLayout(); + } + + protected void createPageLayout() { + // == header == + + var titleLabel = new Label(getName()); + titleLabel.getStyleClass().addAll(Styles.TITLE_4); + + codeViewer = new CodeViewer(); + + codeViewerWrapper = new StackPane(); + codeViewerWrapper.getStyleClass().add("wrapper"); + codeViewerWrapper.getChildren().setAll(codeViewer); + + sourceCodeToggleBtn = new Button("", new FontIcon(ICON_CODE)); + sourceCodeToggleBtn.getStyleClass().addAll(BUTTON_ICON); + sourceCodeToggleBtn.setTooltip(new Tooltip("Source Code")); + sourceCodeToggleBtn.setOnAction(e -> toggleSourceCode()); + + var header = new HBox(); + header.getStyleClass().add("header"); + header.setMinHeight(HEADER_HEIGHT); + header.setAlignment(Pos.CENTER_LEFT); + header.getChildren().setAll(titleLabel, new Spacer(), sourceCodeToggleBtn); + + // == user content == + + userContent = new VBox(); + userContent.getStyleClass().add("user-content"); + + var userContentWrapper = new StackPane(); + userContentWrapper.getStyleClass().add("wrapper"); + userContentWrapper.getChildren().setAll(userContent); + + var scrollPane = new ScrollPane(userContentWrapper); + setScrollConstraints(scrollPane, + ScrollPane.ScrollBarPolicy.AS_NEEDED, true, + ScrollPane.ScrollBarPolicy.AS_NEEDED, true + ); + scrollPane.setMaxHeight(10_000); + + // == layout == + + var stackPane = new StackPane(); + stackPane.getStyleClass().add("stack"); + stackPane.getChildren().addAll(codeViewerWrapper, scrollPane); + + setTop(header); + setCenter(stackPane); + } + + @Override + public Pane getView() { + return this; + } + + @Override + public void reset() { } + + protected void layoutChildren() { + super.layoutChildren(); + if (isRendered) { return; } + + isRendered = true; + onRendered(); + } + + // Some properties can only be obtained after node placed + // to the scene graph and here is the place do this. + protected void onRendered() { } + + protected void toggleSourceCode() { + var graphic = (FontIcon) sourceCodeToggleBtn.getGraphic(); + + if (graphic.getIconCode() == ICON_SAMPLE) { + codeViewerWrapper.toBack(); + graphic.setIconCode(ICON_CODE); + return; + } + + var sourceFileName = getClass().getSimpleName() + ".java"; + try (var stream = getClass().getResourceAsStream(sourceFileName)) { + Objects.requireNonNull(stream, "Missing source file '" + sourceFileName + "';"); + + // set syntax highlight theme according to JavaFX theme + var highlightJSTheme = ThemeManager.getInstance().getTheme().isDarkMode() ? + HighlightJSTheme.githubDark() : + HighlightJSTheme.githubLight(); + codeViewer.setContent(stream, highlightJSTheme); + + graphic.setIconCode(ICON_SAMPLE); + codeViewerWrapper.toFront(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /////////////////////////////////////////////////////////////////////////// + // Helpers // + /////////////////////////////////////////////////////////////////////////// + + protected List generate(Supplier supplier, int count) { + return Stream.generate(supplier).limit(count).collect(Collectors.toList()); + } + + protected Feather randomIcon() { + return Feather.values()[RANDOM.nextInt(Feather.values().length)]; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/CodeViewer.java b/sampler/src/main/java/atlantafx/sampler/page/CodeViewer.java new file mode 100644 index 0000000..c9f8015 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/CodeViewer.java @@ -0,0 +1,69 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page; + +import atlantafx.sampler.Resources; +import atlantafx.sampler.theme.HighlightJSTheme; +import atlantafx.sampler.util.Containers; +import javafx.geometry.Insets; +import javafx.scene.layout.AnchorPane; +import javafx.scene.web.WebView; + +import java.io.IOException; +import java.io.InputStream; + +import static java.nio.charset.StandardCharsets.UTF_8; + +public class CodeViewer extends AnchorPane { + + private static final String HLJS_LIB = "assets/highlightjs/highlight.min.js"; + private static final String HLJS_SCRIPT = "hljs.highlightAll();"; + + private WebView webView; + + public CodeViewer() { + getStyleClass().add("code-viewer"); + } + + private void lazyLoadWebView() { + if (webView == null) { + webView = new WebView(); + Containers.setAnchors(webView, Insets.EMPTY); + getChildren().setAll(webView); + } + } + + @SuppressWarnings("StringBufferReplaceableByString") + public void setContent(InputStream source, HighlightJSTheme theme) { + lazyLoadWebView(); + + try (var hljs = Resources.getResourceAsStream(HLJS_LIB)) { + + // NOTE: + // Line numbers aren't here because Highlight JS itself doesn't support it + // and highlighjs-line-numbers plugin break both indentation and colors. + webView.getEngine().loadContent( + new StringBuilder() + .append("") + .append("") + .append("") + .append("") + .append("") + .append("") + // Transparent background is allowed starting from OpenJFX 18. + // https://bugs.openjdk.org/browse/JDK-8090547 + // Until that it should match Highlight JS background. + .append(String.format("", theme.getBackground())) + .append("
")
+                            .append("")
+                            .append(new String(source.readAllBytes(), UTF_8))
+                            .append("")
+                            .append("
") + .append("") + .append("") + .toString() + ); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/Page.java b/sampler/src/main/java/atlantafx/sampler/page/Page.java new file mode 100755 index 0000000..e84a1b7 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/Page.java @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page; + +import javafx.scene.Parent; + +public interface Page { + + String getName(); + + Parent getView(); + + void reset(); +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/SampleBlock.java b/sampler/src/main/java/atlantafx/sampler/page/SampleBlock.java new file mode 100644 index 0000000..cb0bf6b --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/SampleBlock.java @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page; + +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.layout.Pane; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; + +public class SampleBlock { + + protected final VBox root; + protected final Label titleLabel; + protected final Node content; + + public SampleBlock(String title, Node content) { + this.titleLabel = new Label(title); + this.titleLabel.getStyleClass().add("title"); + + this.content = content; + VBox.setVgrow(content, Priority.ALWAYS); + + this.root = new VBox(titleLabel, content); + this.root.getStyleClass().add("sample-block"); + } + + public Pane getRoot() { + return root; + } + + public String getText() { + return titleLabel.getText(); + } + + public void setText(String text) { + titleLabel.setText(text); + } + + public Node getContent() { + return content; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/AccordionPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/AccordionPage.java new file mode 100644 index 0000000..1329fa9 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/AccordionPage.java @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.sampler.Resources; +import atlantafx.sampler.page.AbstractPage; +import javafx.application.Platform; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.geometry.Insets; +import javafx.scene.control.Accordion; +import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TitledPane; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.scene.text.Text; +import javafx.scene.text.TextFlow; + +public class AccordionPage extends AbstractPage { + + public static final String NAME = "Accordion"; + + @Override + public String getName() { return NAME; } + + private final BooleanProperty expandedProperty = new SimpleBooleanProperty(true); + private final BooleanProperty animatedProperty = new SimpleBooleanProperty(true); + + public AccordionPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().addAll(new VBox(10, + controls(), + playground() + )); + } + + private Accordion playground() { + var textBlockContent = new Label(FAKER.chuckNorris().fact()); + var textBlock = new TitledPane("_Quote", textBlockContent); + textBlock.setMnemonicParsing(true); + textBlock.animatedProperty().bind(animatedProperty); + + var textFlow = new TextFlow(new Text(String.join("\n\n", FAKER.lorem().paragraphs(10)))); + textFlow.setPadding(new Insets(0, 10, 0, 0)); + var scrollTextBlockContent = new ScrollPane(textFlow); + scrollTextBlockContent.setMinHeight(200); + scrollTextBlockContent.setFitToWidth(true); + var scrollableTextBlock = new TitledPane("_Scrollable Text", scrollTextBlockContent); + scrollableTextBlock.setMnemonicParsing(true); + scrollableTextBlock.animatedProperty().bind(animatedProperty); + + var disabledBlock = new TitledPane("Disabled Block", null); + disabledBlock.setDisable(true); + + var imageBlock = new TitledPane("_Image", new VBox(10, + new ImageView(new Image(Resources.getResourceAsStream("images/20_min_adventure.jpg"))), + new TextFlow(new Text(FAKER.rickAndMorty().quote())) + )); + imageBlock.animatedProperty().bind(animatedProperty); + imageBlock.setMnemonicParsing(true); + + // ~ + + var accordion = new Accordion( + textBlock, + scrollableTextBlock, + disabledBlock, + imageBlock + ); + accordion.expandedPaneProperty().addListener((obs, old, val) -> { + // make sure the accordion can never be completely collapsed + boolean hasExpanded = accordion.getPanes().stream().anyMatch(TitledPane::isExpanded); + if (expandedProperty.get() && !hasExpanded && old != null) { + Platform.runLater(() -> accordion.setExpandedPane(old)); + } + }); + accordion.setExpandedPane(accordion.getPanes().get(0)); + + return accordion; + } + + private HBox controls() { + var animatedToggle = new ToggleSwitch("Animated"); + animatedProperty.bind(animatedToggle.selectedProperty()); + animatedToggle.setSelected(true); + + var expandedToggle = new ToggleSwitch("Always expanded"); + expandedProperty.bind(expandedToggle.selectedProperty()); + expandedToggle.setSelected(true); + + var controls = new HBox(20, animatedToggle, expandedToggle); + controls.setPadding(new Insets(0, 0, 0, 2)); + + return controls; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/BreadcrumbsPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/BreadcrumbsPage.java new file mode 100644 index 0000000..0f5784b --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/BreadcrumbsPage.java @@ -0,0 +1,97 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.Breadcrumbs; +import atlantafx.base.theme.Styles; +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.ContentDisplay; +import javafx.scene.control.TreeItem; +import javafx.scene.layout.HBox; +import javafx.util.Callback; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; + +public class BreadcrumbsPage extends AbstractPage { + + public static final String NAME = "Breadcrumbs"; + + @Override + public String getName() { return NAME; } + + public BreadcrumbsPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().addAll( + defaultSample().getRoot(), + customCrumbSample().getRoot() + ); + } + + private SampleBlock defaultSample() { + return new SampleBlock("Basic", breadcrumbs(null)); + } + + private SampleBlock customCrumbSample() { + Callback, Button> crumbFactory = crumb -> { + var btn = new Button(crumb.getValue()); + btn.getStyleClass().add(Styles.FLAT); + btn.setFocusTraversable(false); + if (!crumb.getChildren().isEmpty()) { + btn.setGraphic(new FontIcon(Feather.CHEVRON_RIGHT)); + } + btn.setContentDisplay(ContentDisplay.RIGHT); + btn.setStyle("-fx-padding: 12px 6px 12px 6px;"); + return btn; + }; + + return new SampleBlock("Custom crumb factory", breadcrumbs(crumbFactory)); + } + + private HBox breadcrumbs(Callback, Button> crumbFactory) { + int count = 5; + TreeItem model = Breadcrumbs.buildTreeModel( + generate(() -> FAKER.science().element(), count).toArray(String[]::new) + ); + + var nextBtn = new Button("Next"); + nextBtn.getStyleClass().add(Styles.ACCENT); + + var breadcrumbs = new Breadcrumbs<>(model); + breadcrumbs.setSelectedCrumb(getAncestor(model, count / 2)); + if (crumbFactory != null) { breadcrumbs.setCrumbFactory(crumbFactory); } + + nextBtn.setOnAction(e -> { + TreeItem selected = breadcrumbs.getSelectedCrumb(); + if (selected.getChildren().size() > 0) { + breadcrumbs.setSelectedCrumb(selected.getChildren().get(0)); + } + }); + + breadcrumbs.selectedCrumbProperty().addListener((obs, old, val) -> { + if (val != null) { + nextBtn.setDisable(val.getChildren().isEmpty()); + } + }); + + var box = new HBox(60, nextBtn, breadcrumbs); + box.setAlignment(Pos.CENTER_LEFT); + + return box; + } + + private TreeItem getAncestor(TreeItem node, int height) { + var counter = height; + var current = node; + while (counter > 0 && current.getParent() != null) { + current = current.getParent(); + counter--; + } + return current; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/ButtonPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/ButtonPage.java new file mode 100755 index 0000000..bab1bee --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/ButtonPage.java @@ -0,0 +1,198 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.scene.control.Button; +import javafx.scene.control.ContentDisplay; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.shape.Circle; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; + +import static atlantafx.base.theme.Styles.*; + +public class ButtonPage extends AbstractPage { + + public static final String NAME = "Button"; + + @Override + public String getName() { + return NAME; + } + + public ButtonPage() { + super(); + createView(); + } + + private void createView() { + var grid = new GridPane(); + grid.setHgap(40); + grid.setVgap(40); + grid.add(basicSamples().getRoot(), 0, 0); + grid.add(iconOnlySamples().getRoot(), 1, 0); + grid.add(coloredSamples().getRoot(), 0, 1); + grid.add(circularButtons().getRoot(), 1, 1); + grid.add(outlinedSamples().getRoot(), 0, 2); + grid.add(disabledSample().getRoot(), 1, 2); + + userContent.getChildren().addAll(grid); + } + + private SampleBlock basicSamples() { + var basicBtn = new Button("_Basic"); + basicBtn.setMnemonicParsing(true); + basicBtn.setOnAction(PRINT_SOURCE); + + var defaultBtn = new Button("_Default"); + defaultBtn.setDefaultButton(true); + defaultBtn.setMnemonicParsing(true); + defaultBtn.setOnAction(PRINT_SOURCE); + + var flatBtn = new Button("_Flat"); + flatBtn.getStyleClass().add(FLAT); + flatBtn.setOnAction(PRINT_SOURCE); + + var content = new HBox(10); + content.getChildren().addAll(basicBtn, defaultBtn, flatBtn); + + return new SampleBlock("Basic", content); + } + + private SampleBlock coloredSamples() { + var accentBtn = new Button("_Accent"); + accentBtn.getStyleClass().add(ACCENT); + accentBtn.setMnemonicParsing(true); + accentBtn.setOnAction(PRINT_SOURCE); + + var successBtn = new Button("_Success", new FontIcon(Feather.CHECK)); + successBtn.getStyleClass().add(SUCCESS); + successBtn.setMnemonicParsing(true); + successBtn.setOnAction(PRINT_SOURCE); + + var dangerBtn = new Button("Da_nger", new FontIcon(Feather.TRASH)); + dangerBtn.getStyleClass().add(DANGER); + dangerBtn.setContentDisplay(ContentDisplay.RIGHT); + dangerBtn.setMnemonicParsing(true); + dangerBtn.setOnAction(PRINT_SOURCE); + + var content = new HBox(10); + content.getChildren().addAll(accentBtn, successBtn, dangerBtn); + + return new SampleBlock("Colored", content); + } + + private SampleBlock iconOnlySamples() { + var basicBtn = new Button("", new FontIcon(Feather.MORE_HORIZONTAL)); + basicBtn.getStyleClass().addAll(BUTTON_ICON); + + var accentBtn = new Button("", new FontIcon(Feather.MENU)); + accentBtn.getStyleClass().addAll(BUTTON_ICON, ACCENT); + + var successBtn = new Button("", new FontIcon(Feather.CHECK)); + successBtn.getStyleClass().addAll(BUTTON_ICON, SUCCESS); + + var dangerBtn = new Button("", new FontIcon(Feather.TRASH)); + dangerBtn.getStyleClass().addAll(BUTTON_ICON, BUTTON_OUTLINED, DANGER); + + var flatAccentBtn = new Button("", new FontIcon(Feather.MIC)); + flatAccentBtn.getStyleClass().addAll(BUTTON_ICON, FLAT, ACCENT); + + var flatSuccessBtn = new Button("", new FontIcon(Feather.USER)); + flatSuccessBtn.getStyleClass().addAll(BUTTON_ICON, FLAT, SUCCESS); + + var flatDangerBtn = new Button("", new FontIcon(Feather.CROSSHAIR)); + flatDangerBtn.getStyleClass().addAll(BUTTON_ICON, FLAT, DANGER); + + var content = new HBox(10); + content.getChildren().addAll(basicBtn, accentBtn, successBtn, dangerBtn, + flatAccentBtn, flatSuccessBtn, flatDangerBtn + ); + + return new SampleBlock("Icon only", content); + } + + private SampleBlock circularButtons() { + var basicBtn = new Button("", new FontIcon(Feather.MORE_HORIZONTAL)); + basicBtn.getStyleClass().addAll(BUTTON_CIRCLE); + basicBtn.setShape(new Circle(50)); + + var accentBtn = new Button("", new FontIcon(Feather.MENU)); + accentBtn.getStyleClass().addAll(BUTTON_CIRCLE, ACCENT); + accentBtn.setShape(new Circle(50)); + + var successBtn = new Button("", new FontIcon(Feather.CHECK)); + successBtn.getStyleClass().addAll(BUTTON_CIRCLE, SUCCESS); + successBtn.setShape(new Circle(50)); + + var dangerBtn = new Button("", new FontIcon(Feather.TRASH)); + dangerBtn.getStyleClass().addAll(BUTTON_CIRCLE, BUTTON_OUTLINED, DANGER); + dangerBtn.setShape(new Circle(50)); + + var flatAccentBtn = new Button("", new FontIcon(Feather.MIC)); + flatAccentBtn.getStyleClass().addAll(BUTTON_CIRCLE, FLAT, ACCENT); + flatAccentBtn.setShape(new Circle(50)); + + var flatSuccessBtn = new Button("", new FontIcon(Feather.USER)); + flatSuccessBtn.getStyleClass().addAll(BUTTON_CIRCLE, FLAT, SUCCESS); + flatSuccessBtn.setShape(new Circle(50)); + + var flatDangerBtn = new Button("", new FontIcon(Feather.CROSSHAIR)); + flatDangerBtn.getStyleClass().addAll(BUTTON_CIRCLE, FLAT, DANGER); + flatDangerBtn.setShape(new Circle(50)); + + var content = new HBox(10); + content.getChildren().addAll(basicBtn, accentBtn, successBtn, dangerBtn, + flatAccentBtn, flatSuccessBtn, flatDangerBtn + ); + + return new SampleBlock("Circular", content); + } + + private SampleBlock outlinedSamples() { + var accentBtn = new Button("Accen_t"); + accentBtn.getStyleClass().addAll(BUTTON_OUTLINED, ACCENT); + accentBtn.setMnemonicParsing(true); + accentBtn.setOnAction(PRINT_SOURCE); + + var successBtn = new Button("S_uccess", new FontIcon(Feather.CHECK)); + successBtn.getStyleClass().addAll(BUTTON_OUTLINED, SUCCESS); + successBtn.setMnemonicParsing(true); + successBtn.setOnAction(PRINT_SOURCE); + + var dangerBtn = new Button("Dan_ger", new FontIcon(Feather.TRASH)); + dangerBtn.getStyleClass().addAll(BUTTON_OUTLINED, DANGER); + dangerBtn.setContentDisplay(ContentDisplay.RIGHT); + dangerBtn.setMnemonicParsing(true); + dangerBtn.setOnAction(PRINT_SOURCE); + + var content = new HBox(10); + content.getChildren().addAll(accentBtn, successBtn, dangerBtn); + + return new SampleBlock("Outlined", content); + } + + private SampleBlock disabledSample() { + var basicBtn = new Button("Basic"); + basicBtn.setDisable(true); + + var defaultBtn = new Button("Default"); + defaultBtn.setDefaultButton(true); + defaultBtn.setDisable(true); + + var flatBtn = new Button("Flat"); + flatBtn.getStyleClass().addAll(FLAT); + flatBtn.setDisable(true); + + var iconBtn = new Button("", new FontIcon(Feather.TAG)); + iconBtn.getStyleClass().addAll(BUTTON_ICON); + iconBtn.setDisable(true); + + var content = new HBox(10); + content.getChildren().addAll(basicBtn, defaultBtn, flatBtn, iconBtn); + + return new SampleBlock("Disabled", content); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/ChartPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/ChartPage.java new file mode 100644 index 0000000..3933d28 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/ChartPage.java @@ -0,0 +1,327 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.base.controls.Spacer; +import atlantafx.sampler.page.AbstractPage; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.geometry.Orientation; +import javafx.geometry.Pos; +import javafx.scene.chart.*; +import javafx.scene.control.ComboBox; +import javafx.scene.control.Label; +import javafx.scene.control.Separator; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.util.StringConverter; + +import java.time.Month; +import java.time.format.TextStyle; +import java.util.Arrays; +import java.util.Locale; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.IntStream; + +public class ChartPage extends AbstractPage { + + public static final String NAME = "Chart"; + + @Override + public String getName() { return NAME; } + + private VBox playground; + private ComboBox exampleSelect; + + public ChartPage() { + super(); + createView(); + } + + private void createView() { + playground = new VBox(10); + playground.setMinHeight(100); + + // === SELECT === + + exampleSelect = new ComboBox<>(); + exampleSelect.setMaxWidth(Double.MAX_VALUE); + exampleSelect.getItems().setAll(Example.values()); + exampleSelect.getSelectionModel().selectedItemProperty().addListener((obs, old, val) -> { + if (val == null) { return; } + if (playground.getChildren().size() != 5) { + throw new RuntimeException("Unexpected container size."); + } + + Chart newChart = createChart(val); + + // copy existing properties to the new chart + findDisplayedChart().ifPresent(ch -> newChart.setDisable(ch.isDisable())); + + playground.getChildren().set(2, newChart); + }); + exampleSelect.setConverter(new StringConverter<>() { + + @Override + public String toString(Example example) { + return example == null ? "" : example.getName(); + } + + @Override + public Example fromString(String s) { + return Example.find(s); + } + }); + + // === CONTROLS === + + var disableToggle = new ToggleSwitch("Disable"); + disableToggle.selectedProperty().addListener((obs, old, val) -> findDisplayedChart().ifPresent(ch -> { + if (val != null) { ch.setDisable(val); } + })); + + var controls = new HBox(20, + new Spacer(), + disableToggle, + new Spacer() + ); + controls.setAlignment(Pos.CENTER); + + // ~ + + playground.getChildren().setAll( + new Label("Select an example:"), + exampleSelect, + new Spacer(Orientation.VERTICAL), + new Separator(), + controls + ); + + userContent.getChildren().setAll(playground); + } + + @Override + protected void onRendered() { + super.onRendered(); + exampleSelect.getSelectionModel().selectFirst(); + } + + private Optional findDisplayedChart() { + return playground.getChildren().stream() + .filter(c -> c instanceof Chart) + .findFirst() + .map(c -> (Chart) c); + } + + private Chart createChart(Example example) { + switch (example) { + case AREA_CHART -> { return areaChart(false); } + case BAR_CHART -> { return barChart(false); } + case BUBBLE_CHART -> { return bubbleChart(); } + case LINE_CHART -> { return lineChart(); } + case PIE_CHART -> { return pieChart(); } + case SCATTER_CHART -> { return scatterChart(); } + case STACKED_AREA_CHART -> { return areaChart(true); } + case STACKED_BAR_CHART -> { return barChart(true); } + default -> throw new IllegalArgumentException("Unexpected enum value: " + example); + } + } + + @SuppressWarnings("unchecked") + private Chart areaChart(boolean stacked) { + var x = new NumberAxis(1, 31, 1); + x.setLabel("Day"); + + var y = new NumberAxis(); + y.setLabel("Temperature"); + + var april = new XYChart.Series(); + april.setName("April"); + IntStream.range(1, 30).forEach(i -> april.getData().add( + new XYChart.Data<>(i, FAKER.random().nextInt(15, 30)) + )); + + var may = new XYChart.Series(); + may.setName("May"); + IntStream.range(1, 30).forEach(i -> may.getData().add( + new XYChart.Data<>(i, FAKER.random().nextInt(15, 30)) + )); + + var chart = stacked ? new StackedAreaChart<>(x, y) : new AreaChart<>(x, y); + chart.setTitle("Temperature Monitoring"); + chart.getData().addAll(april, may); + + return chart; + } + + @SuppressWarnings("unchecked") + private Chart barChart(boolean stacked) { + final var rnd = FAKER.random(); + final var countries = IntStream.range(0, 5).boxed() + .map(i -> FAKER.country().countryCode3().toUpperCase()) + .toList(); + + var x = new CategoryAxis(); + x.setLabel("Country"); + + var y = new NumberAxis(0, 80, 10); + y.setLabel("Value"); + + var january = new XYChart.Series(); + january.setName("January"); + IntStream.range(0, countries.size()).forEach(i -> january.getData().add( + new XYChart.Data<>(countries.get(i), rnd.nextInt(10, 80)) + )); + + var february = new XYChart.Series(); + february.setName("February"); + IntStream.range(0, countries.size()).forEach(i -> february.getData().add( + new XYChart.Data<>(countries.get(i), rnd.nextInt(10, 80)) + )); + + var march = new XYChart.Series(); + march.setName("March"); + IntStream.range(0, countries.size()).forEach(i -> march.getData().add( + new XYChart.Data<>(countries.get(i), rnd.nextInt(10, 80)) + )); + + var chart = stacked ? new StackedBarChart<>(x, y) : new BarChart<>(x, y); + chart.setTitle("Country Summary"); + chart.getData().addAll(january, february, march); + + return chart; + } + + @SuppressWarnings("unchecked") + private Chart bubbleChart() { + final var rnd = FAKER.random(); + + var x = new NumberAxis(1, 53, 4); + x.setLabel("Week"); + + var y = new NumberAxis(0, 80, 10); + y.setLabel("Product Budget"); + + var series1 = new XYChart.Series(); + series1.setName(FAKER.commerce().productName()); + IntStream.range(1, 10).forEach(i -> series1.getData().add( + new XYChart.Data<>(rnd.nextInt(1, 53), rnd.nextInt(10, 80), rnd.nextDouble(1, 10)) + )); + + var series2 = new XYChart.Series(); + series2.setName(FAKER.commerce().productName()); + IntStream.range(1, 10).forEach(i -> series2.getData().add( + new XYChart.Data<>(rnd.nextInt(1, 53), rnd.nextInt(10, 80), rnd.nextDouble(1, 10)) + )); + + var chart = new BubbleChart<>(x, y); + chart.setTitle("Budget Monitoring"); + chart.getData().addAll(series1, series2); + + return chart; + } + + @SuppressWarnings("unchecked") + private Chart lineChart() { + final var rnd = FAKER.random(); + + var x = new CategoryAxis(); + x.setLabel("Month"); + + var y = new NumberAxis(0, 80, 10); + y.setLabel("Value"); + + var series1 = new XYChart.Series(); + series1.setName(FAKER.stock().nsdqSymbol()); + IntStream.range(1, 12).forEach(i -> series1.getData().add( + new XYChart.Data<>(Month.of(i).getDisplayName(TextStyle.SHORT, Locale.getDefault()), rnd.nextInt(10, 80)) + )); + + var series2 = new XYChart.Series(); + series2.setName(FAKER.stock().nsdqSymbol()); + IntStream.range(1, 12).forEach(i -> series2.getData().add( + new XYChart.Data<>(Month.of(i).getDisplayName(TextStyle.SHORT, Locale.getDefault()), rnd.nextInt(10, 80)) + )); + + var chart = new LineChart<>(x, y); + chart.setTitle("Stock Monitoring"); + chart.getData().addAll(series1, series2); + + return chart; + } + + private Chart pieChart() { + final var rnd = FAKER.random(); + + ObservableList data = FXCollections.observableArrayList( + new PieChart.Data(FAKER.food().fruit(), rnd.nextInt(10, 30)), + new PieChart.Data(FAKER.food().fruit(), rnd.nextInt(10, 30)), + new PieChart.Data(FAKER.food().fruit(), rnd.nextInt(10, 30)), + new PieChart.Data(FAKER.food().fruit(), rnd.nextInt(10, 30)), + new PieChart.Data(FAKER.food().fruit(), rnd.nextInt(10, 30)) + ); + + var chart = new PieChart(data); + chart.setTitle("Imported Fruits"); + + return chart; + } + + @SuppressWarnings("unchecked") + private Chart scatterChart() { + final var rnd = FAKER.random(); + + var x = new NumberAxis(0, 10, 1); + x.setLabel("Age"); + + var y = new NumberAxis(-100, 500, 100); + y.setLabel("Returns to date"); + + var series1 = new XYChart.Series(); + series1.setName("Equities"); + IntStream.range(1, 10).forEach(i -> series1.getData().add( + new XYChart.Data<>(rnd.nextDouble(0, 10), rnd.nextDouble(-100, 500)) + )); + + var series2 = new XYChart.Series(); + series2.setName("Mutual funds"); + IntStream.range(1, 10).forEach(i -> series2.getData().add( + new XYChart.Data<>(rnd.nextDouble(0, 10), rnd.nextDouble(-100, 500)) + )); + + var chart = new ScatterChart<>(x, y); + chart.setTitle("Investment Overview"); + chart.getData().addAll(series1, series2); + + return chart; + } + + private enum Example { + AREA_CHART("Area Chart"), + BAR_CHART("Bar Chart"), + BUBBLE_CHART("Bubble Chart"), + LINE_CHART("Line Chart"), + PIE_CHART("Pie Chart"), + SCATTER_CHART("Scatter Chart"), + STACKED_AREA_CHART("Stacked Area Chart"), + STACKED_BAR_CHART("Stacked Bar Chart"); + + private final String name; + + Example(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public static Example find(String name) { + return Arrays.stream(Example.values()) + .filter(example -> Objects.equals(example.getName(), name)) + .findFirst() + .orElse(null); + } + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/CheckBoxPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/CheckBoxPage.java new file mode 100644 index 0000000..453aae1 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/CheckBoxPage.java @@ -0,0 +1,92 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.scene.control.CheckBox; +import javafx.scene.layout.HBox; +import javafx.scene.layout.StackPane; + +public class CheckBoxPage extends AbstractPage { + + public static final String NAME = "CheckBox"; + + @Override + public String getName() { return NAME; } + + private CheckBox basicCheck; + private CheckBox indeterminateCheck; + + public CheckBoxPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().addAll( + basicSamples(), + disabledSamples() + ); + } + + private HBox basicSamples() { + basicCheck = new CheckBox("_Check Me"); + basicCheck.setMnemonicParsing(true); + basicCheck.setOnAction(PRINT_SOURCE); + var basicBlock = new SampleBlock("Basic", basicCheck); + + indeterminateCheck = new CheckBox("C_heck Me"); + indeterminateCheck.setAllowIndeterminate(true); + indeterminateCheck.setIndeterminate(true); + indeterminateCheck.setMnemonicParsing(true); + indeterminateCheck.setOnAction(PRINT_SOURCE); + var indeterminateBlock = new SampleBlock("Indeterminate", indeterminateCheck); + + var root = new HBox(20); + root.getChildren().addAll( + basicBlock.getRoot(), + indeterminateBlock.getRoot() + ); + + return root; + } + + private HBox disabledSamples() { + var basicCheck = new CheckBox("Check Me"); + basicCheck.setSelected(true); + basicCheck.setDisable(true); + + var indeterminateCheck = new CheckBox("Check Me"); + indeterminateCheck.setAllowIndeterminate(true); + indeterminateCheck.setIndeterminate(true); + indeterminateCheck.setDisable(true); + + var disabledBlock = new SampleBlock("Disabled", new HBox(10, basicCheck, indeterminateCheck)); + + var root = new HBox(20); + root.getChildren().addAll(disabledBlock.getRoot()); + + return root; + } + + // visually compare normal and indeterminate checkboxes size + protected void onRendered() { + var normalBox = basicCheck.lookup(".box"); + var indeterminateBox = indeterminateCheck.lookup(".box"); + + if (normalBox == null || indeterminateBox == null) { return; } + + // force layout to obtain node bounds + ((StackPane) normalBox).layout(); + ((StackPane) indeterminateBox).layout(); + + basicCheck.setText(String.format("_Check Me (size = H%.2f x W%.2f)", + normalBox.getBoundsInParent().getHeight(), + normalBox.getBoundsInParent().getWidth() + )); + indeterminateCheck.setText(String.format("C_heck Me (box size = H%.2f x W%.2f)", + normalBox.getBoundsInParent().getHeight(), + normalBox.getBoundsInParent().getWidth() + )); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/ColorPickerPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/ColorPickerPage.java new file mode 100644 index 0000000..f6fdb9d --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/ColorPickerPage.java @@ -0,0 +1,97 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.base.controls.Spacer; +import atlantafx.sampler.page.AbstractPage; +import javafx.geometry.Pos; +import javafx.scene.control.ChoiceBox; +import javafx.scene.control.ColorPicker; +import javafx.scene.control.Label; +import javafx.scene.control.Separator; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; + +public class ColorPickerPage extends AbstractPage { + + public static final String NAME = "ColorPicker"; + + @Override + public String getName() { return NAME; } + + public ColorPickerPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().setAll( + playground() + ); + } + + private VBox playground() { + var colorPicker = new ColorPicker(); + colorPicker.setValue(Color.AQUA); + + var pickerBox = new HBox( + new Spacer(), + colorPicker, + new Spacer() + ); + + var labelToggle = new ToggleSwitch("Show label"); + labelToggle.setSelected(true); + labelToggle.selectedProperty().addListener((obs, old, val) -> { + colorPicker.setStyle("-fx-color-label-visible: false;"); + if (val) { colorPicker.setStyle("-fx-color-label-visible: true;"); } + }); + + var disableToggle = new ToggleSwitch("Disable"); + colorPicker.disableProperty().bind(disableToggle.selectedProperty()); + + var pickerStyleBox = new HBox(5, new Label("Picker Style"), pickerStyleChoice(colorPicker)); + pickerStyleBox.setAlignment(Pos.CENTER); + + var controls = new HBox(20, + new Spacer(), + pickerStyleBox, + labelToggle, + disableToggle, + new Spacer() + ); + controls.setAlignment(Pos.CENTER); + + // ~ + + var root = new VBox(20); + root.setAlignment(Pos.CENTER); + root.getChildren().setAll( + pickerBox, + new Separator(), + controls + ); + + return root; + } + + private ChoiceBox pickerStyleChoice(ColorPicker colorPicker) { + var optDefault = "Default"; + var optButton = "Button"; + var optSplitButton = "Split Button"; + + var choice = new ChoiceBox(); + choice.getItems().setAll(optDefault, optButton, optSplitButton); + choice.setPrefWidth(120); + choice.getSelectionModel().selectedItemProperty().addListener((obs, old, val) -> { + if (val == null) { return; } + colorPicker.getStyleClass().removeAll(ColorPicker.STYLE_CLASS_BUTTON, ColorPicker.STYLE_CLASS_SPLIT_BUTTON); + if (optButton.equals(val)) { colorPicker.getStyleClass().add(ColorPicker.STYLE_CLASS_BUTTON); } + if (optSplitButton.equals(val)) { colorPicker.getStyleClass().add(ColorPicker.STYLE_CLASS_SPLIT_BUTTON); } + }); + choice.getSelectionModel().select(optDefault); + + return choice; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/ComboBoxPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/ComboBoxPage.java new file mode 100644 index 0000000..f1e5b14 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/ComboBoxPage.java @@ -0,0 +1,199 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.sampler.page.AbstractPage; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.geometry.HPos; +import javafx.scene.control.ChoiceBox; +import javafx.scene.control.ComboBox; +import javafx.scene.control.Label; +import javafx.scene.control.ListCell; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.Pane; +import org.kordamp.ikonli.Ikon; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static atlantafx.base.theme.Styles.STATE_DANGER; +import static atlantafx.base.theme.Styles.STATE_SUCCESS; +import static atlantafx.sampler.util.Containers.H_GROW_NEVER; +import static javafx.collections.FXCollections.observableArrayList; + +public class ComboBoxPage extends AbstractPage { + + public static final String NAME = "ComboBox"; + private static final int PREF_WIDTH = 200; + + @Override + public String getName() { return NAME; } + + public ComboBoxPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().setAll( + createGrid() + ); + } + + private Pane createGrid() { + var grid = new GridPane(); + grid.setHgap(20); + grid.setVgap(10); + grid.getColumnConstraints().setAll(H_GROW_NEVER, H_GROW_NEVER, H_GROW_NEVER); + grid.setMaxWidth((PREF_WIDTH * 3) + 100); + + var comboLabel = new Label("C_omboBox"); + comboLabel.setMnemonicParsing(true); + + comboLabel.setStyle("-fx-font-weight: bold;"); + grid.add(comboLabel, 0, 0); + + var choiceLabel = new Label("C_hoiceBox"); + choiceLabel.setMnemonicParsing(true); + + choiceLabel.setStyle("-fx-font-weight: bold;"); + grid.add(choiceLabel, 2, 0); + + // default + grid.add(comboBox(), 0, 1); + grid.add(label("empty"), 1, 1); + grid.add(choiceBox(), 2, 1); + + // editable + grid.add(comboBox(c -> { + c.setItems(createItems(5)); + c.setEditable(true); + }), 0, 2); + grid.add(label("editable"), 1, 2); + + // placeholder + grid.add(comboBox(c -> c.setPlaceholder(new Label("Loading..."))), 0, 3); + grid.add(label("placeholder"), 1, 3); + + // with icons + var badges = IntStream.range(0, 5).boxed() + .map(i -> new Badge(FAKER.hipster().word(), randomIcon())) + .collect(Collectors.toCollection(FXCollections::observableArrayList)); + var badgeCombo = new ComboBox<>(badges); + badgeCombo.setPrefWidth(PREF_WIDTH); + badgeCombo.setButtonCell(new BadgeCell()); + badgeCombo.setCellFactory(lv -> new BadgeCell()); + badgeCombo.getSelectionModel().selectFirst(); + grid.add(badgeCombo, 0, 4); + grid.add(label("graphic"), 1, 4); + + // success + grid.add(comboBox(c -> { + c.setItems(createItems(5)); + c.pseudoClassStateChanged(STATE_SUCCESS, true); + c.getSelectionModel().selectFirst(); + }), 0, 5); + grid.add(label("success"), 1, 5); + grid.add(choiceBox(c -> { + c.setItems(createItems(5)); + c.pseudoClassStateChanged(STATE_SUCCESS, true); + c.getSelectionModel().selectFirst(); + }), 2, 5); + + // negative + grid.add(comboBox(c -> { + c.setItems(createItems(5)); + c.pseudoClassStateChanged(STATE_DANGER, true); + c.getSelectionModel().selectFirst(); + }), 0, 6); + grid.add(label("success"), 1, 6); + grid.add(choiceBox(c -> { + c.setItems(createItems(5)); + c.pseudoClassStateChanged(STATE_DANGER, true); + c.getSelectionModel().selectFirst(); + }), 2, 6); + + // disabled + grid.add(comboBox(c -> c.setDisable(true)), 0, 7); + grid.add(label("disabled"), 1, 7); + grid.add(choiceBox(c -> c.setDisable(true)), 2, 7); + + // overflow + grid.add(comboBox(c -> { + c.setItems(createItems(50)); + c.getSelectionModel().selectFirst(); + }), 0, 8); + grid.add(label("large list"), 1, 8); + grid.add(choiceBox(c -> { + c.setItems(createItems(50)); + c.getSelectionModel().selectFirst(); + }), 2, 8); + + // overflow + grid.add(comboBox(c -> { + c.setItems(observableArrayList(generate(() -> FAKER.chuckNorris().fact(), 5))); + c.getSelectionModel().selectFirst(); + }), 0, 9); + grid.add(label("wide text"), 1, 9); + grid.add(choiceBox(c -> { + c.setItems(observableArrayList(generate(() -> FAKER.chuckNorris().fact(), 5))); + c.getSelectionModel().selectFirst(); + }), 2, 9); + + return grid; + } + + private ObservableList createItems(int count) { + return observableArrayList(generate(() -> FAKER.hipster().word(), count)); + } + + private Label label(String text) { + return new Label(text) {{ + GridPane.setHalignment(this, HPos.CENTER); + }}; + } + + private ComboBox comboBox() { + return comboBox(null); + } + + private ComboBox comboBox(Consumer> mutator) { + var c = new ComboBox(); + c.setPrefWidth(PREF_WIDTH); + if (mutator != null) { mutator.accept(c); } + return c; + } + + private ChoiceBox choiceBox() { + return choiceBox(null); + } + + private ChoiceBox choiceBox(Consumer> mutator) { + var c = new ChoiceBox(); + c.setPrefWidth(PREF_WIDTH); + if (mutator != null) { mutator.accept(c); } + return c; + } + + /////////////////////////////////////////////////////////////////////////// + + private record Badge(String text, Ikon icon) { } + + private static class BadgeCell extends ListCell { + + @Override + protected void updateItem(Badge item, boolean isEmpty) { + super.updateItem(item, isEmpty); + + if (isEmpty) { + setGraphic(null); + setText(null); + } else { + setGraphic(new FontIcon(item.icon())); + setText(item.text()); + } + } + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/CustomTextFieldPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/CustomTextFieldPage.java new file mode 100644 index 0000000..b0e739d --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/CustomTextFieldPage.java @@ -0,0 +1,71 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.CustomTextField; +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.scene.layout.FlowPane; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; + +import static atlantafx.base.theme.Styles.STATE_DANGER; +import static atlantafx.base.theme.Styles.STATE_SUCCESS; + +public class CustomTextFieldPage extends AbstractPage { + + public static final String NAME = "CustomTextField"; + + @Override + public String getName() { return NAME; } + + public CustomTextFieldPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().setAll(samples()); + } + + private FlowPane samples() { + var leftIconField = new CustomTextField(); + leftIconField.setPromptText("Prompt text"); + leftIconField.setRight(new FontIcon(Feather.X)); + var leftIconBlock = new SampleBlock("Node on the left", leftIconField); + + var rightIconField = new CustomTextField(); + rightIconField.setPromptText("Prompt text"); + rightIconField.setLeft(new FontIcon(Feather.MAP_PIN)); + var rightIconBlock = new SampleBlock("Node on the right", rightIconField); + + var bothIconField = new CustomTextField("Text"); + bothIconField.setLeft(new FontIcon(Feather.MAP_PIN)); + bothIconField.setRight(new FontIcon(Feather.X)); + var bothIconBlock = new SampleBlock("Nodes on both sides", bothIconField); + + var noSideIconsField = new CustomTextField("Text"); + var noSideIconsBlock = new SampleBlock("No side nodes", noSideIconsField); + + var successField = new CustomTextField("Text"); + successField.pseudoClassStateChanged(STATE_SUCCESS, true); + successField.setRight(new FontIcon(Feather.X)); + var successBlock = new SampleBlock("Success", successField); + + var dangerField = new CustomTextField("Text"); + dangerField.pseudoClassStateChanged(STATE_DANGER, true); + dangerField.setLeft(new FontIcon(Feather.MAP_PIN)); + var dangerBlock = new SampleBlock("Danger", dangerField); + + var flowPane = new FlowPane(20, 20); + flowPane.getChildren().setAll( + leftIconBlock.getRoot(), + rightIconBlock.getRoot(), + bothIconBlock.getRoot(), + noSideIconsBlock.getRoot(), + successBlock.getRoot(), + dangerBlock.getRoot() + ); + + return flowPane; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/DatePickerPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/DatePickerPage.java new file mode 100644 index 0000000..84af97a --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/DatePickerPage.java @@ -0,0 +1,175 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.InlineDatePicker; +import atlantafx.base.controls.Spacer; +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.base.theme.Styles; +import atlantafx.sampler.page.AbstractPage; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.geometry.Pos; +import javafx.scene.control.DateCell; +import javafx.scene.control.DatePicker; +import javafx.scene.control.Label; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.VBox; +import javafx.util.Callback; +import javafx.util.StringConverter; + +import java.time.LocalDate; +import java.time.chrono.HijrahChronology; +import java.time.format.DateTimeFormatter; + +import static javafx.scene.layout.GridPane.REMAINING; + +public class DatePickerPage extends AbstractPage { + + public static final String NAME = "DatePicker"; + private static final LocalDate TODAY = LocalDate.now(); + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ISO_DATE; + private static final String DATE_FORMATTER_PROMPT = "yyyy-MM-dd"; + private static final int INLINE_DATE_PICKER_COL = 0; + private static final int INLINE_DATE_PICKER_ROW = 4; + + @Override + public String getName() { return NAME; } + + private final BooleanProperty weekNumProperty = new SimpleBooleanProperty(); + private final BooleanProperty editableProperty = new SimpleBooleanProperty(); + private final BooleanProperty offPastDatesProperty = new SimpleBooleanProperty(); + private final BooleanProperty disableProperty = new SimpleBooleanProperty(); + + public DatePickerPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().addAll(playground()); + } + + private GridPane playground() { + var playground = new GridPane(); + playground.setHgap(40); + playground.setVgap(10); + + final var popupDatePicker = popupDatePicker(); + final var inlineDatePicker = inlineDatePicker(null); + + var inlineValue = new Label(); + inlineValue.setAlignment(Pos.CENTER); + inlineValue.setMaxWidth(Double.MAX_VALUE); + inlineValue.textProperty().bind(inlineDatePicker.valueProperty().asString()); + + // == CONTROLS == + + var weekNumToggle = new ToggleSwitch("Week numbers"); + weekNumProperty.bind(weekNumToggle.selectedProperty()); + weekNumToggle.setSelected(true); + + var chronologyToggle = new ToggleSwitch("Second chronology"); + chronologyToggle.selectedProperty().addListener((obs, old, val) -> + popupDatePicker.setChronology(val ? HijrahChronology.INSTANCE : null) + ); + + var editableToggle = new ToggleSwitch("Editable"); + editableProperty.bind(editableToggle.selectedProperty()); + // clear selected value to demonstrate prompt text + editableProperty.addListener((obs, old, val) -> popupDatePicker.setValue(val ? null : TODAY)); + + var offPastDatesToggle = new ToggleSwitch("No past dates"); + offPastDatesProperty.bind(offPastDatesToggle.selectedProperty()); + offPastDatesProperty.addListener((obs, old, val) -> { + popupDatePicker.setDayCellFactory(val ? dp -> new CustomDateCell() : null); + popupDatePicker.setValue(TODAY); + + // we have to create new date picker, because changing cell factory won't update existing cells + var datePicker = inlineDatePicker(val ? dp -> new CustomDateCell() : null); + playground.getChildren().removeIf(n -> n instanceof InlineDatePicker); + playground.add(datePicker, INLINE_DATE_PICKER_COL, INLINE_DATE_PICKER_ROW); + inlineValue.textProperty().unbind(); + inlineValue.textProperty().bind(datePicker.valueProperty().asString()); + }); + + var disablePickerToggle = new ToggleSwitch("Disable"); + disableProperty.bind(disablePickerToggle.selectedProperty()); + + var controls = new VBox(10, + weekNumToggle, + chronologyToggle, + editableToggle, + offPastDatesToggle, + disablePickerToggle + ); + controls.setAlignment(Pos.CENTER_RIGHT); + + // == GRID == + var defaultLabel = new Label("Default"); + defaultLabel.getStyleClass().add(Styles.TEXT_BOLD); + + var inlineLabel = new Label("Inline"); + inlineLabel.getStyleClass().add(Styles.TEXT_BOLD); + + playground.add(defaultLabel, 0, 0); + playground.add(popupDatePicker, 0, 1); + playground.add(new Spacer(20), 0, 2); + playground.add(inlineLabel, 0, 3); + playground.add(inlineDatePicker, INLINE_DATE_PICKER_COL, INLINE_DATE_PICKER_ROW); + playground.add(inlineValue, 0, 5); + playground.add(controls, 1, 0, 1, REMAINING); + + return playground; + } + + private DatePicker popupDatePicker() { + var datePicker = new DatePicker(); + datePicker.setConverter(DATE_CONVERTER); + datePicker.setPromptText(DATE_FORMATTER_PROMPT); + datePicker.setMaxWidth(Double.MAX_VALUE); + datePicker.setValue(TODAY); + datePicker.showWeekNumbersProperty().bind(weekNumProperty); + datePicker.editableProperty().bind(editableProperty); + datePicker.disableProperty().bind(disableProperty); + + return datePicker; + } + + private InlineDatePicker inlineDatePicker(Callback dayCellFactory) { + var datePicker = new InlineDatePicker(); + datePicker.setMaxSize(USE_PREF_SIZE, USE_PREF_SIZE); + datePicker.setDayCellFactory(dayCellFactory); + datePicker.setValue(TODAY); + datePicker.showWeekNumbersProperty().bind(weekNumProperty); + datePicker.disableProperty().bind(disableProperty); + + return datePicker; + } + + /////////////////////////////////////////////////////////////////////////// + + private static final StringConverter DATE_CONVERTER = new StringConverter<>() { + + @Override + public String toString(LocalDate localDate) { + if (localDate == null) { return ""; } + return DATE_FORMATTER.format(localDate); + } + + @Override + public LocalDate fromString(String dateString) { + if (dateString == null || dateString.trim().isEmpty()) { return null; } + try { + return LocalDate.parse(dateString, DATE_FORMATTER); + } catch (Exception e) { return null; } + } + }; + + private static class CustomDateCell extends DateCell { + + public void updateItem(LocalDate date, boolean empty) { + super.updateItem(date, empty); + setDisable(empty || date.compareTo(TODAY) < 0); + } + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/DialogPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/DialogPage.java new file mode 100644 index 0000000..dfc3086 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/DialogPage.java @@ -0,0 +1,230 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.base.controls.Spacer; +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.geometry.Orientation; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; +import javafx.stage.StageStyle; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; + +import static javafx.scene.control.Alert.AlertType; +import static javafx.scene.control.ButtonBar.ButtonData; + +public class DialogPage extends AbstractPage { + + public static final String NAME = "Dialog"; + + @Override + public String getName() { return NAME; } + + private final BooleanProperty showHeaderProperty = new SimpleBooleanProperty(true); + private final BooleanProperty minDecorationsProperty = new SimpleBooleanProperty(true); + + public DialogPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().setAll(playground()); + } + + private VBox playground() { + var showHeaderToggle = new ToggleSwitch("Show header"); + showHeaderProperty.bind(showHeaderToggle.selectedProperty()); + showHeaderToggle.setSelected(true); + + var minDecorationsToggle = new ToggleSwitch("Minimum decorations"); + minDecorationsProperty.bind(minDecorationsToggle.selectedProperty()); + minDecorationsToggle.setSelected(true); + + var controls = new HBox(20, new Spacer(), showHeaderToggle, minDecorationsToggle, new Spacer()); + controls.setAlignment(Pos.CENTER); + + // ~ + + var row1 = new HBox(40, infoDialogButton().getRoot(), warnDialogButton().getRoot(), errorDialogButton().getRoot()); + + var row2 = new HBox(40, exceptionDialogButton().getRoot(), confirmationDialogButton().getRoot(), textInputDialogButton().getRoot(), choiceDialogButton().getRoot()); + + var playground = new VBox(20); + playground.setMinHeight(100); + playground.getChildren().setAll(controls, new Separator(Orientation.HORIZONTAL), row1, row2); + + return playground; + } + + private SampleBlock infoDialogButton() { + var button = new Button("Click"); + button.setGraphic(new FontIcon(Feather.INFO)); + button.setOnAction(e -> { + var alert = new Alert(AlertType.INFORMATION); + alert.setTitle("Information Dialog"); + alert.setHeaderText(randomHeader()); + alert.setContentText(FAKER.lorem().paragraph(3)); + alert.initOwner(getScene().getWindow()); + alert.initStyle(getModality()); + alert.showAndWait(); + }); + + return new SampleBlock("Information", button); + } + + private SampleBlock warnDialogButton() { + var button = new Button("Click"); + button.setGraphic(new FontIcon(Feather.ALERT_TRIANGLE)); + button.setOnAction(e -> { + var alert = new Alert(AlertType.WARNING); + alert.setTitle("Warning Dialog"); + alert.setHeaderText(randomHeader()); + alert.setContentText(FAKER.lorem().paragraph(3)); + alert.initOwner(getScene().getWindow()); + alert.initStyle(getModality()); + alert.showAndWait(); + }); + + return new SampleBlock("Warning", button); + } + + private SampleBlock errorDialogButton() { + var button = new Button("Click"); + button.setGraphic(new FontIcon(Feather.X_CIRCLE)); + button.setOnAction(e -> { + var alert = new Alert(AlertType.ERROR); + alert.setTitle("Error Dialog"); + alert.setHeaderText(randomHeader()); + alert.setContentText(FAKER.lorem().paragraph(3)); + alert.initOwner(getScene().getWindow()); + alert.initStyle(getModality()); + alert.showAndWait(); + }); + + return new SampleBlock("Error", button); + } + + private SampleBlock exceptionDialogButton() { + var button = new Button("Click"); + button.setGraphic(new FontIcon(Feather.MEH)); + + button.setOnAction(e -> { + var alert = new Alert(AlertType.ERROR); + alert.setTitle("Error Dialog"); + alert.setHeaderText(randomHeader()); + alert.setContentText(FAKER.lorem().paragraph(3)); + + var exception = new RuntimeException(FAKER.chuckNorris().fact()); + + var stringWriter = new StringWriter(); + var printWriter = new PrintWriter(stringWriter); + exception.printStackTrace(printWriter); + + var label = new Label("Full stacktrace:"); + + var textArea = new TextArea(stringWriter.toString()); + textArea.setEditable(false); + textArea.setWrapText(false); + textArea.setMaxWidth(Double.MAX_VALUE); + textArea.setMaxHeight(Double.MAX_VALUE); + GridPane.setVgrow(textArea, Priority.ALWAYS); + GridPane.setHgrow(textArea, Priority.ALWAYS); + + var content = new GridPane(); + content.setMaxWidth(Double.MAX_VALUE); + content.add(label, 0, 0); + content.add(textArea, 0, 1); + + alert.getDialogPane().setExpandableContent(content); + alert.initOwner(getScene().getWindow()); + alert.initStyle(getModality()); + alert.showAndWait(); + }); + + return new SampleBlock("Exception", button); + } + + private SampleBlock confirmationDialogButton() { + var button = new Button("Click"); + button.setGraphic(new FontIcon(Feather.CHECK_SQUARE)); + + button.setOnAction(e -> { + var alert = new Alert(AlertType.CONFIRMATION); + alert.setTitle("Confirmation Dialog"); + alert.setHeaderText(randomHeader()); + alert.setContentText(FAKER.lorem().paragraph(3)); + + ButtonType yesBtn = new ButtonType("Yes", ButtonData.YES); + ButtonType noBtn = new ButtonType("No", ButtonData.NO); + ButtonType cancelBtn = new ButtonType("Cancel", ButtonData.CANCEL_CLOSE); + + alert.getButtonTypes().setAll(yesBtn, noBtn, cancelBtn); + + alert.initOwner(getScene().getWindow()); + alert.initStyle(getModality()); + alert.showAndWait(); + }); + + return new SampleBlock("Confirmation", button); + } + + private SampleBlock textInputDialogButton() { + var button = new Button("Click"); + button.setGraphic(new FontIcon(Feather.EDIT_2)); + + button.setOnAction(e -> { + var dialog = new TextInputDialog(); + dialog.setTitle("Text Input Dialog"); + dialog.setHeaderText(randomHeader()); + dialog.setContentText("Enter your name:"); + dialog.initOwner(getScene().getWindow()); + dialog.initStyle(getModality()); + dialog.showAndWait(); + }); + + return new SampleBlock("Text Input", button); + } + + private SampleBlock choiceDialogButton() { + var button = new Button("Click"); + button.setGraphic(new FontIcon(Feather.LIST)); + + button.setOnAction(e -> { + var choices = new ArrayList<>(); + choices.add("A"); + choices.add("B"); + choices.add("C"); + + var dialog = new ChoiceDialog<>(choices.get(0), choices); + dialog.setTitle("Choice Dialog"); + dialog.setHeaderText(randomHeader()); + dialog.setContentText("Choose your letter:"); + dialog.initOwner(getScene().getWindow()); + dialog.initStyle(getModality()); + dialog.showAndWait(); + }); + + return new SampleBlock("Choice", button); + } + + private String randomHeader() { + return showHeaderProperty.get() ? FAKER.chuckNorris().fact() : null; + } + + private StageStyle getModality() { + return minDecorationsProperty.get() ? StageStyle.UTILITY : StageStyle.DECORATED; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/HTMLEditorPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/HTMLEditorPage.java new file mode 100644 index 0000000..5536105 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/HTMLEditorPage.java @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.sampler.page.AbstractPage; +import javafx.scene.web.HTMLEditor; + +public class HTMLEditorPage extends AbstractPage { + + public static final String NAME = "HTMLEditor"; + + public HTMLEditorPage() { + super(); + createView(); + } + + private void createView() { + var editor = new HTMLEditor(); + editor.setPrefHeight(400); + editor.setHtmlText(String.join("

", FAKER.lorem().paragraphs(5))); + + userContent.getChildren().setAll(editor); + } + + @Override + public String getName() { + return NAME; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/InputGroupPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/InputGroupPage.java new file mode 100755 index 0000000..c50a899 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/InputGroupPage.java @@ -0,0 +1,104 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.theme.Styles; +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.HBox; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; + +import static atlantafx.base.theme.Styles.BUTTON_ICON; + +public class InputGroupPage extends AbstractPage { + + public static final String NAME = "Input Group"; + + @Override + public String getName() { return NAME; } + + public InputGroupPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().addAll(new FlowPane( + 20, 20, + httpMethodSample().getRoot(), + passwordSample().getRoot(), + networkSample().getRoot(), + dropdownSample().getRoot() + )); + } + + private SampleBlock httpMethodSample() { + var leftCombo = new ComboBox<>(); + leftCombo.getItems().addAll("POST", "GET", "PUT", "PATCH", "DELETE"); + leftCombo.getStyleClass().add(Styles.LEFT_PILL); + leftCombo.getSelectionModel().selectFirst(); + + var rightText = new TextField("https://example.org"); + rightText.getStyleClass().add(Styles.RIGHT_PILL); + + var box = new HBox(leftCombo, rightText); + box.setAlignment(Pos.CENTER_LEFT); + + return new SampleBlock("ComboBox + TextField", box); + } + + private SampleBlock passwordSample() { + var leftPassword = new PasswordField(); + leftPassword.setText(FAKER.internet().password()); + leftPassword.getStyleClass().add(Styles.LEFT_PILL); + + var rightBtn = new Button("", new FontIcon(Feather.REFRESH_CW)); + rightBtn.getStyleClass().addAll(BUTTON_ICON); + rightBtn.setOnAction(e -> leftPassword.setText(FAKER.internet().password())); + rightBtn.getStyleClass().add(Styles.RIGHT_PILL); + + var box = new HBox(leftPassword, rightBtn); + box.setAlignment(Pos.CENTER_LEFT); + + return new SampleBlock("Password Field + Button", box); + } + + private SampleBlock networkSample() { + var leftText = new TextField("192.168.1.10"); + leftText.getStyleClass().add(Styles.LEFT_PILL); + + var centerText = new TextField("24"); + centerText.getStyleClass().add(Styles.CENTER_PILL); + centerText.setPrefWidth(50); + + var rightText = new TextField("192.168.1.10"); + rightText.getStyleClass().add(Styles.RIGHT_PILL); + + var box = new HBox(leftText, centerText, rightText); + box.setAlignment(Pos.CENTER_LEFT); + + return new SampleBlock("Text Fields", box); + } + + private SampleBlock dropdownSample() { + var leftMenu = new MenuButton(FAKER.harryPotter().character()); + leftMenu.getItems().addAll( + new MenuItem(FAKER.harryPotter().spell()), + new MenuItem(FAKER.harryPotter().spell()), + new MenuItem(FAKER.harryPotter().spell()) + ); + leftMenu.getStyleClass().add(Styles.LEFT_PILL); + + var rightText = new TextField(); + rightText.getStyleClass().add(Styles.RIGHT_PILL); + + var box = new HBox(leftMenu, rightText); + box.setAlignment(Pos.CENTER_LEFT); + + return new SampleBlock("MenuButton + TextField", box); + } +} + diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/ListPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/ListPage.java new file mode 100644 index 0000000..b35b5d8 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/ListPage.java @@ -0,0 +1,299 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.Spacer; +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.sampler.fake.domain.Book; +import atlantafx.sampler.page.AbstractPage; +import javafx.geometry.Orientation; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.control.cell.CheckBoxListCell; +import javafx.scene.control.cell.ChoiceBoxListCell; +import javafx.scene.control.cell.ComboBoxListCell; +import javafx.scene.control.cell.TextFieldListCell; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.util.StringConverter; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import static atlantafx.base.theme.Styles.*; + +public class ListPage extends AbstractPage { + + public static final String NAME = "ListView"; + + @Override + public String getName() { return NAME; } + + private VBox playground; + private ComboBox exampleSelect; + + private final List dataList = generate(() -> Book.random(FAKER), 50); + private final StringConverter bookStringConverter = new StringConverter<>() { + + @Override + public String toString(Book book) { + if (book == null) { return null; } + return String.format("\"%s\" by %s", book.getTitle(), book.getAuthor()); + } + + @Override + public Book fromString(String s) { + if (s == null) { return null; } + + int sep = s.indexOf("\" by"); + String title = s.substring(1, sep); + String author = s.substring(sep + "\" by".length()); + + return dataList.stream() + .filter(b -> Objects.equals(b.getTitle(), title) && Objects.equals(b.getAuthor(), author)) + .findFirst() + .orElse(null); + } + }; + + public ListPage() { + super(); + createView(); + } + + private void createView() { + exampleSelect = exampleSelect(); + playground = playground(exampleSelect); + userContent.getChildren().setAll(playground); + } + + @Override + protected void onRendered() { + super.onRendered(); + exampleSelect.getSelectionModel().selectFirst(); + } + + private VBox playground(ComboBox exampleSelect) { + var playground = new VBox(10); + playground.setMinHeight(100); + + var borderedToggle = new ToggleSwitch("Bordered"); + borderedToggle.selectedProperty().addListener((obs, old, value) -> toggleListProperty(lv -> toggleStyleClass(lv, BORDERED))); + + var denseToggle = new ToggleSwitch("Dense"); + denseToggle.selectedProperty().addListener((obs, old, value) -> toggleListProperty(lv -> toggleStyleClass(lv, DENSE))); + + var stripedToggle = new ToggleSwitch("Striped"); + stripedToggle.selectedProperty().addListener((obs, old, value) -> toggleListProperty(lv -> toggleStyleClass(lv, STRIPED))); + + var disableToggle = new ToggleSwitch("Disable"); + disableToggle.selectedProperty().addListener((obs, old, val) -> findDisplayedList().ifPresent(lv -> { + if (val != null) { lv.setDisable(val); } + })); + + var controls = new HBox(20, + new Spacer(), + borderedToggle, + denseToggle, + stripedToggle, + disableToggle, + new Spacer() + ); + + playground.getChildren().setAll( + new Label("Select an example:"), + exampleSelect, + new Spacer(Orientation.VERTICAL), // placeholder for ListView + controls + ); + + return playground; + } + + private ComboBox exampleSelect() { + var select = new ComboBox(); + + select.setMaxWidth(Double.MAX_VALUE); + select.getItems().setAll(Example.values()); + + select.getSelectionModel().selectedItemProperty().addListener((obs, old, val) -> { + if (val == null) { return; } + if (playground.getChildren().size() != 4) { + throw new RuntimeException("Unexpected container size."); + } + + ListView newList = createList(val); + + // copy existing style classes and properties to the new list + findDisplayedList().ifPresent(lv -> { + List currentStyles = lv.getStyleClass(); + currentStyles.remove("list-view"); + newList.getStyleClass().addAll(currentStyles); + + newList.setDisable(lv.isDisable()); + }); + + playground.getChildren().set(2, newList); + }); + + select.setConverter(new StringConverter<>() { + + @Override + public String toString(Example example) { + return example == null ? "" : example.getName(); + } + + @Override + public Example fromString(String s) { + return Example.find(s); + } + }); + + return select; + } + + private Optional> findDisplayedList() { + if (playground == null) { return Optional.empty(); } + return playground.getChildren().stream() + .filter(c -> c instanceof ListView) + .findFirst() + .map(c -> (ListView) c); + } + + private void toggleListProperty(Consumer> consumer) { + findDisplayedList().ifPresent(lv -> { + if (consumer != null) { consumer.accept(lv); } + }); + } + + private ListView createList(Example example) { + switch (example) { + case TEXT -> { return stringList(); } + case EDITABLE -> { return editableList(); } + case CHECK_BOX -> { return checkBoxList(); } + case CHOICE_BOX -> { return choiceBoxList(); } + case COMBO_BOX -> { return comboBoxList(); } + case NESTED_CONTROLS -> { return nestedControlsList(); } + default -> throw new IllegalArgumentException("Unexpected enum value: " + example); + } + } + + private ListView stringList() { + var lv = new ListView(); + lv.getItems().setAll(dataList.stream().map(bookStringConverter::toString).collect(Collectors.toList())); + return lv; + } + + private ListView editableList() { + var lv = new ListView(); + lv.setEditable(true); + lv.setCellFactory(TextFieldListCell.forListView()); + lv.getItems().setAll( + // small size to see the empty cells + dataList.stream().limit(5).map(bookStringConverter::toString).collect(Collectors.toList()) + ); + return lv; + } + + private ListView checkBoxList() { + var lv = new ListView(); + lv.setCellFactory(CheckBoxListCell.forListView(Book::stateProperty, bookStringConverter)); + lv.getItems().setAll(dataList.stream().limit(10).collect(Collectors.toList())); + return lv; + } + + private ListView choiceBoxList() { + var lv = new ListView(); + lv.setEditable(true); + lv.setCellFactory(ChoiceBoxListCell.forListView(bookStringConverter, dataList.subList(0, 10).toArray(Book[]::new))); + lv.getItems().setAll(dataList.stream().limit(10).collect(Collectors.toList())); + return lv; + } + + private ListView comboBoxList() { + var lv = new ListView(); + lv.setEditable(true); + lv.setCellFactory(ComboBoxListCell.forListView(bookStringConverter, dataList.subList(0, 10).toArray(Book[]::new))); + lv.getItems().setAll(dataList.stream().limit(10).collect(Collectors.toList())); + return lv; + } + + private ListView nestedControlsList() { + var lv = new ListView(); + lv.setCellFactory(book -> new NestedControlsListCell()); + lv.getItems().setAll(dataList.stream().limit(10).collect(Collectors.toList())); + return lv; + } + + /////////////////////////////////////////////////////////////////////////// + + private enum Example { + TEXT("Text"), + EDITABLE("TextFieldListCell"), + CHECK_BOX("CheckBoxListCell"), + CHOICE_BOX("ChoiceBoxListCell"), + COMBO_BOX("ComboBoxListCell"), + NESTED_CONTROLS("Nested controls"); + + private final String name; + + Example(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public static Example find(String name) { + return Arrays.stream(Example.values()) + .filter(example -> Objects.equals(example.getName(), name)) + .findFirst() + .orElse(null); + } + } + + private static class NestedControlsListCell extends ListCell { + + private final HBox root; + private final Label titleLabel; + private final Hyperlink authorLink; + + public NestedControlsListCell() { + titleLabel = new Label(); + authorLink = new Hyperlink(); + + var purchaseBtn = new Button("Purchase"); + purchaseBtn.getStyleClass().addAll(ACCENT); + purchaseBtn.setGraphic(new FontIcon(Feather.SHOPPING_CART)); + + root = new HBox(5, + titleLabel, + new Label(" by"), + authorLink, + new Spacer(), + purchaseBtn + ); + root.setAlignment(Pos.CENTER_LEFT); + } + + @Override + public void updateItem(Book book, boolean empty) { + super.updateItem(book, empty); + + if (empty) { + setGraphic(null); + return; + } + + titleLabel.setText("\"" + book.getTitle() + "\""); + authorLink.setText(book.getAuthor()); + setGraphic(root); + } + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/MenuButtonPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/MenuButtonPage.java new file mode 100755 index 0000000..178e35f --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/MenuButtonPage.java @@ -0,0 +1,243 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.geometry.Side; +import javafx.scene.control.MenuButton; +import javafx.scene.control.MenuItem; +import javafx.scene.control.SplitMenuButton; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.HBox; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.stream.IntStream; + +import static atlantafx.base.theme.Styles.*; + +public class MenuButtonPage extends AbstractPage { + + public static final String NAME = "MenuButton"; + + @Override + public String getName() { return NAME; } + + public MenuButtonPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().addAll( + basicSample().getRoot(), + coloredSample().getRoot(), + popupSideSample().getRoot(), + iconOnlySample().getRoot(), + outlinedSample().getRoot(), + disabledSample().getRoot() + ); + } + + private SampleBlock basicSample() { + var basicMenuBtn = new MenuButton("_Menu Button"); + basicMenuBtn.getItems().setAll(menuItems(5)); + basicMenuBtn.setMnemonicParsing(true); + basicMenuBtn.setOnAction(PRINT_SOURCE); + + var basicSplitBtn = new SplitMenuButton(menuItems(5)); + basicSplitBtn.setText("_Split Menu Button"); + basicSplitBtn.setMnemonicParsing(true); + basicSplitBtn.setOnAction(PRINT_SOURCE); + + var flatMenuBtn = new MenuButton("Flat"); + flatMenuBtn.getItems().setAll(menuItems(5)); + flatMenuBtn.getStyleClass().add(FLAT); + + var flatSplitBtn = new SplitMenuButton(menuItems(5)); + flatSplitBtn.setText("Flat"); + flatSplitBtn.getStyleClass().add(FLAT); + + var content = new HBox(10); + content.getChildren().addAll(basicMenuBtn, basicSplitBtn, flatMenuBtn, flatSplitBtn); + + return new SampleBlock("Basic", content); + } + + private SampleBlock coloredSample() { + var accentMenuBtn = new MenuButton("_Accent"); + accentMenuBtn.getItems().setAll(menuItems(5)); + accentMenuBtn.getStyleClass().add(ACCENT); + accentMenuBtn.setMnemonicParsing(true); + accentMenuBtn.setOnAction(PRINT_SOURCE); + + var accentSplitBtn = new SplitMenuButton(menuItems(5)); + accentSplitBtn.setText("Accent"); + accentSplitBtn.getStyleClass().add(ACCENT); + + var successMenuBtn = new MenuButton("Success"); + successMenuBtn.getItems().setAll(menuItems(5)); + successMenuBtn.setGraphic(new FontIcon(Feather.CHECK)); + successMenuBtn.getStyleClass().add(SUCCESS); + + var successSplitBtn = new SplitMenuButton(menuItems(5)); + successMenuBtn.setGraphic(new FontIcon(Feather.CHECK)); + successSplitBtn.setText("_Success"); + successSplitBtn.getStyleClass().add(SUCCESS); + successSplitBtn.setMnemonicParsing(true); + successSplitBtn.setOnAction(PRINT_SOURCE); + + var dangerMenuBtn = new MenuButton("Danger"); + dangerMenuBtn.setGraphic(new FontIcon(Feather.TRASH)); + dangerMenuBtn.getItems().setAll(menuItems(5)); + dangerMenuBtn.getStyleClass().add(DANGER); + + var dangerSplitBtn = new SplitMenuButton(menuItems(5)); + dangerSplitBtn.setGraphic(new FontIcon(Feather.TRASH)); + dangerSplitBtn.setText("_Danger"); + dangerSplitBtn.getStyleClass().add(DANGER); + dangerSplitBtn.setMnemonicParsing(true); + dangerSplitBtn.setOnAction(PRINT_SOURCE); + + var content = new HBox(10); + content.getChildren().addAll( + accentMenuBtn, accentSplitBtn, + successMenuBtn, successSplitBtn, + dangerMenuBtn, dangerSplitBtn + ); + + return new SampleBlock("Colored", content); + } + + private SampleBlock popupSideSample() { + var topMenuBtn = new MenuButton("Top"); + topMenuBtn.getItems().setAll(menuItems(5)); + topMenuBtn.setPopupSide(Side.TOP); + + var rightMenuBtn = new MenuButton("Right"); + rightMenuBtn.getItems().setAll(menuItems(5)); + rightMenuBtn.setPopupSide(Side.RIGHT); + rightMenuBtn.getStyleClass().add(ACCENT); + + var bottomMenuBtn = new MenuButton("Bottom"); + bottomMenuBtn.setGraphic(new FontIcon(Feather.CHECK)); + bottomMenuBtn.getItems().setAll(menuItems(5)); + bottomMenuBtn.setPopupSide(Side.BOTTOM); + bottomMenuBtn.getStyleClass().add(SUCCESS); + + var leftMenuBtn = new MenuButton("Left"); + leftMenuBtn.setGraphic(new FontIcon(Feather.TRASH)); + leftMenuBtn.getItems().setAll(menuItems(5)); + leftMenuBtn.setPopupSide(Side.LEFT); + leftMenuBtn.getStyleClass().add(DANGER); + + var content = new FlowPane(10, 10); + content.getChildren().addAll(topMenuBtn, rightMenuBtn, bottomMenuBtn, leftMenuBtn); + + return new SampleBlock("Popup Side", content); + } + + private SampleBlock iconOnlySample() { + var basicMenuBtn = new MenuButton(); + basicMenuBtn.setGraphic(new FontIcon(Feather.MORE_HORIZONTAL)); + basicMenuBtn.getItems().setAll(menuItems(5)); + basicMenuBtn.getStyleClass().addAll(BUTTON_ICON); + + var basicSplitBtn = new SplitMenuButton(menuItems(5)); + basicSplitBtn.setGraphic(new FontIcon(Feather.MORE_HORIZONTAL)); + basicSplitBtn.getStyleClass().addAll(BUTTON_ICON); + + var accentMenuBtn = new MenuButton(); + accentMenuBtn.setGraphic(new FontIcon(Feather.MENU)); + accentMenuBtn.getItems().setAll(menuItems(5)); + accentMenuBtn.getStyleClass().addAll(BUTTON_ICON, ACCENT); + + var accentSplitBtn = new SplitMenuButton(menuItems(5)); + accentSplitBtn.setGraphic(new FontIcon(Feather.MENU)); + accentSplitBtn.getStyleClass().addAll(BUTTON_ICON, ACCENT); + + var content = new FlowPane(10, 10); + content.getChildren().addAll(basicMenuBtn, basicSplitBtn, accentMenuBtn, accentSplitBtn); + + return new SampleBlock("Icons", content); + } + + private SampleBlock outlinedSample() { + var accentMenuBtn = new MenuButton("Accen_t"); + accentMenuBtn.getItems().setAll(menuItems(5)); + accentMenuBtn.getStyleClass().addAll(BUTTON_OUTLINED, ACCENT); + accentMenuBtn.setMnemonicParsing(true); + accentMenuBtn.setOnAction(PRINT_SOURCE); + + var accentSplitBtn = new SplitMenuButton(menuItems(5)); + accentSplitBtn.setText("Accent"); + accentSplitBtn.getStyleClass().addAll(BUTTON_OUTLINED, ACCENT); + + var successMenuBtn = new MenuButton("S_uccess"); + successMenuBtn.getItems().setAll(menuItems(5)); + successMenuBtn.setGraphic(new FontIcon(Feather.CHECK)); + successMenuBtn.getStyleClass().addAll(BUTTON_OUTLINED, SUCCESS); + successMenuBtn.setMnemonicParsing(true); + successMenuBtn.setOnAction(PRINT_SOURCE); + + var successSplitBtn = new SplitMenuButton(menuItems(5)); + successMenuBtn.setGraphic(new FontIcon(Feather.CHECK)); + successSplitBtn.setText("Success"); + successSplitBtn.getStyleClass().addAll(BUTTON_OUTLINED, SUCCESS); + + var dangerMenuBtn = new MenuButton("Danger"); + dangerMenuBtn.setGraphic(new FontIcon(Feather.TRASH)); + dangerMenuBtn.getItems().setAll(menuItems(5)); + dangerMenuBtn.getStyleClass().addAll(BUTTON_OUTLINED, DANGER); + + var dangerSplitBtn = new SplitMenuButton(menuItems(5)); + dangerSplitBtn.setGraphic(new FontIcon(Feather.TRASH)); + dangerSplitBtn.setText("Dan_ger"); + dangerSplitBtn.getStyleClass().addAll(BUTTON_OUTLINED, DANGER); + dangerSplitBtn.setMnemonicParsing(true); + dangerSplitBtn.setOnAction(PRINT_SOURCE); + + var content = new HBox(10); + content.getChildren().addAll( + accentMenuBtn, accentSplitBtn, + successMenuBtn, successSplitBtn, + dangerMenuBtn, dangerSplitBtn + ); + + return new SampleBlock("Outlined", content); + } + + private SampleBlock disabledSample() { + var basicMenuBtn = new MenuButton("Menu Button"); + basicMenuBtn.getItems().setAll(menuItems(5)); + basicMenuBtn.setDisable(true); + + var accentSplitBtn = new SplitMenuButton(); + accentSplitBtn.setText("Accent"); + accentSplitBtn.getItems().setAll(menuItems(5)); + accentSplitBtn.getStyleClass().addAll(ACCENT); + accentSplitBtn.setDisable(true); + + var flatMenuBtn = new MenuButton("Flat"); + flatMenuBtn.getItems().setAll(menuItems(5)); + flatMenuBtn.getStyleClass().addAll(FLAT); + flatMenuBtn.setDisable(true); + + var iconMenuBtn = new MenuButton(); + iconMenuBtn.getItems().setAll(menuItems(5)); + iconMenuBtn.getStyleClass().addAll(BUTTON_ICON); + iconMenuBtn.setDisable(true); + + var sample = new HBox(10); + sample.getChildren().addAll(basicMenuBtn, accentSplitBtn, flatMenuBtn, iconMenuBtn); + + return new SampleBlock("Disabled", sample); + } + + @SuppressWarnings("SameParameterValue") + private MenuItem[] menuItems(int count) { + return IntStream.range(0, count) + .mapToObj(i -> new MenuItem(FAKER.babylon5().character())) + .toArray(MenuItem[]::new); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/MenuPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/MenuPage.java new file mode 100644 index 0000000..05d7a39 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/MenuPage.java @@ -0,0 +1,72 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.theme.Styles; +import atlantafx.sampler.fake.SampleMenuBar; +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import atlantafx.sampler.util.Controls; +import javafx.geometry.Pos; +import javafx.scene.control.ContextMenu; +import javafx.scene.control.Label; +import javafx.scene.control.SeparatorMenuItem; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import org.kordamp.ikonli.feather.Feather; + +import static atlantafx.sampler.util.Controls.menuItem; +import static javafx.scene.input.KeyCombination.CONTROL_DOWN; + +public class MenuPage extends AbstractPage { + + public static final String NAME = "Menu"; + + @Override + public String getName() { return NAME; } + + public MenuPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().addAll( + menuBarSample().getRoot(), + contextMenuExample().getRoot() + ); + } + + private SampleBlock menuBarSample() { + return new SampleBlock("Menu Bar", new SampleMenuBar(FAKER)); + } + + private SampleBlock contextMenuExample() { + var contextMenu = new ContextMenu(); + + var undoItem = Controls.menuItem("_Undo", Feather.CORNER_DOWN_LEFT, new KeyCodeCombination(KeyCode.Z, CONTROL_DOWN)); + undoItem.setMnemonicParsing(true); + undoItem.setOnAction(PRINT_SOURCE); + + var redoItem = Controls.menuItem("_Redo", Feather.CORNER_DOWN_RIGHT, new KeyCodeCombination(KeyCode.Y, CONTROL_DOWN)); + redoItem.setMnemonicParsing(true); + redoItem.setOnAction(PRINT_SOURCE); + + contextMenu.getItems().addAll( + undoItem, + redoItem, + new SeparatorMenuItem(), + Controls.menuItem("Cut", Feather.SCISSORS, new KeyCodeCombination(KeyCode.X, CONTROL_DOWN)), + Controls.menuItem("Copy", Feather.COPY, new KeyCodeCombination(KeyCode.C, CONTROL_DOWN)), + Controls.menuItem("Paste", null, new KeyCodeCombination(KeyCode.V, CONTROL_DOWN)) + ); + + var sample = new Label("Right-Click Here"); + sample.setAlignment(Pos.CENTER); + sample.setMinSize(400, 80); + sample.setMaxSize(200, 80); + sample.setContextMenu(contextMenu); + sample.getStyleClass().add(Styles.BORDERED); + + return new SampleBlock("Context menu", sample); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/OverviewPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/OverviewPage.java new file mode 100755 index 0000000..819cace --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/OverviewPage.java @@ -0,0 +1,327 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.base.util.IntegerStringConverter; +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.scene.control.*; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; +import javafx.scene.shape.Circle; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.time.LocalDate; +import java.util.stream.IntStream; + +import static atlantafx.base.theme.Styles.*; + +public class OverviewPage extends AbstractPage { + + public static final String NAME = "Overview"; + + private static final int BUTTON_WIDTH = 120; + private static final int COMBO_BOX_WIDTH = 150; + private static final int H_GAP = 20; + private static final int V_GAP = 10; + + @Override + public String getName() { return NAME; } + + public OverviewPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().setAll( + buttonSample().getRoot(), + new HBox(H_GAP * 2, + iconButtonSample().getRoot(), + dropdownMenuSample().getRoot() + ), + new HBox(H_GAP * 2, + checkBoxSample().getRoot(), + radioButtonSample().getRoot(), + toggleSwitchSample().getRoot() + ), + comboBoxSample().getRoot(), + sliderSample().getRoot(), + new HBox(H_GAP * 2, + textFieldSample().getRoot(), + spinnerSample().getRoot() + ), + textAreaSample().getRoot() + ); + } + + private SampleBlock buttonSample() { + var grid = new GridPane(); + grid.setVgap(V_GAP); + grid.setHgap(H_GAP); + + var basicBtn = new Button("Basic"); + basicBtn.setPrefWidth(BUTTON_WIDTH); + + var defaultBtn = new Button("Default"); + defaultBtn.setDefaultButton(true); + defaultBtn.setPrefWidth(BUTTON_WIDTH); + + var successBtn = new Button("Success"); + successBtn.getStyleClass().add(SUCCESS); + successBtn.setPrefWidth(BUTTON_WIDTH); + + var dangerBtn = new Button("Danger"); + dangerBtn.getStyleClass().add(DANGER); + dangerBtn.setPrefWidth(BUTTON_WIDTH); + + var flatBtn = new Button("Flat"); + flatBtn.getStyleClass().add(FLAT); + flatBtn.setPrefWidth(BUTTON_WIDTH); + + var outlinedBtn = new Button("Outlined"); + outlinedBtn.getStyleClass().addAll(BUTTON_OUTLINED, ACCENT); + outlinedBtn.setPrefWidth(BUTTON_WIDTH); + + var twoButtonGroup = new ToggleGroup(); + var leftPill = toggleButton("Toggle 1", twoButtonGroup, true, LEFT_PILL); + leftPill.setPrefWidth(BUTTON_WIDTH + grid.getHgap() / 2); + var rightPill = toggleButton("Toggle 2", twoButtonGroup, false, RIGHT_PILL); + rightPill.setPrefWidth(BUTTON_WIDTH + grid.getHgap() / 2); + var twoButtonBox = new HBox(leftPill, rightPill); + + // ~ + grid.add(basicBtn, 0, 0); + grid.add(flatBtn, 1, 0); + grid.add(successBtn, 2, 0); + grid.add(dangerBtn, 3, 0); + + grid.add(defaultBtn, 0, 1); + grid.add(outlinedBtn, 1, 1); + grid.add(twoButtonBox, 2, 1, 2, 1); + + return new SampleBlock("Buttons", grid); + } + + private SampleBlock iconButtonSample() { + var grid = new GridPane(); + grid.setVgap(V_GAP); + grid.setHgap(H_GAP); + + var basicBtn = new Button("", new FontIcon(Feather.MORE_HORIZONTAL)); + basicBtn.getStyleClass().addAll(BUTTON_ICON); + + var successBtn = new Button("", new FontIcon(Feather.PLUS)); + successBtn.getStyleClass().addAll(BUTTON_ICON, ACCENT); + + var dangerBtn = new Button("", new FontIcon(Feather.TRASH)); + dangerBtn.getStyleClass().addAll(BUTTON_ICON, DANGER); + + var basicCircularBtn = new Button("", new FontIcon(Feather.MORE_VERTICAL)); + basicCircularBtn.getStyleClass().addAll(BUTTON_CIRCLE); + basicCircularBtn.setShape(new Circle(50)); + + var flatBtn = new Button("", new FontIcon(Feather.MIC)); + flatBtn.getStyleClass().addAll(BUTTON_CIRCLE, FLAT); + flatBtn.setShape(new Circle(50)); + + // ~ + grid.add(basicBtn, 0, 0); + grid.add(successBtn, 1, 0); + grid.add(dangerBtn, 2, 0); + grid.add(basicCircularBtn, 0, 1); + grid.add(flatBtn, 1, 1); + + return new SampleBlock("Icon Buttons", grid); + } + + private SampleBlock dropdownMenuSample() { + var grid = new GridPane(); + grid.setVgap(V_GAP); + grid.setHgap(H_GAP); + + var basicIconBtn = new MenuButton(); + basicIconBtn.setGraphic(new FontIcon(Feather.MORE_HORIZONTAL)); + basicIconBtn.getItems().setAll(menuItems(5)); + basicIconBtn.getStyleClass().addAll(BUTTON_ICON); + + var accentIconBtn = new MenuButton(); + accentIconBtn.setGraphic(new FontIcon(Feather.MENU)); + accentIconBtn.getItems().setAll(menuItems(5)); + accentIconBtn.getStyleClass().addAll(BUTTON_ICON, ACCENT); + + var basicMenuBtn = new MenuButton("Menu Button"); + basicMenuBtn.getItems().setAll(menuItems(5)); + basicMenuBtn.setPrefWidth(COMBO_BOX_WIDTH); + + var basicSplitBtn = new SplitMenuButton(menuItems(5)); + basicSplitBtn.setText("Split Menu Button"); + + var outlinedSplitBtn = new SplitMenuButton(menuItems(5)); + outlinedSplitBtn.setGraphic(new FontIcon(Feather.TRASH)); + outlinedSplitBtn.setText("Danger"); + outlinedSplitBtn.getStyleClass().addAll(BUTTON_OUTLINED, DANGER); + outlinedSplitBtn.setPrefWidth(COMBO_BOX_WIDTH); + + // ~ + grid.add(basicIconBtn, 0, 0); + grid.add(accentIconBtn, 1, 0); + grid.add(basicMenuBtn, 2, 0); + grid.add(basicSplitBtn, 0, 1, 2, 1); + grid.add(outlinedSplitBtn, 2, 1); + + return new SampleBlock("Dropdown Menus", grid); + } + + private SampleBlock checkBoxSample() { + var box = new VBox(V_GAP); + + var opt1 = new CheckBox("Option 1"); + + var opt2 = new CheckBox("Option 1"); + opt2.setSelected(true); + + var opt3 = new CheckBox("Option 3"); + opt3.setAllowIndeterminate(true); + opt3.setIndeterminate(true); + + box.getChildren().setAll(opt1, opt2, opt3); + return new SampleBlock("Check Boxes", box); + } + + private SampleBlock radioButtonSample() { + var box = new VBox(V_GAP); + + var group = new ToggleGroup(); + + var opt1 = new RadioButton("Option 1"); + opt1.setToggleGroup(group); + + var opt2 = new RadioButton("Option 1"); + opt2.setToggleGroup(group); + opt2.setSelected(true); + + var opt3 = new RadioButton("Option 3"); + opt3.setToggleGroup(group); + + box.getChildren().setAll(opt1, opt2, opt3); + return new SampleBlock("Radio Buttons", box); + } + + private SampleBlock toggleSwitchSample() { + var box = new VBox(V_GAP); + + var switch1 = new ToggleSwitch(); + + var switch2 = new ToggleSwitch(); + switch2.setSelected(true); + + box.getChildren().setAll(switch1, switch2); + return new SampleBlock("Switches", box); + } + + private SampleBlock comboBoxSample() { + var box = new HBox(H_GAP); + + var comboBox = new ComboBox(); + comboBox.getItems().setAll("Option 1", "Option 2", "Option 3"); + comboBox.getSelectionModel().selectFirst(); + comboBox.setPrefWidth(COMBO_BOX_WIDTH); + + var choiceBox = new ChoiceBox(); + choiceBox.getItems().setAll("Option 1", "Option 2", "Option 3"); + choiceBox.getSelectionModel().selectFirst(); + choiceBox.setPrefWidth(COMBO_BOX_WIDTH); + + var datePicker = new DatePicker(); + datePicker.setPrefWidth(COMBO_BOX_WIDTH); + datePicker.setValue(LocalDate.now()); + + var colorPicker = new ColorPicker(); + colorPicker.setPrefWidth(COMBO_BOX_WIDTH); + colorPicker.setValue(Color.ORANGE); + + box.getChildren().setAll(comboBox, choiceBox, datePicker, colorPicker); + return new SampleBlock("Combo Boxes", box); + } + + private SampleBlock sliderSample() { + var box = new HBox(H_GAP); + + var slider = new Slider(1, 5, 3); + slider.setPrefWidth(BUTTON_WIDTH * 2); + + var tickSlider = new Slider(0, 5, 3); + tickSlider.setShowTickLabels(true); + tickSlider.setShowTickMarks(true); + tickSlider.setMajorTickUnit(1); + tickSlider.setBlockIncrement(1); + tickSlider.setMinorTickCount(5); + tickSlider.setSnapToTicks(true); + tickSlider.setPrefWidth(BUTTON_WIDTH * 2); + + box.getChildren().setAll(slider, tickSlider); + return new SampleBlock("Sliders", box); + } + + private SampleBlock textFieldSample() { + var box = new HBox(H_GAP); + + var textField = new TextField("Text"); + textField.setPrefWidth(BUTTON_WIDTH); + + var passwordField = new PasswordField(); + passwordField.setText(FAKER.internet().password()); + passwordField.setPrefWidth(BUTTON_WIDTH); + + box.getChildren().setAll(textField, passwordField); + return new SampleBlock("Text Fields", box); + } + + private SampleBlock spinnerSample() { + var box = new HBox(H_GAP); + + var spinner1 = new Spinner(1, 10, 1); + IntegerStringConverter.createFor(spinner1); + spinner1.setPrefWidth(BUTTON_WIDTH); + + var spinner2 = new Spinner(1, 10, 1); + IntegerStringConverter.createFor(spinner2); + spinner2.getStyleClass().add(Spinner.STYLE_CLASS_SPLIT_ARROWS_HORIZONTAL); + spinner2.setPrefWidth(BUTTON_WIDTH); + + box.getChildren().setAll(spinner1, spinner2); + return new SampleBlock("Spinners", box); + } + + private SampleBlock textAreaSample() { + var textArea = new TextArea(String.join("\n\n", FAKER.lorem().paragraphs(3))); + textArea.setWrapText(true); + textArea.setMaxWidth(Double.MAX_VALUE); + textArea.setMinHeight(100); + + return new SampleBlock("Text Area", textArea); + } + + private ToggleButton toggleButton(String text, + ToggleGroup group, + boolean selected, + String... styleClasses) { + var toggleButton = new ToggleButton(text); + if (group != null) { toggleButton.setToggleGroup(group); } + toggleButton.setSelected(selected); + toggleButton.getStyleClass().addAll(styleClasses); + + return toggleButton; + } + + @SuppressWarnings("SameParameterValue") + private MenuItem[] menuItems(int count) { + return IntStream.range(0, count) + .mapToObj(i -> new MenuItem(FAKER.babylon5().character())) + .toArray(MenuItem[]::new); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/PaginationPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/PaginationPage.java new file mode 100644 index 0000000..70ae136 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/PaginationPage.java @@ -0,0 +1,113 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.theme.Styles; +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.base.controls.Spacer; +import atlantafx.sampler.page.AbstractPage; +import javafx.geometry.Pos; +import javafx.scene.control.Label; +import javafx.scene.control.Pagination; +import javafx.scene.control.Separator; +import javafx.scene.control.Spinner; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; + +public class PaginationPage extends AbstractPage { + + public static final String NAME = "Pagination"; + private static final int PREF_CONTROL_WIDTH = 120; + + @Override + public String getName() { return NAME; } + + public PaginationPage() { + super(); + createView(); + } + + private void createView() { + var playground = new VBox(10); + playground.setMinHeight(100); + playground.setAlignment(Pos.CENTER); + + var pagination = new Pagination(); + pagination.setCurrentPageIndex(1); + pagination.setPageFactory(index -> { + var label = new Label("Page #" + (index + 1)); + label.setStyle("-fx-font-size: 3em;"); + + var page = new BorderPane(); + page.setCenter(label); + + return page; + }); + + // == CONTROLS == + + var pageCountSpinner = new Spinner(0, 50, 25); + pageCountSpinner.setPrefWidth(PREF_CONTROL_WIDTH); + pagination.pageCountProperty().bind(pageCountSpinner.valueProperty()); + + var visibleCountSpinner = new Spinner(3, 10, 5); + visibleCountSpinner.setPrefWidth(PREF_CONTROL_WIDTH); + pagination.maxPageIndicatorCountProperty().bind(visibleCountSpinner.valueProperty()); + + var bulletToggle = new ToggleSwitch(); + bulletToggle.selectedProperty().addListener( + (obs, old, val) -> Styles.toggleStyleClass(pagination, Pagination.STYLE_CLASS_BULLET) + ); + + var showArrowsToggle = new ToggleSwitch(); + showArrowsToggle.selectedProperty().addListener((obs, old, val) -> { + if (val != null) { pagination.setStyle(String.format("-fx-arrows-visible: %s;", val)); } + }); + showArrowsToggle.setSelected(true); + + var showPageInfoToggle = new ToggleSwitch(); + showPageInfoToggle.selectedProperty().addListener((obs, old, val) -> { + if (val != null) { pagination.setStyle(String.format("-fx-page-information-visible: %s;", val)); } + }); + showPageInfoToggle.setSelected(true); + + var disableToggle = new ToggleSwitch(); + pagination.disableProperty().bind(disableToggle.selectedProperty()); + + var controls = new GridPane(); + controls.setHgap(20); + controls.setVgap(10); + + controls.add(new Label("Page count:"), 0, 0); + controls.add(pageCountSpinner, 1, 0); + + controls.add(new Label("Visible count:"), 0, 1); + controls.add(visibleCountSpinner, 1, 1); + + controls.add(new Label("Bullet style"), 3, 0); + controls.add(bulletToggle, 4, 0); + + controls.add(new Label("Show arrows"), 3, 1); + controls.add(showArrowsToggle, 4, 1); + + controls.add(new Label("Show info"), 5, 0); + controls.add(showPageInfoToggle, 6, 0); + + controls.add(new Label("Disable"), 5, 1); + controls.add(disableToggle, 6, 1); + + // ~ + + var separator = new Separator(); + separator.getStyleClass().addAll(Styles.LARGE); + + playground.getChildren().setAll( + pagination, + separator, + new HBox(new Spacer(), controls, new Spacer()) + ); + + userContent.getChildren().setAll(playground); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/PopoverPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/PopoverPage.java new file mode 100644 index 0000000..306bbb2 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/PopoverPage.java @@ -0,0 +1,108 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.InlineDatePicker; +import atlantafx.base.controls.Popover; +import atlantafx.base.controls.Popover.ArrowLocation; +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.geometry.Pos; +import javafx.scene.control.Hyperlink; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.text.Text; +import javafx.scene.text.TextFlow; + +import java.time.LocalDate; + +public class PopoverPage extends AbstractPage { + + public static final String NAME = "Popover"; + + @Override + public String getName() { return NAME; } + + public PopoverPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().setAll(basicSamples(), positionSamples().getRoot()); + } + + private HBox basicSamples() { + var textPopover = new Popover(textFlow(30)); + textPopover.setTitle("Lorem Ipsum"); + textPopover.setHeaderAlwaysVisible(true); + textPopover.setDetachable(true); + var textLink = hyperlink("Click me"); + textLink.setOnAction(e -> textPopover.show(textLink)); + var textBlock = new SampleBlock("Basic", textLink); + + var datePicker = new InlineDatePicker(); + datePicker.setValue(LocalDate.now()); + + var datePopover = new Popover(datePicker); + textPopover.setHeaderAlwaysVisible(false); + datePopover.setDetachable(true); + var dateLink = hyperlink("Click me"); + dateLink.setOnAction(e -> datePopover.show(dateLink)); + var dateBlock = new SampleBlock("Date picker", dateLink); + + var box = new HBox(20, + textBlock.getRoot(), + dateBlock.getRoot() + ); + box.setAlignment(Pos.CENTER_LEFT); + + return box; + } + + private SampleBlock positionSamples() { + var grid = new GridPane(); + grid.setHgap(20); + grid.setVgap(20); + + grid.add(arrowPositionBlock(ArrowLocation.TOP_LEFT), 0, 0); + grid.add(arrowPositionBlock(ArrowLocation.TOP_CENTER), 0, 1); + grid.add(arrowPositionBlock(ArrowLocation.TOP_RIGHT), 0, 2); + + grid.add(arrowPositionBlock(ArrowLocation.RIGHT_TOP), 1, 0); + grid.add(arrowPositionBlock(ArrowLocation.RIGHT_CENTER), 1, 1); + grid.add(arrowPositionBlock(ArrowLocation.RIGHT_BOTTOM), 1, 2); + + grid.add(arrowPositionBlock(ArrowLocation.BOTTOM_LEFT), 2, 0); + grid.add(arrowPositionBlock(ArrowLocation.BOTTOM_CENTER), 2, 1); + grid.add(arrowPositionBlock(ArrowLocation.BOTTOM_RIGHT), 2, 2); + + grid.add(arrowPositionBlock(ArrowLocation.LEFT_TOP), 3, 0); + grid.add(arrowPositionBlock(ArrowLocation.LEFT_CENTER), 3, 1); + grid.add(arrowPositionBlock(ArrowLocation.LEFT_BOTTOM), 3, 2); + + return new SampleBlock("Position", grid); + } + + private Hyperlink hyperlink(String text) { + Hyperlink hyperlink = new Hyperlink(text); + hyperlink.setMinWidth(50); + hyperlink.setMinHeight(50); + hyperlink.setAlignment(Pos.CENTER_LEFT); + return hyperlink; + } + + private TextFlow textFlow(int wordCount) { + var textFlow = new TextFlow(new Text(FAKER.lorem().sentence(wordCount))); + textFlow.setPrefWidth(300); + return textFlow; + } + + private Hyperlink arrowPositionBlock(ArrowLocation arrowLocation) { + var link = hyperlink(String.valueOf(arrowLocation)); + var popover = new Popover(textFlow(50)); + popover.setHeaderAlwaysVisible(false); + popover.setArrowLocation(arrowLocation); + link.setOnAction(e -> popover.show(link)); + return link; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/ProgressPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/ProgressPage.java new file mode 100644 index 0000000..28fa6a6 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/ProgressPage.java @@ -0,0 +1,90 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.theme.Styles; +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.geometry.Pos; +import javafx.scene.control.ProgressBar; +import javafx.scene.control.ProgressIndicator; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.scene.text.Text; + +// Indeterminate (animated) progress bar and also progress indicator are very expensive. +// It consumes single CPU core and a lot of memory. +// #javafx-bug +public class ProgressPage extends AbstractPage { + + public static final String NAME = "Progress"; + + @Override + public String getName() { return NAME; } + + public ProgressPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().addAll( + basicBarSamples().getRoot(), + basicIndicatorSamples().getRoot(), + barSizeSamples().getRoot() + ); + } + + private SampleBlock basicBarSamples() { + var flowPane = new FlowPane(20, 20); + flowPane.setAlignment(Pos.CENTER_LEFT); + flowPane.getChildren().addAll( + progressBar(0, false), + progressBar(0.5, false), + progressBar(1, false), + progressBar(0.5, true) + ); + + return new SampleBlock("Progress Bar", flowPane); + } + + private SampleBlock basicIndicatorSamples() { + var flowPane = new FlowPane(20, 20); + flowPane.getChildren().addAll( + progressIndicator(0, false), + progressIndicator(0.5, false), + progressIndicator(1, false), + progressIndicator(0.5, true) + ); + flowPane.setAlignment(Pos.TOP_LEFT); + + return new SampleBlock("Progress Indicator", flowPane); + } + + private SampleBlock barSizeSamples() { + var container = new VBox( + 10, + new HBox(20, progressBar(0.5, false, Styles.SMALL), new Text("small")), + new HBox(20, progressBar(0.5, false, Styles.MEDIUM), new Text("medium")), + new HBox(20, progressBar(0.5, false, Styles.LARGE), new Text("large")) + ); + container.getChildren().forEach(c -> ((HBox) c).setAlignment(Pos.CENTER_LEFT)); + + return new SampleBlock("Size", container); + } + + private ProgressIndicator progressBar(double progress, boolean disabled, String... styleClasses) { + var bar = new ProgressBar(progress); + bar.getStyleClass().addAll(styleClasses); + bar.setDisable(disabled); + return bar; + } + + private ProgressIndicator progressIndicator(double progress, boolean disabled) { + var indicator = new ProgressIndicator(progress); + indicator.setMinSize(50, 50); + indicator.setMaxSize(50, 50); + indicator.setDisable(disabled); + return indicator; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/RadioButtonPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/RadioButtonPage.java new file mode 100644 index 0000000..868752b --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/RadioButtonPage.java @@ -0,0 +1,64 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.scene.control.RadioButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; + +public class RadioButtonPage extends AbstractPage { + + public static final String NAME = "RadioButton"; + + @Override + public String getName() { return NAME; } + + public RadioButtonPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().addAll( + basicSamples(), + groupSamples().getRoot() + ); + } + + private HBox basicSamples() { + var basicRadio = new RadioButton("_Check Me"); + basicRadio.setMnemonicParsing(true); + basicRadio.setOnAction(PRINT_SOURCE); + var basicBlock = new SampleBlock("Basic", basicRadio); + + var disabledRadio = new RadioButton("Check Me"); + disabledRadio.setDisable(true); + var disabledBlock = new SampleBlock("Disabled", disabledRadio); + + var root = new HBox(20); + root.getChildren().addAll( + basicBlock.getRoot(), + disabledBlock.getRoot() + ); + + return root; + } + + private SampleBlock groupSamples() { + var group = new ToggleGroup(); + + var musicRadio = new RadioButton("Music"); + musicRadio.setToggleGroup(group); + musicRadio.setSelected(true); + + var imagesRadio = new RadioButton("Images"); + imagesRadio.setToggleGroup(group); + + var videosRadio = new RadioButton("Videos"); + videosRadio.setToggleGroup(group); + + return new SampleBlock("Toggle Group", new VBox(5, musicRadio, imagesRadio, videosRadio)); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/ScrollPanePage.java b/sampler/src/main/java/atlantafx/sampler/page/components/ScrollPanePage.java new file mode 100644 index 0000000..9ae18c7 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/ScrollPanePage.java @@ -0,0 +1,85 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.scene.control.ScrollPane; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; +import javafx.scene.shape.Rectangle; + +public class ScrollPanePage extends AbstractPage { + + public static final String NAME = "ScrollPane"; + + @Override + public String getName() { return NAME; } + + public ScrollPanePage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().setAll(new FlowPane(20, 20, + hScrollBlock().getRoot(), + vScrollBlock().getRoot(), + gridScrollBlock().getRoot(), + disabledBlock().getRoot() + )); + } + + private SampleBlock hScrollBlock() { + var scrollPane = new ScrollPane(); + scrollPane.setMaxHeight(100); + scrollPane.setMaxWidth(300); + scrollPane.setContent(new HBox(2, + new Rectangle(200, 100, Color.GREEN), + new Rectangle(200, 100, Color.RED) + )); + scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + + return new SampleBlock("Horizontal scrolling", scrollPane); + } + + private SampleBlock vScrollBlock() { + var scrollPane = new ScrollPane(); + scrollPane.setMaxHeight(100); + scrollPane.setMaxWidth(300); + scrollPane.setContent(new VBox(2, + new Rectangle(300, 75, Color.GREEN), + new Rectangle(300, 75, Color.RED) + )); + scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + + return new SampleBlock("Vertical scrolling", scrollPane); + } + + private SampleBlock gridScrollBlock() { + var grid = new GridPane(); + grid.add(new Rectangle(200, 75, Color.GREEN), 0, 0); + grid.add(new Rectangle(200, 75, Color.RED), 1, 0); + grid.add(new Rectangle(200, 75, Color.RED), 0, 1); + grid.add(new Rectangle(200, 75, Color.GREEN), 1, 1); + grid.setHgap(2); + grid.setVgap(2); + + var gridScroll = new ScrollPane(); + gridScroll.setMaxHeight(100); + gridScroll.setMaxWidth(300); + gridScroll.setContent(grid); + + return new SampleBlock("Horizontal & vertical scrolling", gridScroll); + } + + private SampleBlock disabledBlock() { + var block = gridScrollBlock(); + block.setText("Disabled"); + block.getContent().setDisable(true); + + return block; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/SeparatorPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/SeparatorPage.java new file mode 100644 index 0000000..096c842 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/SeparatorPage.java @@ -0,0 +1,104 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.theme.Styles; +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.geometry.Orientation; +import javafx.scene.control.Label; +import javafx.scene.control.Separator; +import javafx.scene.layout.*; + +import static javafx.geometry.Orientation.HORIZONTAL; +import static javafx.geometry.Orientation.VERTICAL; +import static javafx.geometry.Pos.CENTER; + +public final class SeparatorPage extends AbstractPage { + + public static final String NAME = "Separator"; + private static final int BRICK_SIZE = 100; + + @Override + public String getName() { return NAME; } + + public SeparatorPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().setAll( + orientationSamples(), + sizeSamples() + ); + } + + private FlowPane orientationSamples() { + var hBox = new HBox(brick("Left", VERTICAL), new Separator(VERTICAL), brick("Right", VERTICAL)); + hBox.setAlignment(CENTER); + var hBlock = new SampleBlock("Vertical", hBox); + + var vBox = new VBox(brick("Top", HORIZONTAL), new Separator(HORIZONTAL), brick("Bottom", HORIZONTAL)); + vBox.setAlignment(CENTER); + var vBlock = new SampleBlock("Horizontal", vBox); + + var root = new FlowPane(20, 20); + root.getChildren().setAll( + hBlock.getRoot(), + vBlock.getRoot() + ); + + return root; + } + + private FlowPane sizeSamples() { + var smallSep = new Separator(VERTICAL); + smallSep.getStyleClass().add(Styles.SMALL); + var smallBox = new HBox(brick("Left", VERTICAL), smallSep, brick("Right", VERTICAL)); + smallBox.setAlignment(CENTER); + var smallBlock = new SampleBlock("Small", smallBox); + + var mediumSep = new Separator(VERTICAL); + mediumSep.getStyleClass().add(Styles.MEDIUM); + var mediumBox = new HBox(brick("Left", VERTICAL), mediumSep, brick("Right", VERTICAL)); + mediumBox.setAlignment(CENTER); + var mediumBlock = new SampleBlock("Medium", mediumBox); + + var largeSep = new Separator(VERTICAL); + largeSep.getStyleClass().add(Styles.LARGE); + var largeBox = new HBox(brick("Left", VERTICAL), largeSep, brick("Right", VERTICAL)); + largeBox.setAlignment(CENTER); + var largeBlock = new SampleBlock("Large", largeBox); + + var root = new FlowPane(20, 20); + root.getChildren().setAll( + smallBlock.getRoot(), + mediumBlock.getRoot(), + largeBlock.getRoot() + ); + + return root; + } + + private Pane brick(String text, Orientation orientation) { + var root = new StackPane(); + root.getChildren().setAll(new Label(text)); + root.getStyleClass().add("bordered"); + + if (orientation == HORIZONTAL) { + root.setMinHeight(BRICK_SIZE); + root.setPrefHeight(BRICK_SIZE); + root.setMaxHeight(BRICK_SIZE); + root.setMinWidth(BRICK_SIZE); + } + + if (orientation == VERTICAL) { + root.setMinWidth(BRICK_SIZE); + root.setPrefWidth(BRICK_SIZE); + root.setMaxWidth(BRICK_SIZE); + root.setMinHeight(BRICK_SIZE); + } + + return root; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/SliderPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/SliderPage.java new file mode 100644 index 0000000..984b28e --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/SliderPage.java @@ -0,0 +1,72 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.scene.control.Slider; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; + +import static javafx.geometry.Orientation.HORIZONTAL; +import static javafx.geometry.Orientation.VERTICAL; + +public class SliderPage extends AbstractPage { + + public static final String NAME = "Slider"; + + @Override + public String getName() { return NAME; } + + public SliderPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().addAll(row1(), row2()); + } + + private Pane row1() { + var slider = new Slider(1, 5, 3); + slider.setOrientation(HORIZONTAL); + + var tickSlider = tickSlider(); + tickSlider.setMinWidth(200); + tickSlider.setMaxWidth(200); + + var hBlock = new SampleBlock("Horizontal", new HBox(20, slider, tickSlider)); + + return new HBox(20, hBlock.getRoot()); + } + + private Pane row2() { + var slider = new Slider(1, 5, 3); + slider.setOrientation(VERTICAL); + + var tickSlider = tickSlider(); + tickSlider.setOrientation(VERTICAL); + tickSlider.setMinHeight(200); + tickSlider.setMaxHeight(200); + + var vBlock = new SampleBlock("Vertical", new HBox(20, slider, tickSlider)); + + var disabledSlider = tickSlider(); + disabledSlider.setDisable(true); + + var disabledBlock = new SampleBlock("Disabled", new HBox(20, disabledSlider)); + + return new HBox(40, vBlock.getRoot(), disabledBlock.getRoot()); + } + + private Slider tickSlider() { + var slider = new Slider(0, 5, 3); + slider.setShowTickLabels(true); + slider.setShowTickMarks(true); + slider.setMajorTickUnit(1); + slider.setBlockIncrement(1); + slider.setMinorTickCount(5); + slider.setSnapToTicks(true); + + return slider; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/SpinnerPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/SpinnerPage.java new file mode 100644 index 0000000..862087c --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/SpinnerPage.java @@ -0,0 +1,98 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.util.IntegerStringConverter; +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.scene.control.Spinner; +import javafx.scene.layout.FlowPane; + +public final class SpinnerPage extends AbstractPage { + + public static final String NAME = "Spinner"; + private static final int PREF_WIDTH = 120; + + @Override + public String getName() { return NAME; } + + public SpinnerPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().addAll( + basicSamples(), + arrowPositionSamples() + ); + } + + private FlowPane basicSamples() { + var editableSpin = new Spinner(1, 10, 1); + IntegerStringConverter.createFor(editableSpin); + editableSpin.setPrefWidth(PREF_WIDTH); + editableSpin.setEditable(true); + var editableBlock = new SampleBlock("Editable", editableSpin); + + var disabledSpin = new Spinner(1, 10, 1); + disabledSpin.setPrefWidth(PREF_WIDTH); + disabledSpin.setDisable(true); + var disabledBlock = new SampleBlock("Disabled", disabledSpin); + + var root = new FlowPane(20, 20); + root.getChildren().addAll( + editableBlock.getRoot(), + disabledBlock.getRoot() + ); + + return root; + } + + private FlowPane arrowPositionSamples() { + var leftVSpin = new Spinner(1, 10, 1); + IntegerStringConverter.createFor(leftVSpin); + leftVSpin.getStyleClass().add(Spinner.STYLE_CLASS_ARROWS_ON_LEFT_VERTICAL); + leftVSpin.setPrefWidth(PREF_WIDTH); + leftVSpin.setEditable(true); + var leftVBlock = new SampleBlock("Arrows on left & vertical", leftVSpin); + + var leftHSpin = new Spinner(1, 10, 1); + IntegerStringConverter.createFor(leftHSpin); + leftHSpin.getStyleClass().add(Spinner.STYLE_CLASS_ARROWS_ON_LEFT_HORIZONTAL); + leftHSpin.setPrefWidth(PREF_WIDTH); + leftHSpin.setEditable(true); + var leftHBlock = new SampleBlock("Arrows on left & horizontal", leftHSpin); + + var rightHSpin = new Spinner(1, 10, 1); + IntegerStringConverter.createFor(rightHSpin); + rightHSpin.getStyleClass().add(Spinner.STYLE_CLASS_ARROWS_ON_RIGHT_HORIZONTAL); + rightHSpin.setPrefWidth(PREF_WIDTH); + rightHSpin.setEditable(true); + var rightHBlock = new SampleBlock("Arrows on right & horizontal", rightHSpin); + + var splitHSpin = new Spinner(1, 10, 1); + IntegerStringConverter.createFor(splitHSpin); + splitHSpin.getStyleClass().add(Spinner.STYLE_CLASS_SPLIT_ARROWS_HORIZONTAL); + splitHSpin.setPrefWidth(PREF_WIDTH); + splitHSpin.setEditable(true); + var splitHBlock = new SampleBlock("Split arrows & horizontal", splitHSpin); + + var splitVSpin = new Spinner(1, 10, 1); + IntegerStringConverter.createFor(splitVSpin); + splitVSpin.getStyleClass().add(Spinner.STYLE_CLASS_SPLIT_ARROWS_VERTICAL); + splitVSpin.setEditable(true); + splitVSpin.setPrefWidth(40); + var splitVBlock = new SampleBlock("Split arrows & vertical", splitVSpin); + + var root = new FlowPane(20, 20); + root.getChildren().addAll( + leftVBlock.getRoot(), + leftHBlock.getRoot(), + rightHBlock.getRoot(), + splitHBlock.getRoot(), + splitVBlock.getRoot() + ); + + return root; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/SplitPanePage.java b/sampler/src/main/java/atlantafx/sampler/page/components/SplitPanePage.java new file mode 100644 index 0000000..5d7da2e --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/SplitPanePage.java @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.geometry.Orientation; +import javafx.geometry.Pos; +import javafx.scene.control.SplitPane; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; +import javafx.scene.text.Text; + +public class SplitPanePage extends AbstractPage { + + public static final String NAME = "SplitPane"; + + @Override + public String getName() { return NAME; } + + public SplitPanePage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().setAll(new FlowPane(20, 20, + hSplitBlock().getRoot(), + vSplitBlock().getRoot(), + disabledSplitBlock().getRoot(), + gridSplitBlock().getRoot() + )); + } + + private SampleBlock hSplitBlock() { + var splitPane = new SplitPane(); + splitPane.setOrientation(Orientation.HORIZONTAL); + splitPane.setDividerPositions(0.5); + splitPane.getItems().setAll(hBrick("Left"), hBrick("Right")); + splitPane.setMinSize(200, 100); + splitPane.setMaxSize(200, 100); + + return new SampleBlock("Horizontal", splitPane); + } + + private SampleBlock vSplitBlock() { + var splitPane = new SplitPane(); + splitPane.setOrientation(Orientation.VERTICAL); + splitPane.setDividerPositions(0.5); + splitPane.getItems().setAll(vBrick("Top"), hBrick("Bottom")); + splitPane.setMinSize(100, 200); + splitPane.setMaxSize(100, 200); + + return new SampleBlock("Vertical", splitPane); + } + + private SampleBlock gridSplitBlock() { + var topSplitPane = new SplitPane(); + topSplitPane.setOrientation(Orientation.HORIZONTAL); + topSplitPane.setDividerPositions(0.5); + topSplitPane.getItems().setAll(vBrick("Quarter 4"), hBrick("Quarter 1")); + VBox.setVgrow(topSplitPane, Priority.ALWAYS); + + var bottomSplitPane = new SplitPane(); + bottomSplitPane.setOrientation(Orientation.HORIZONTAL); + bottomSplitPane.setDividerPositions(0.5); + bottomSplitPane.getItems().setAll(vBrick("Quarter 3"), hBrick("Quarter 2")); + VBox.setVgrow(bottomSplitPane, Priority.ALWAYS); + + var doubleSplitPane = new SplitPane(); + doubleSplitPane.setOrientation(Orientation.VERTICAL); + doubleSplitPane.setDividerPositions(0.5); + doubleSplitPane.getItems().setAll( + new VBox(topSplitPane) {{ setAlignment(Pos.CENTER); }}, + new VBox(bottomSplitPane) {{ setAlignment(Pos.CENTER); }} + ); + doubleSplitPane.setMinSize(400, 200); + doubleSplitPane.setMaxSize(400, 200); + + return new SampleBlock("Nested", doubleSplitPane); + } + + private SampleBlock disabledSplitBlock() { + var block = hSplitBlock(); + block.setText("Disabled"); + block.getContent().setDisable(true); + + return block; + } + + private HBox hBrick(String text) { + var brick = new HBox(new Text(text)); + brick.setAlignment(Pos.CENTER); + return brick; + } + + private VBox vBrick(String text) { + var brick = new VBox(new Text(text)); + brick.setAlignment(Pos.CENTER); + return brick; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/TabPanePage.java b/sampler/src/main/java/atlantafx/sampler/page/components/TabPanePage.java new file mode 100644 index 0000000..d922ca9 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/TabPanePage.java @@ -0,0 +1,244 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.theme.Styles; +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.base.controls.Spacer; +import atlantafx.sampler.page.AbstractPage; +import javafx.application.Platform; +import javafx.collections.ListChangeListener; +import javafx.geometry.Pos; +import javafx.geometry.Side; +import javafx.scene.control.*; +import javafx.scene.layout.*; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; + +import static atlantafx.base.theme.Styles.BUTTON_ICON; +import static atlantafx.base.theme.Styles.ACCENT; +import static javafx.scene.control.TabPane.TabClosingPolicy.ALL_TABS; +import static javafx.scene.control.TabPane.TabClosingPolicy.UNAVAILABLE; + +public class TabPanePage extends AbstractPage { + + public static final String NAME = "TabPane"; + private static final double TAB_MIN_HEIGHT = 60; + + @Override + public String getName() { return NAME; } + + private Side tabSide = Side.TOP; + private boolean fullWidth = false; + + public TabPanePage() { + super(); + createView(); + } + + private void createView() { + var tabs = tabPane(); + var tabsLayer = new BorderPane(); + tabsLayer.setTop(tabs); + tabs.getTabs().addListener((ListChangeListener) c -> updateTabsWidth(tabsLayer, tabs, fullWidth)); + + var controller = createController(tabsLayer, tabs); + controller.setPrefSize(500, 300); + var controllerLayer = new BorderPane(); + controllerLayer.setCenter(controller); + controllerLayer.setMaxSize(500, 300); + + var root = new StackPane(); + root.getStyleClass().add(Styles.BORDERED); + root.getChildren().addAll(tabsLayer, controllerLayer); + VBox.setVgrow(root, Priority.ALWAYS); + + userContent.getChildren().setAll(root); + } + + private TitledPane createController(BorderPane borderPane, TabPane tabs) { + // == BUTTONS == + + var toTopBtn = new Button("", new FontIcon(Feather.ARROW_UP)); + toTopBtn.getStyleClass().addAll(BUTTON_ICON); + toTopBtn.setOnAction(e -> rotateTabs(borderPane, tabs, Side.TOP)); + + var toRightBtn = new Button("", new FontIcon(Feather.ARROW_RIGHT)); + toRightBtn.getStyleClass().addAll(BUTTON_ICON); + toRightBtn.setOnAction(e -> rotateTabs(borderPane, tabs, Side.RIGHT)); + + var toBottomBtn = new Button("", new FontIcon(Feather.ARROW_DOWN)); + toBottomBtn.getStyleClass().addAll(BUTTON_ICON); + toBottomBtn.setOnAction(e -> rotateTabs(borderPane, tabs, Side.BOTTOM)); + + var toLeftBtn = new Button("", new FontIcon(Feather.ARROW_LEFT)); + toLeftBtn.getStyleClass().addAll(BUTTON_ICON); + toLeftBtn.setOnAction(e -> rotateTabs(borderPane, tabs, Side.LEFT)); + + var appendBtn = new Button("", new FontIcon(Feather.PLUS)); + appendBtn.getStyleClass().addAll(BUTTON_ICON, ACCENT); + appendBtn.setOnAction(e -> tabs.getTabs().add(randomTab())); + + var buttonsPane = new BorderPane(); + buttonsPane.setMinSize(120, 120); + buttonsPane.setMaxSize(120, 120); + + buttonsPane.setTop(toTopBtn); + BorderPane.setAlignment(toTopBtn, Pos.CENTER); + + buttonsPane.setRight(toRightBtn); + BorderPane.setAlignment(toRightBtn, Pos.CENTER); + + buttonsPane.setBottom(toBottomBtn); + BorderPane.setAlignment(toBottomBtn, Pos.CENTER); + + buttonsPane.setLeft(toLeftBtn); + BorderPane.setAlignment(toLeftBtn, Pos.CENTER); + + buttonsPane.setCenter(appendBtn); + + // == TOGGLES == + + var closeableToggle = new ToggleSwitch(); + closeableToggle.selectedProperty().addListener((obs, old, val) -> { + if (val) { + tabs.setTabClosingPolicy(ALL_TABS); + } else { + tabs.setTabClosingPolicy(UNAVAILABLE); + } + }); + + var floatingToggle = new ToggleSwitch(); + floatingToggle.selectedProperty().addListener((obs, old, val) -> { + if (val != null) { Styles.toggleStyleClass(tabs, TabPane.STYLE_CLASS_FLOATING); } + }); + + var fullWidthToggle = new ToggleSwitch(); + fullWidthToggle.selectedProperty().addListener((obs, old, val) -> { + if (val != null) { + updateTabsWidth(borderPane, tabs, val); + fullWidth = val; + } + }); + + var disableToggle = new ToggleSwitch(); + disableToggle.selectedProperty().addListener((obs, old, val) -> { + if (val != null) { tabs.setDisable(val); } + }); + + var togglesGrid = new GridPane(); + togglesGrid.setHgap(10); + togglesGrid.setVgap(10); + + togglesGrid.add(gridLabel("Closeable"), 0, 0); + togglesGrid.add(closeableToggle, 1, 0); + + togglesGrid.add(gridLabel("Floating"), 0, 1); + togglesGrid.add(floatingToggle, 1, 1); + + togglesGrid.add(gridLabel("Full width"), 0, 2); + togglesGrid.add(fullWidthToggle, 1, 2); + + togglesGrid.add(gridLabel("Disable"), 0, 3); + togglesGrid.add(disableToggle, 1, 3); + + // == LAYOUT == + + var controls = new HBox(40, + new Spacer(), + buttonsPane, + togglesGrid, + new Spacer() + ); + controls.setAlignment(Pos.CENTER); + + var content = new VBox(20); + content.getChildren().setAll(controls); + content.setAlignment(Pos.CENTER); + + var root = new TitledPane("Controller", content); + root.setCollapsible(false); + + return root; + } + + private void updateTabsWidth(BorderPane borderPane, TabPane tabs, boolean val) { + tabs.tabMinWidthProperty().unbind(); + + // reset tab width + if (!val) { + tabs.setTabMinWidth(Region.USE_COMPUTED_SIZE); + return; + } + + // There are two issues with full-width tabs. + // - minWidth is applied to the tab itself but to internal .tab-container, + // thus we have to subtract tab paddings that are normally set via CSS. + // - .control-buttons-tab appears automatically and can't be disabled via + // TabPane property. + // Overall this feature should be supported by the TabPane internally, otherwise + // it's hard to make it work properly. + + if (tabs.getSide() == Side.TOP || tabs.getSide() == Side.BOTTOM) { + tabs.tabMinWidthProperty().bind(borderPane.widthProperty() + .subtract(18) // .control-buttons-tab width + .divide(tabs.getTabs().size()) + .subtract(28) // .tab paddings + ); + } + if (tabs.getSide() == Side.LEFT || tabs.getSide() == Side.RIGHT) { + tabs.tabMinWidthProperty().bind(borderPane.heightProperty() + .subtract(18) // same as above + .divide(tabs.getTabs().size()) + .subtract(28) + ); + } + } + + private TabPane tabPane() { + var tabs = new TabPane(); + tabs.setTabClosingPolicy(UNAVAILABLE); + tabs.setMinHeight(TAB_MIN_HEIGHT); + + // NOTE: Individually disabled tab is still closeable even while it looks + // like disabled. To prevent it from closing one can use "black hole" + // event handler. #javafx-bug + tabs.getTabs().addAll( + randomTab(), + randomTab(), + randomTab() + ); + + return tabs; + } + + private void rotateTabs(BorderPane borderPane, TabPane tabs, Side side) { + if (tabSide == side) { return; } + + borderPane.getChildren().removeAll(tabs); + tabSide = side; + + Platform.runLater(() -> { + tabs.setSide(side); + switch (side) { + case TOP -> borderPane.setTop(tabs); + case RIGHT -> borderPane.setRight(tabs); + case BOTTOM -> borderPane.setBottom(tabs); + case LEFT -> borderPane.setLeft(tabs); + } + updateTabsWidth(borderPane, tabs, fullWidth); + }); + } + + private Tab randomTab() { + var tab = new Tab(FAKER.cat().name()); + tab.setGraphic(new FontIcon(randomIcon())); + return tab; + } + + private Label gridLabel(String text) { + var label = new Label(text); + label.setAlignment(Pos.CENTER_RIGHT); + label.setMaxWidth(Double.MAX_VALUE); + return label; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/TablePage.java b/sampler/src/main/java/atlantafx/sampler/page/components/TablePage.java new file mode 100644 index 0000000..9dce6f4 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/TablePage.java @@ -0,0 +1,247 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.sampler.fake.domain.Product; +import atlantafx.base.controls.CaptionMenuItem; +import atlantafx.base.controls.Spacer; +import atlantafx.sampler.page.AbstractPage; +import javafx.beans.binding.Bindings; +import javafx.beans.binding.StringBinding; +import javafx.beans.property.SimpleObjectProperty; +import javafx.collections.transformation.FilteredList; +import javafx.collections.transformation.SortedList; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.control.cell.*; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.util.Callback; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIconTableCell; + +import java.util.List; +import java.util.stream.IntStream; + +import static atlantafx.base.theme.Styles.*; +import static javafx.collections.FXCollections.observableArrayList; +import static javafx.geometry.Orientation.HORIZONTAL; + +public class TablePage extends AbstractPage { + + public static final String NAME = "TableView"; + + @Override + public String getName() { return NAME; } + + private TableView table; + private final List dataList = IntStream.range(1, 51).boxed() + .map(i -> Product.random(i, FAKER)) + .toList(); + + public TablePage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().setAll( + playground() + ); + } + + private VBox playground() { + var bordersToggle = new ToggleSwitch("Bordered"); + bordersToggle.selectedProperty().addListener((obs, old, val) -> toggleStyleClass(table, BORDERED)); + + var denseToggle = new ToggleSwitch("Dense"); + denseToggle.selectedProperty().addListener((obs, old, val) -> toggleStyleClass(table, DENSE)); + + var stripesToggle = new ToggleSwitch("Striped"); + stripesToggle.selectedProperty().addListener((obs, old, val) -> toggleStyleClass(table, STRIPED)); + + var disableToggle = new ToggleSwitch("Disable"); + disableToggle.selectedProperty().addListener((obs, old, val) -> { + if (val != null) { table.setDisable(val); } + }); + + var maxValue = 100; + var rowCountChoice = new ComboBox<>(observableArrayList(0, 5, 10, 25, maxValue)); + rowCountChoice.setValue(maxValue); + + var rowCountBox = new HBox(10, new Label("rows"), rowCountChoice); + rowCountBox.setAlignment(Pos.CENTER_LEFT); + + var togglesBox = new HBox(20, + bordersToggle, + denseToggle, + stripesToggle, + disableToggle, + new Spacer(HORIZONTAL), + rowCountBox + ); + togglesBox.setAlignment(Pos.CENTER_LEFT); + + // ~ + + var filteredData = new FilteredList<>(observableArrayList(dataList)); + filteredData.predicateProperty().bind(Bindings.createObjectBinding( + () -> product -> product.getId() <= rowCountChoice.getValue(), + rowCountChoice.valueProperty() + )); + + var sortedData = new SortedList<>(filteredData); + + table = table(); + table.setItems(sortedData); + sortedData.comparatorProperty().bind(table.comparatorProperty()); + + // ~ + + var topBox = new HBox( + new Label("Example:"), + new Spacer(), + settingsMenu(table) + ); + topBox.setAlignment(Pos.CENTER_LEFT); + + var playground = new VBox(10); + playground.setMinHeight(100); + playground.getChildren().setAll( + topBox, + table, + togglesBox + ); + + return playground; + } + + @SuppressWarnings("unchecked") + private TableView table() { + var stateCol = new TableColumn("Selected"); + stateCol.setCellValueFactory(new PropertyValueFactory<>("state")); + stateCol.setCellFactory(CheckBoxTableCell.forTableColumn(stateCol)); + stateCol.setEditable(true); + + // an example of creating index column if data object + // doesn't provide index property + var indexCol = new TableColumn("Index"); + indexCol.setCellFactory(col -> { + TableCell cell = new TableCell<>(); + StringBinding value = Bindings.when(cell.emptyProperty()) + .then("") + .otherwise(cell.indexProperty().add(1).asString()); + cell.textProperty().bind(value); + return cell; + }); + + var iconCol = new TableColumn("Logo"); + iconCol.setCellValueFactory(c -> new SimpleObjectProperty<>(randomIcon())); + iconCol.setCellFactory(FontIconTableCell.forTableColumn()); + iconCol.setEditable(false); + + var brandCol = new TableColumn("Brand ✎"); + brandCol.setCellValueFactory(new PropertyValueFactory<>("brand")); + brandCol.setCellFactory(ChoiceBoxTableCell.forTableColumn( + generate(() -> FAKER.commerce().brand(), 10).toArray(String[]::new) + )); + brandCol.setEditable(true); + + var nameCol = new TableColumn("Name ✎"); + nameCol.setCellValueFactory(new PropertyValueFactory<>("name")); + nameCol.setCellFactory(ComboBoxTableCell.forTableColumn( + generate(() -> FAKER.commerce().productName(), 10).toArray(String[]::new) + )); + nameCol.setEditable(true); + + var priceCol = new TableColumn("Price ✎"); + priceCol.setCellValueFactory(new PropertyValueFactory<>("price")); + priceCol.setCellFactory(TextFieldTableCell.forTableColumn()); + priceCol.setEditable(true); + + var stockCountCol = new TableColumn("Count"); + stockCountCol.setCellValueFactory(new PropertyValueFactory<>("count")); + stockCountCol.setEditable(false); + + var stockAvailCol = new TableColumn("Available"); + stockAvailCol.setCellValueFactory(new PropertyValueFactory<>("availability")); + stockAvailCol.setCellFactory(ProgressBarTableCell.forTableColumn()); + stockAvailCol.setEditable(false); + + var stockCol = new TableColumn("Stock"); + stockCol.getColumns().setAll(stockCountCol, stockAvailCol); + + var table = new TableView(); + table.getColumns().setAll(stateCol, indexCol, iconCol, brandCol, nameCol, priceCol, stockCol); + + return table; + } + + private MenuButton settingsMenu(TableView table) { + var resizePolicyCaption = new CaptionMenuItem("Resize Policy"); + var resizePolicyGroup = new ToggleGroup(); + resizePolicyGroup.selectedToggleProperty().addListener((obs, old, val) -> { + if (val != null && val.getUserData() instanceof Callback policy) { + //noinspection rawtypes,unchecked + table.setColumnResizePolicy((Callback) policy); + } + }); + + var unconstrainedResizeItem = new RadioMenuItem("Unconstrained"); + unconstrainedResizeItem.setToggleGroup(resizePolicyGroup); + unconstrainedResizeItem.setUserData(TableView.UNCONSTRAINED_RESIZE_POLICY); + unconstrainedResizeItem.setSelected(true); + + var constrainedResizeItem = new RadioMenuItem("Constrained"); + constrainedResizeItem.setToggleGroup(resizePolicyGroup); + constrainedResizeItem.setUserData(TableView.CONSTRAINED_RESIZE_POLICY); + + // ~ + + var selectionModeCaption = new CaptionMenuItem("Selection Mode"); + var selectionModeGroup = new ToggleGroup(); + selectionModeGroup.selectedToggleProperty().addListener((obs, old, val) -> { + if (val != null && val.getUserData() instanceof SelectionMode mode) { + table.getSelectionModel().setSelectionMode(mode); + } + }); + + var singleSelectionItem = new RadioMenuItem("Single"); + singleSelectionItem.setToggleGroup(selectionModeGroup); + singleSelectionItem.setUserData(SelectionMode.SINGLE); + + var multiSelectionItem = new RadioMenuItem("Multiple"); + multiSelectionItem.setToggleGroup(selectionModeGroup); + multiSelectionItem.setUserData(SelectionMode.MULTIPLE); + multiSelectionItem.setSelected(true); + + // ~ + + var editCellsItem = new CheckMenuItem("Editable"); + table.editableProperty().bind(editCellsItem.selectedProperty()); + editCellsItem.setSelected(true); + + var cellSelectionItem = new CheckMenuItem("Enable cell selection"); + table.getSelectionModel().cellSelectionEnabledProperty().bind(cellSelectionItem.selectedProperty()); + cellSelectionItem.setSelected(false); + + var menuButtonItem = new CheckMenuItem("Show menu button"); + table.tableMenuButtonVisibleProperty().bind(menuButtonItem.selectedProperty()); + menuButtonItem.setSelected(true); + + return new MenuButton("Settings") {{ + getItems().setAll( + resizePolicyCaption, + unconstrainedResizeItem, + constrainedResizeItem, + selectionModeCaption, + singleSelectionItem, + multiSelectionItem, + new SeparatorMenuItem(), + editCellsItem, + cellSelectionItem, + menuButtonItem + ); + }}; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/TextAreaPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/TextAreaPage.java new file mode 100644 index 0000000..05b09d7 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/TextAreaPage.java @@ -0,0 +1,86 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.scene.control.TextArea; +import javafx.scene.layout.FlowPane; + +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static atlantafx.base.theme.Styles.STATE_DANGER; +import static atlantafx.base.theme.Styles.STATE_SUCCESS; + +public class TextAreaPage extends AbstractPage { + + public static final String NAME = "TextArea"; + private static final double CONTROL_WIDTH = 200; + private static final double CONTROL_HEIGHT = 120; + + @Override + public String getName() { return NAME; } + + public TextAreaPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().setAll(samples()); + } + + private FlowPane samples() { + var basicArea = textArea("Text"); + basicArea.setWrapText(true); + var basicBlock = new SampleBlock("Basic", basicArea); + + var promptArea = textArea(null); + promptArea.setPromptText("Prompt text"); + var promptBlock = new SampleBlock("Prompt", promptArea); + + var scrollArea = textArea( + Stream.generate(() -> FAKER.lorem().paragraph()).limit(10).collect(Collectors.joining("\n")) + ); + scrollArea.setWrapText(false); + var scrollBlock = new SampleBlock("Scrolling", scrollArea); + + var readonlyArea = textArea("Text"); + readonlyArea.setEditable(false); + var readonlyBlock = new SampleBlock("Readonly", readonlyArea); + + var disabledArea = textArea("Text"); + disabledArea.setDisable(true); + var disabledBlock = new SampleBlock("Disabled", disabledArea); + + var successArea = textArea("Text"); + successArea.pseudoClassStateChanged(STATE_SUCCESS, true); + var successBlock = new SampleBlock("Success", successArea); + + var dangerArea = textArea("Text"); + dangerArea.pseudoClassStateChanged(STATE_DANGER, true); + var dangerBlock = new SampleBlock("Danger", dangerArea); + + var flowPane = new FlowPane(20, 20); + flowPane.getChildren().setAll( + basicBlock.getRoot(), + promptBlock.getRoot(), + scrollBlock.getRoot(), + readonlyBlock.getRoot(), + disabledBlock.getRoot(), + successBlock.getRoot(), + dangerBlock.getRoot() + ); + + return flowPane; + } + + private TextArea textArea(String text) { + var textArea = new TextArea(text); + textArea.setMinWidth(CONTROL_WIDTH); + textArea.setMinHeight(CONTROL_HEIGHT); + textArea.setMaxWidth(CONTROL_WIDTH); + textArea.setMaxHeight(CONTROL_HEIGHT); + return textArea; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/TextFieldPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/TextFieldPage.java new file mode 100644 index 0000000..ce10836 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/TextFieldPage.java @@ -0,0 +1,70 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.scene.control.PasswordField; +import javafx.scene.control.TextField; +import javafx.scene.layout.FlowPane; + +import static atlantafx.base.theme.Styles.STATE_DANGER; +import static atlantafx.base.theme.Styles.STATE_SUCCESS; + +public class TextFieldPage extends AbstractPage { + + public static final String NAME = "TextField"; + + @Override + public String getName() { return NAME; } + + public TextFieldPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().setAll(samples()); + } + + private FlowPane samples() { + var basicField = new TextField("Text"); + var basicBlock = new SampleBlock("Basic", basicField); + + var passwordField = new PasswordField(); + passwordField.setText("qwerty"); + var passwordBlock = new SampleBlock("Password", passwordField); + + var promptField = new TextField(); + promptField.setPromptText("Prompt text"); + var promptBlock = new SampleBlock("Prompt", promptField); + + var readonlyField = new TextField("Text"); + readonlyField.setEditable(false); + var readonlyBlock = new SampleBlock("Readonly", readonlyField); + + var disabledField = new TextField("Text"); + disabledField.setDisable(true); + var disabledBlock = new SampleBlock("Disabled", disabledField); + + var successField = new TextField("Text"); + successField.pseudoClassStateChanged(STATE_SUCCESS, true); + var successBlock = new SampleBlock("Success", successField); + + var dangerField = new TextField("Text"); + dangerField.pseudoClassStateChanged(STATE_DANGER, true); + var dangerBlock = new SampleBlock("Danger", dangerField); + + var flowPane = new FlowPane(20, 20); + flowPane.getChildren().setAll( + basicBlock.getRoot(), + passwordBlock.getRoot(), + promptBlock.getRoot(), + readonlyBlock.getRoot(), + disabledBlock.getRoot(), + successBlock.getRoot(), + dangerBlock.getRoot() + ); + + return flowPane; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/TitledPanePage.java b/sampler/src/main/java/atlantafx/sampler/page/components/TitledPanePage.java new file mode 100644 index 0000000..4ed94bc --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/TitledPanePage.java @@ -0,0 +1,120 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.base.controls.Spacer; +import atlantafx.sampler.page.AbstractPage; +import javafx.geometry.Pos; +import javafx.scene.control.CheckBox; +import javafx.scene.control.Label; +import javafx.scene.control.Slider; +import javafx.scene.control.TitledPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.Region; +import javafx.scene.layout.VBox; +import javafx.scene.text.Text; +import javafx.scene.text.TextFlow; + +import static atlantafx.base.theme.Styles.ELEVATED_2; +import static atlantafx.base.theme.Styles.INTERACTIVE; + +public class TitledPanePage extends AbstractPage { + + public static final String NAME = "TitledPane"; + private static final String ELEVATED_PREFIX = "elevated-"; + + @Override + public String getName() { return NAME; } + + public TitledPanePage() { + super(); + createView(); + } + + private void createView() { + var samples = new HBox(20, interactivePane(), disabledCard(), untitledCard()); + samples.getChildren().forEach(c -> ((TitledPane) c).setPrefSize(500, 120)); + + userContent.getChildren().setAll(new VBox(20, playground(), samples)); + } + + private TitledPane playground() { + var playground = new TitledPane(); + playground.setText("_Playground"); + playground.setMnemonicParsing(true); + playground.getStyleClass().add(ELEVATED_2); + + var textFlow = new TextFlow(new Text(FAKER.lorem().paragraph(10))); + textFlow.setMinHeight(Region.USE_PREF_SIZE); + textFlow.setMaxHeight(Region.USE_PREF_SIZE); + textFlow.setLineSpacing(5); + + var elevationSlider = new Slider(0, 4, 2); + elevationSlider.setShowTickLabels(true); + elevationSlider.setShowTickMarks(true); + elevationSlider.setMajorTickUnit(1); + elevationSlider.setBlockIncrement(1); + elevationSlider.setMinorTickCount(0); + elevationSlider.setSnapToTicks(true); + elevationSlider.setMinWidth(150); + elevationSlider.setMaxWidth(150); + elevationSlider.valueProperty().addListener((obs, old, val) -> { + playground.getStyleClass().removeAll( + playground.getStyleClass().stream().filter(c -> c.startsWith(ELEVATED_PREFIX)).toList() + ); + if (val == null) { return; } + int level = val.intValue(); + if (level > 0) { playground.getStyleClass().add(ELEVATED_PREFIX + level); } + }); + + // NOTE: + // Disabling 'collapsible' property leads to incorrect title layout, + // for some reason it still preserves arrow button gap. #javafx-bug + var collapseToggle = new ToggleSwitch("Collapsible"); + collapseToggle.setSelected(true); + playground.collapsibleProperty().bind(collapseToggle.selectedProperty()); + + var animateToggle = new ToggleSwitch("Animated"); + animateToggle.setSelected(true); + playground.animatedProperty().bind(animateToggle.selectedProperty()); + + var controls = new HBox(20); + controls.setMinHeight(80); + controls.setFillHeight(false); + controls.setAlignment(Pos.CENTER_LEFT); + controls.getChildren().setAll( + new Label("Elevation"), + elevationSlider, + new Spacer(), + collapseToggle, + animateToggle + ); + + var content = new VBox(20, textFlow, controls); + VBox.setVgrow(textFlow, Priority.ALWAYS); + playground.setContent(content); + + return playground; + } + + private TitledPane interactivePane() { + var titledPane = new TitledPane("Interactive", new Text("Hover here.")); + titledPane.setCollapsible(false); + titledPane.getStyleClass().add(INTERACTIVE); + return titledPane; + } + + private TitledPane disabledCard() { + var titledPane = new TitledPane("Disabled", new CheckBox("This checkbox is disabled.")); + titledPane.setCollapsible(false); + titledPane.setDisable(true); + return titledPane; + } + + private TitledPane untitledCard() { + var titledPane = new TitledPane("This pane has no title.", new Text()); + titledPane.setCollapsible(false); + return titledPane; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/ToggleButtonPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/ToggleButtonPage.java new file mode 100644 index 0000000..149d125 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/ToggleButtonPage.java @@ -0,0 +1,132 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.scene.control.Button; +import javafx.scene.control.ContentDisplay; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; + +import static atlantafx.base.theme.Styles.*; +import static atlantafx.sampler.util.Controls.toggleButton; +import static javafx.scene.layout.GridPane.REMAINING; + +public class ToggleButtonPage extends AbstractPage { + + public static final String NAME = "ToggleButton"; + + @Override + public String getName() { return NAME; } + + public ToggleButtonPage() { + super(); + createView(); + } + + private void createView() { + var grid = new GridPane(); + grid.setHgap(40); + grid.setVgap(40); + + grid.add(basicSample().getRoot(), 0, 0, REMAINING, 1); + grid.add(wizardSample().getRoot(), 0, 1); + grid.add(iconOnlySample().getRoot(), 1, 1); + grid.add(disabledSample().getRoot(), 0, 2); + + userContent.getChildren().addAll(grid); + } + + private SampleBlock basicSample() { + var threeButtonGroup = new ToggleGroup(); + + var leftPill = toggleButton("._left-pill", null, threeButtonGroup, true, LEFT_PILL); + leftPill.setMnemonicParsing(true); + leftPill.setOnAction(PRINT_SOURCE); + + var centerPill = toggleButton("._center-pill", null, threeButtonGroup, false, CENTER_PILL); + centerPill.setMnemonicParsing(true); + centerPill.setOnAction(PRINT_SOURCE); + + var rightPill = toggleButton("._right-pill", null, threeButtonGroup, false, RIGHT_PILL); + rightPill.setMnemonicParsing(true); + rightPill.setOnAction(PRINT_SOURCE); + + var threeButtonBox = new HBox(leftPill, centerPill, rightPill); + + var twoButtonGroup = new ToggleGroup(); + var twoButtonBox = new HBox( + toggleButton(".left-pill", null, twoButtonGroup, true, LEFT_PILL), + toggleButton(".right-pill", null, twoButtonGroup, false, RIGHT_PILL) + ); + + var content = new HBox(10); + content.getChildren().setAll(threeButtonBox, twoButtonBox); + + return new SampleBlock("Basic", content); + } + + private SampleBlock wizardSample() { + var group = new ToggleGroup(); + + var prevBtn = new Button("\f"); + prevBtn.getStyleClass().addAll(BUTTON_ICON, LEFT_PILL); + prevBtn.setGraphic(new FontIcon(Feather.CHEVRON_LEFT)); + prevBtn.setOnAction(e -> { + int selected = group.getToggles().indexOf(group.getSelectedToggle()); + if (selected > 0) { + group.selectToggle(group.getToggles().get(selected - 1)); + } + }); + + var nextBtn = new Button("\f"); + nextBtn.getStyleClass().addAll(BUTTON_ICON, RIGHT_PILL); + nextBtn.setGraphic(new FontIcon(Feather.CHEVRON_RIGHT)); + nextBtn.setContentDisplay(ContentDisplay.RIGHT); + nextBtn.setOnAction(e -> { + int selected = group.getToggles().indexOf(group.getSelectedToggle()); + if (selected < group.getToggles().size() - 1) { + group.selectToggle(group.getToggles().get(selected + 1)); + } + }); + + var wizard = new HBox( + prevBtn, + toggleButton("Music", Feather.MUSIC, group, true, CENTER_PILL), + toggleButton("Images", Feather.IMAGE, group, false, CENTER_PILL), + toggleButton("Videos", Feather.VIDEO, group, false, CENTER_PILL), + nextBtn + ); + group.selectedToggleProperty().addListener((obs, old, val) -> { + if (val == null) { old.setSelected(true); } + }); + + return new SampleBlock("Wizard", wizard); + } + + private SampleBlock iconOnlySample() { + var icons = new HBox( + toggleButton("", Feather.BOLD, null, true, BUTTON_ICON, LEFT_PILL), + toggleButton("", Feather.ITALIC, null, false, BUTTON_ICON, CENTER_PILL), + toggleButton("", Feather.UNDERLINE, null, false, BUTTON_ICON, RIGHT_PILL) + ); + + return new SampleBlock("Icon only", icons); + } + + private SampleBlock disabledSample() { + var group = new ToggleGroup(); + var content = new HBox( + toggleButton(".left-pill", null, group, false, LEFT_PILL), + toggleButton(".center-pill", null, group, false, CENTER_PILL), + toggleButton(".right-pill", null, group, true, RIGHT_PILL) + ); + content.getChildren().get(0).setDisable(true); + content.getChildren().get(1).setDisable(true); + + return new SampleBlock("Disabled", content); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/ToggleSwitchPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/ToggleSwitchPage.java new file mode 100644 index 0000000..7c76efb --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/ToggleSwitchPage.java @@ -0,0 +1,32 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.sampler.page.AbstractPage; +import javafx.geometry.Pos; +import javafx.scene.control.Label; +import javafx.scene.layout.VBox; + +public class ToggleSwitchPage extends AbstractPage { + + public static final String NAME = "ToggleSwitch"; + + @Override + public String getName() { return NAME; } + + public ToggleSwitchPage() { + super(); + createView(); + } + + private void createView() { + var toggle = new ToggleSwitch(); + toggle.selectedProperty().addListener((obs, old, val) -> toggle.setText(val ? "Disable" : "Enable")); + toggle.setSelected(true); + + var box = new VBox(20, new Label("Nothing fancy here."), toggle); + box.setAlignment(Pos.CENTER); + + userContent.getChildren().setAll(box); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/ToolBarPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/ToolBarPage.java new file mode 100644 index 0000000..cf34e87 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/ToolBarPage.java @@ -0,0 +1,285 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.Spacer; +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.base.theme.Styles; +import atlantafx.sampler.fake.SampleMenuBar; +import atlantafx.sampler.page.AbstractPage; +import javafx.application.Platform; +import javafx.collections.FXCollections; +import javafx.geometry.Orientation; +import javafx.geometry.Pos; +import javafx.geometry.Side; +import javafx.scene.Node; +import javafx.scene.control.*; +import javafx.scene.layout.*; +import javafx.scene.text.Font; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.ArrayList; +import java.util.stream.IntStream; + +import static atlantafx.base.theme.Styles.*; +import static atlantafx.sampler.util.Controls.*; +import static javafx.geometry.Orientation.HORIZONTAL; +import static javafx.geometry.Orientation.VERTICAL; + +public class ToolBarPage extends AbstractPage { + + public static final String NAME = "ToolBar"; + + @Override + public String getName() { return NAME; } + + private Side toolbarPos = Side.TOP; + + public ToolBarPage() { + super(); + createView(); + } + + private void createView() { + var toolbar = new ToolBar(toolBarButtons(HORIZONTAL)); + var toolbarLayer = new BorderPane(); + toolbarLayer.setTop(new TopBar(toolbar)); + + var controller = createController(toolbarLayer, toolbar); + controller.setPrefSize(500, 300); + var controllerLayer = new BorderPane(); + controllerLayer.setCenter(controller); + controllerLayer.setMaxSize(500, 300); + + var root = new StackPane(); + root.getStyleClass().add(Styles.BORDERED); + root.getChildren().addAll(toolbarLayer, controllerLayer); + VBox.setVgrow(root, Priority.ALWAYS); + + userContent.getChildren().setAll(root); + } + + private TitledPane createController(BorderPane borderPane, ToolBar toolbar) { + // == BUTTONS == + + var toTopBtn = new Button("", new FontIcon(Feather.ARROW_UP)); + toTopBtn.getStyleClass().addAll(BUTTON_ICON); + toTopBtn.setOnAction(e -> rotateToolbar(borderPane, toolbar, Side.TOP)); + + var toRightBtn = new Button("", new FontIcon(Feather.ARROW_RIGHT)); + toRightBtn.getStyleClass().addAll(BUTTON_ICON); + toRightBtn.setOnAction(e -> rotateToolbar(borderPane, toolbar, Side.RIGHT)); + + var toBottomBtn = new Button("", new FontIcon(Feather.ARROW_DOWN)); + toBottomBtn.getStyleClass().addAll(BUTTON_ICON); + toBottomBtn.setOnAction(e -> rotateToolbar(borderPane, toolbar, Side.BOTTOM)); + + var toLeftBtn = new Button("", new FontIcon(Feather.ARROW_LEFT)); + toLeftBtn.getStyleClass().addAll(BUTTON_ICON); + toLeftBtn.setOnAction(e -> rotateToolbar(borderPane, toolbar, Side.LEFT)); + + var appendBtn = new Button("", new FontIcon(Feather.PLUS)); + appendBtn.getStyleClass().addAll(BUTTON_ICON, ACCENT); + appendBtn.setOnAction(e -> { + if (toolbar.getOrientation() == HORIZONTAL) { + var textBtn = new Button(FAKER.animal().name(), new FontIcon(randomIcon())); + toolbar.getItems().add(textBtn); + } else { + var iconBtn = new Button("", new FontIcon(randomIcon())); + iconBtn.getStyleClass().addAll(BUTTON_ICON); + toolbar.getItems().add(iconBtn); + } + }); + + var buttonsPane = new BorderPane(); + buttonsPane.setMinSize(120, 120); + buttonsPane.setMaxSize(120, 120); + + buttonsPane.setTop(toTopBtn); + BorderPane.setAlignment(toTopBtn, Pos.CENTER); + + buttonsPane.setRight(toRightBtn); + BorderPane.setAlignment(toRightBtn, Pos.CENTER); + + buttonsPane.setBottom(toBottomBtn); + BorderPane.setAlignment(toBottomBtn, Pos.CENTER); + + buttonsPane.setLeft(toLeftBtn); + BorderPane.setAlignment(toLeftBtn, Pos.CENTER); + + buttonsPane.setCenter(appendBtn); + + // == TOGGLES == + + var menuBarToggle = new ToggleSwitch(); + menuBarToggle.selectedProperty().addListener((obs, old, value) -> { + TopBar topBar = (TopBar) borderPane.getTop(); + if (value) { + topBar.showOrCreateMenuBar(); + } else { + topBar.hideMenuBar(); + } + }); + + var disableToggle = new ToggleSwitch(); + disableToggle.selectedProperty().addListener((obs, old, val) -> { + if (val != null) { toolbar.setDisable(val); } + }); + + var togglesGrid = new GridPane(); + togglesGrid.setHgap(10); + togglesGrid.setVgap(10); + + togglesGrid.add(gridLabel("Show menu bar"), 0, 0); + togglesGrid.add(menuBarToggle, 1, 0); + + togglesGrid.add(gridLabel("Disable"), 0, 1); + togglesGrid.add(disableToggle, 1, 1); + + // == LAYOUT == + + var controls = new HBox(40, new Spacer(), buttonsPane, togglesGrid, new Spacer()); + controls.setAlignment(Pos.CENTER); + + var content = new VBox(10); + content.getChildren().setAll(controls); + content.setAlignment(Pos.CENTER); + + var root = new TitledPane("Controller", content); + root.setCollapsible(false); + + return root; + } + + private void rotateToolbar(BorderPane borderPane, ToolBar toolbar, Side pos) { + if (toolbarPos == pos) { return; } + + var topBar = (TopBar) borderPane.getTop(); + toolbarPos = pos; + + boolean changed = borderPane.getChildren().removeAll(toolbar); + if (!changed) { topBar.removeToolBar(); } + + // WARNING: + // Rotating existing buttons seems tempting, but it won't work. + // JavaFX doesn't recalculate their size correctly (even after + // reattaching controls to the scene), and you'll end up creating + // new objects anyway. + + Platform.runLater(() -> { + switch (pos) { + case TOP -> { + toolbar.setOrientation(HORIZONTAL); + Styles.addStyleClass(toolbar, TOP, RIGHT, BOTTOM, LEFT); + toolbar.getItems().setAll(toolBarButtons(HORIZONTAL)); + topBar.setToolBar(toolbar); + } + case RIGHT -> { + toolbar.setOrientation(VERTICAL); + Styles.addStyleClass(toolbar, RIGHT, TOP, BOTTOM, LEFT); + toolbar.getItems().setAll(toolBarButtons(VERTICAL)); + borderPane.setRight(toolbar); + } + case BOTTOM -> { + toolbar.setOrientation(HORIZONTAL); + Styles.addStyleClass(toolbar, BOTTOM, TOP, RIGHT, LEFT); + toolbar.getItems().setAll(toolBarButtons(HORIZONTAL)); + borderPane.setBottom(toolbar); + } + case LEFT -> { + toolbar.setOrientation(VERTICAL); + Styles.addStyleClass(toolbar, LEFT, RIGHT, TOP, BOTTOM); + toolbar.getItems().setAll(toolBarButtons(VERTICAL)); + borderPane.setLeft(toolbar); + } + } + }); + } + + public Node[] toolBarButtons(Orientation orientation) { + var result = new ArrayList(); + result.add(iconButton(Feather.FILE, false)); + result.add(iconButton(Feather.FOLDER, false)); + result.add(iconButton(Feather.SAVE, false)); + result.add(new Separator()); + + if (orientation == HORIZONTAL) { + result.add(button("Undo", null, false)); + result.add(button("Redo", null, true)); + + result.add(new Separator()); + + var group = new ToggleGroup(); + result.add(toggleButton("", Feather.BOLD, null, true, BUTTON_ICON, LEFT_PILL)); + result.add(toggleButton("", Feather.ITALIC, null, false, BUTTON_ICON, CENTER_PILL)); + result.add(toggleButton("", Feather.UNDERLINE, null, false, BUTTON_ICON, RIGHT_PILL)); + + result.add(new Spacer(5)); + var fontCombo = new ComboBox<>(FXCollections.observableArrayList(Font.getFamilies())); + fontCombo.setPrefWidth(150); + fontCombo.getSelectionModel().selectFirst(); + result.add(fontCombo); + + var settingsMenu = new MenuButton("Settings", new FontIcon(Feather.SETTINGS), menuItems(5)); + settingsMenu.getStyleClass().add(FLAT); + result.add(new Spacer()); + result.add(settingsMenu); + } + + if (orientation == VERTICAL) { + result.add(iconButton(Feather.CORNER_DOWN_LEFT, false)); + result.add(iconButton(Feather.CORNER_DOWN_RIGHT, true)); + result.add(new Spacer(orientation)); + result.add(iconButton(Feather.SETTINGS, false)); + } + + return result.toArray(Node[]::new); + } + + private Label gridLabel(String text) { + var label = new Label(text); + label.setAlignment(Pos.CENTER_RIGHT); + label.setMaxWidth(Double.MAX_VALUE); + return label; + } + + public static MenuItem[] menuItems(int count) { + return IntStream.range(0, count).mapToObj(i -> new MenuItem(FAKER.babylon5().character())).toArray(MenuItem[]::new); + } + + /////////////////////////////////////////////////////////////////////////// + + public static class TopBar extends VBox { + + private static final Region DUMMY_MENUBAR = new Region(); + private static final Region DUMMY_TOOLBAR = new Region(); + + public TopBar(ToolBar toolBar) { + super(); + getChildren().setAll(DUMMY_MENUBAR, toolBar); + } + + public void showOrCreateMenuBar() { + if (getChildren().get(0) instanceof MenuBar menuBar) { + menuBar.setVisible(true); + menuBar.setManaged(true); + } else { + getChildren().set(0, new SampleMenuBar(FAKER)); + } + } + + public void hideMenuBar() { + var any = getChildren().get(0); + any.setVisible(false); + any.setManaged(false); + } + + public void setToolBar(ToolBar toolBar) { + getChildren().set(1, toolBar); + } + + public void removeToolBar() { + getChildren().set(1, DUMMY_TOOLBAR); + } + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/TooltipPage.java b/sampler/src/main/java/atlantafx/sampler/page/components/TooltipPage.java new file mode 100644 index 0000000..a5683d4 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/TooltipPage.java @@ -0,0 +1,103 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.geometry.Pos; +import javafx.scene.control.Label; +import javafx.scene.control.Separator; +import javafx.scene.control.Tooltip; +import javafx.scene.layout.FlowPane; +import javafx.stage.PopupWindow.AnchorLocation; +import javafx.util.Duration; + +import static javafx.geometry.Orientation.VERTICAL; + +public class TooltipPage extends AbstractPage { + + public static final String NAME = "Tooltip"; + + @Override + public String getName() { return NAME; } + + public TooltipPage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().setAll( + basicSamples(), + positionSamples().getRoot() + ); + } + + private FlowPane basicSamples() { + var basicTooltip = new Tooltip(FAKER.harryPotter().spell()); + basicTooltip.setHideDelay(Duration.seconds(3)); + var basicLabel = label("Hover me"); + basicLabel.setTooltip(basicTooltip); + var basicBlock = new SampleBlock("Basic", basicLabel); + + var textWrapTooltip = new Tooltip(FAKER.lorem().paragraph(5)); + textWrapTooltip.setHideDelay(Duration.seconds(3)); + textWrapTooltip.setPrefWidth(200); + textWrapTooltip.setWrapText(true); + var textWrapLabel = label("Hover me"); + textWrapLabel.setTooltip(textWrapTooltip); + var textWrapBlock = new SampleBlock("Text wrapping", textWrapLabel); + + var indefiniteTooltip = new Tooltip(FAKER.harryPotter().spell()); + indefiniteTooltip.setHideDelay(Duration.INDEFINITE); + var indefiniteLabel = label("Hover me"); + indefiniteLabel.setTooltip(basicTooltip); + var indefiniteBlock = new SampleBlock("Indefinite", indefiniteLabel); + + return new FlowPane(20, 10, + basicBlock.getRoot(), + textWrapBlock.getRoot(), + indefiniteBlock.getRoot() + ); + } + + private SampleBlock positionSamples() { + var topLeftLabel = label("Top Left"); + topLeftLabel.setTooltip(tooltip("Top Left", AnchorLocation.WINDOW_BOTTOM_RIGHT)); + + var topRightLabel = label("Top Right"); + topRightLabel.setTooltip(tooltip("Top Right", AnchorLocation.WINDOW_BOTTOM_LEFT)); + + var bottomLeftLabel = label("Bottom Left"); + bottomLeftLabel.setTooltip(tooltip("Bottom Left", AnchorLocation.WINDOW_TOP_RIGHT)); + + var bottomRightLabel = label("Bottom Right"); + bottomRightLabel.setTooltip(tooltip("Bottom Right", AnchorLocation.WINDOW_TOP_LEFT)); + + var flowPane = new FlowPane(20, 10); + flowPane.getChildren().setAll( + topLeftLabel, + new Separator(VERTICAL), + topRightLabel, + new Separator(VERTICAL), + bottomLeftLabel, + new Separator(VERTICAL), + bottomRightLabel + ); + + return new SampleBlock("Position", flowPane); + } + + private Label label(String text) { + Label label = new Label(text); + label.setMinWidth(50); + label.setMinHeight(50); + label.setAlignment(Pos.CENTER_LEFT); + return label; + } + + private Tooltip tooltip(String text, AnchorLocation anchorLocation) { + var tooltip = new Tooltip(text); + tooltip.setAnchorLocation(anchorLocation); + return tooltip; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/TreePage.java b/sampler/src/main/java/atlantafx/sampler/page/components/TreePage.java new file mode 100644 index 0000000..0be72bc --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/TreePage.java @@ -0,0 +1,282 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.base.controls.Spacer; +import atlantafx.sampler.page.AbstractPage; +import javafx.geometry.Orientation; +import javafx.scene.control.*; +import javafx.scene.control.cell.CheckBoxTreeCell; +import javafx.scene.control.cell.ChoiceBoxTreeCell; +import javafx.scene.control.cell.ComboBoxTreeCell; +import javafx.scene.control.cell.TextFieldTreeCell; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.util.StringConverter; +import org.kordamp.ikonli.feather.Feather; +import org.kordamp.ikonli.javafx.FontIcon; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Supplier; + +public class TreePage extends AbstractPage { + + public static final String NAME = "TreeView"; + private static final int MAX_TREE_DEPTH = 3; + private static final int[] TREE_DICE = { -1, 0, 1 }; + + @Override + public String getName() { + return NAME; + } + + private VBox playground; + private ComboBox exampleSelect; + + public TreePage() { + super(); + createView(); + } + + private void createView() { + exampleSelect = exampleSelect(); + playground = playground(exampleSelect); + userContent.getChildren().setAll(playground); + } + + @Override + protected void onRendered() { + super.onRendered(); + exampleSelect.getSelectionModel().selectFirst(); + } + + private VBox playground(ComboBox exampleSelect) { + var playground = new VBox(10); + playground.setMinHeight(100); + + var showRootToggle = new ToggleSwitch("Show root"); + showRootToggle.selectedProperty().addListener((obs, old, val) -> findDisplayedTree().ifPresent(tv -> { + if (val != null) { tv.setShowRoot(val); } + })); + showRootToggle.setSelected(true); + + var disableToggle = new ToggleSwitch("Disable"); + disableToggle.selectedProperty().addListener((obs, old, val) -> findDisplayedTree().ifPresent(tv -> { + if (val != null) { tv.setDisable(val); } + })); + + var controls = new HBox(20, + new Spacer(), + showRootToggle, + disableToggle, + new Spacer() + ); + + playground.getChildren().setAll( + new Label("Select an example:"), + exampleSelect, + new Spacer(Orientation.VERTICAL), // placeholder for TreeView + controls + ); + + return playground; + } + + private ComboBox exampleSelect() { + var select = new ComboBox(); + select.setMaxWidth(Double.MAX_VALUE); + select.getItems().setAll(Example.values()); + select.getSelectionModel().selectedItemProperty().addListener((obs, old, val) -> { + if (val == null) { return; } + if (playground.getChildren().size() != 4) { + throw new RuntimeException("Unexpected container size."); + } + + TreeView newTree = createTree(val); + + // copy existing style classes and properties to the new tree + findDisplayedTree().ifPresent(tv -> { + List currentStyles = tv.getStyleClass(); + currentStyles.remove("tree-view"); + newTree.getStyleClass().addAll(currentStyles); + + newTree.setShowRoot(tv.isShowRoot()); + newTree.setDisable(tv.isDisable()); + }); + + playground.getChildren().set(2, newTree); + }); + select.setConverter(new StringConverter<>() { + + @Override + public String toString(Example example) { + return example == null ? "" : example.getName(); + } + + @Override + public Example fromString(String s) { + return Example.find(s); + } + }); + + return select; + } + + private Optional> findDisplayedTree() { + if (playground == null) { return Optional.empty(); } + return playground.getChildren().stream() + .filter(c -> c instanceof TreeView) + .findFirst() + .map(c -> (TreeView) c); + } + + private TreeView createTree(Example example) { + switch (example) { + case TEXT -> { return stringTree(); } + case GRAPHIC -> { return graphicTree(); } + case EDITABLE -> { return editableTree(); } + case CHECK_BOX -> { return checkBoxTree(); } + case CHOICE_BOX -> { return choiceBoxTree(); } + case COMBO_BOX -> { return comboBoxTree(); } + default -> throw new IllegalArgumentException("Unexpected enum value: " + example); + } + } + + private void generateTree(TreeItem parent, Supplier> supplier, int limit, int depth) { + if (limit == 0) { return; } + + var item = supplier.get(); + parent.getChildren().add(item); + + TreeItem nextParent = parent; // sibling + int nextDepth = depth; + int rand = TREE_DICE[RANDOM.nextInt(TREE_DICE.length)]; + + if (rand < 0 && parent.getParent() != null) { // go up + nextParent = parent.getParent(); + nextDepth = --depth; + } + if (rand > 0 && depth < MAX_TREE_DEPTH) { // go down + nextParent = item; + nextDepth = ++depth; + } + + generateTree(nextParent, supplier, --limit, nextDepth); + } + + private TreeView stringTree() { + var root = new TreeItem<>("root"); + root.setExpanded(true); + + var tree = new TreeView(); + + generateTree(root, () -> new TreeItem<>(FAKER.internet().domainWord()), 30, 1); + tree.setRoot(root); + + return tree; + } + + private TreeView graphicTree() { + var root = new TreeItem<>("root", new FontIcon(Feather.FOLDER)); + root.setExpanded(true); + + var tree = new TreeView(); + + generateTree(root, () -> new TreeItem<>(FAKER.internet().domainWord(), new FontIcon(Feather.FILE)), 30, 1); + tree.setRoot(root); + + return tree; + } + + private TreeView editableTree() { + var root = new TreeItem<>("root", new FontIcon(Feather.FOLDER)); + root.setExpanded(true); + + var tree = new TreeView(); + tree.setCellFactory(TextFieldTreeCell.forTreeView()); + tree.setEditable(true); + + generateTree(root, () -> new TreeItem<>(FAKER.internet().domainWord(), new FontIcon(Feather.FILE)), 30, 1); + tree.setRoot(root); + + return tree; + } + + // Note that CheckBoxTreeCell is incompatible with user graphic, + // because it adds graphic inside .checkbox container. #javafx-bug + private TreeView checkBoxTree() { + var root = new CheckBoxTreeItem<>("root"); + root.setExpanded(true); + + var tree = new TreeView(); + tree.setCellFactory(CheckBoxTreeCell.forTreeView()); + + generateTree(root, () -> new CheckBoxTreeItem<>(FAKER.internet().domainWord()), 30, 1); + tree.setRoot(root); + + return tree; + } + + private TreeView choiceBoxTree() { + var root = new TreeItem<>("root"); + root.setExpanded(true); + + var tree = new TreeView(); + tree.setCellFactory(ChoiceBoxTreeCell.forTreeView( + generate(() -> FAKER.internet().domainWord(), 10).toArray(String[]::new) + )); + tree.setEditable(true); + + generateTree(root, () -> new TreeItem<>(FAKER.internet().domainWord()), 30, 1); + tree.setRoot(root); + + return tree; + } + + private TreeView comboBoxTree() { + var root = new TreeItem<>("root", new FontIcon(Feather.FOLDER)); + root.setExpanded(true); + + var tree = new TreeView(); + tree.setCellFactory(ComboBoxTreeCell.forTreeView( + generate(() -> FAKER.internet().domainWord(), 10).toArray(String[]::new) + )); + tree.setEditable(true); + + generateTree(root, () -> new TreeItem<>(FAKER.internet().domainWord(), new FontIcon(Feather.FILE)), 30, 1); + tree.setRoot(root); + + return tree; + } + + /////////////////////////////////////////////////////////////////////////// + + private enum Example { + TEXT("Text"), + GRAPHIC("Text with icons"), + EDITABLE("TextFieldTreeCell"), + CHECK_BOX("CheckBoxTreeCell"), + CHOICE_BOX("ChoiceBoxTreeCell"), + COMBO_BOX("ComboBoxTreeCell"); + + private final String name; + + Example(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public static Example find(String name) { + return Arrays.stream(Example.values()) + .filter(example -> Objects.equals(example.getName(), name)) + .findFirst() + .orElse(null); + } + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/components/TreeTablePage.java b/sampler/src/main/java/atlantafx/sampler/page/components/TreeTablePage.java new file mode 100644 index 0000000..6eaeb02 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/components/TreeTablePage.java @@ -0,0 +1,236 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.components; + +import atlantafx.base.controls.CaptionMenuItem; +import atlantafx.base.controls.Spacer; +import atlantafx.base.controls.ToggleSwitch; +import atlantafx.sampler.fake.domain.Product; +import atlantafx.sampler.page.AbstractPage; +import javafx.beans.property.SimpleStringProperty; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.control.cell.*; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.util.Callback; + +import java.util.List; +import java.util.stream.IntStream; + +import static atlantafx.base.theme.Styles.*; + +public class TreeTablePage extends AbstractPage { + + public static final String NAME = "TreeTableView"; + + @Override + public String getName() { return NAME; } + + private TreeTableView treeTable; + + public TreeTablePage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().setAll( + playground() + ); + } + + private VBox playground() { + var bordersToggle = new ToggleSwitch("Bordered"); + bordersToggle.selectedProperty().addListener((obs, old, val) -> toggleStyleClass(treeTable, BORDERED)); + + var denseToggle = new ToggleSwitch("Dense"); + denseToggle.selectedProperty().addListener((obs, old, val) -> toggleStyleClass(treeTable, DENSE)); + + var stripesToggle = new ToggleSwitch("Striped"); + stripesToggle.selectedProperty().addListener((obs, old, val) -> toggleStyleClass(treeTable, STRIPED)); + + var disableToggle = new ToggleSwitch("Disable"); + disableToggle.selectedProperty().addListener((obs, old, val) -> { + if (val != null) { treeTable.setDisable(val); } + }); + + var togglesBox = new HBox(20, + bordersToggle, + denseToggle, + stripesToggle, + disableToggle + ); + togglesBox.setAlignment(Pos.CENTER_LEFT); + + // ~ + + var rootVal = Product.empty(0); + rootVal.setBrand("Root"); + var root = new TreeItem<>(rootVal); + + for (int idx = 1; idx <= FAKER.random().nextInt(5, 10); idx++) { + String brand = FAKER.commerce().brand(); + var groupVal = Product.empty(0); + groupVal.setBrand(brand); + + var group = new TreeItem<>(groupVal); + group.getChildren().setAll( + treeItems(idx * 100, FAKER.random().nextInt(5, 10), brand) + ); + root.getChildren().add(group); + } + + treeTable = treeTable(); + treeTable.setRoot(root); + + // ~ + + var topBox = new HBox( + new Label("Example:"), + new Spacer(), + settingsMenu(treeTable) + ); + topBox.setAlignment(Pos.CENTER_LEFT); + + var playground = new VBox(10); + playground.setMinHeight(100); + playground.getChildren().setAll( + topBox, + treeTable, + togglesBox + ); + + return playground; + } + + private List> treeItems(int startId, int count, String brand) { + return IntStream.range(startId, startId + count + 1).boxed() + .map(id -> Product.random(id, brand, FAKER)) + .map(TreeItem::new) + .toList(); + } + + @SuppressWarnings("unchecked") + private TreeTableView treeTable() { + var arrowCol = new TreeTableColumn("#"); + // This is placeholder column for disclosure nodes. We need to fill it + // with empty strings or all .tree-table-cell will be marked as :empty, + // which in turn leads to absent borders. + arrowCol.setCellValueFactory(cell -> new SimpleStringProperty("")); + arrowCol.setMinWidth(50); + arrowCol.setMaxWidth(50); + + var stateCol = new TreeTableColumn("Selected"); + stateCol.setCellValueFactory(new TreeItemPropertyValueFactory<>("state")); + stateCol.setCellFactory(CheckBoxTreeTableCell.forTreeTableColumn(stateCol)); + stateCol.setEditable(true); + + var idCol = new TreeTableColumn("ID"); + idCol.setCellValueFactory(cell -> { + Product product = cell.getValue().getValue(); + return new SimpleStringProperty( + product != null && product.getId() != 0 ? String.valueOf(product.getId()) : "" + ); + }); + idCol.setEditable(false); + idCol.setMinWidth(80); + + var brandCol = new TreeTableColumn("Brand ✎"); + brandCol.setCellValueFactory(new TreeItemPropertyValueFactory<>("brand")); + brandCol.setCellFactory(ChoiceBoxTreeTableCell.forTreeTableColumn( + generate(() -> FAKER.commerce().brand(), 10).toArray(String[]::new) + )); + brandCol.setEditable(true); + + var nameCol = new TreeTableColumn("Name ✎"); + nameCol.setCellValueFactory(new TreeItemPropertyValueFactory<>("name")); + nameCol.setCellFactory(ComboBoxTreeTableCell.forTreeTableColumn( + generate(() -> FAKER.commerce().productName(), 10).toArray(String[]::new) + )); + nameCol.setEditable(true); + nameCol.setMinWidth(200); + + var priceCol = new TreeTableColumn("Price ✎"); + priceCol.setCellValueFactory(new TreeItemPropertyValueFactory<>("price")); + priceCol.setCellFactory(TextFieldTreeTableCell.forTreeTableColumn()); + priceCol.setEditable(true); + + var table = new TreeTableView(); + table.getColumns().setAll(arrowCol, stateCol, brandCol, idCol, nameCol, priceCol); + + return table; + } + + private MenuButton settingsMenu(TreeTableView treeTable) { + var resizePolicyCaption = new CaptionMenuItem("Resize Policy"); + var resizePolicyGroup = new ToggleGroup(); + resizePolicyGroup.selectedToggleProperty().addListener((obs, old, val) -> { + if (val != null && val.getUserData() instanceof Callback policy) { + //noinspection rawtypes,unchecked + treeTable.setColumnResizePolicy((Callback) policy); + } + }); + + var unconstrainedResizeItem = new RadioMenuItem("Unconstrained"); + unconstrainedResizeItem.setToggleGroup(resizePolicyGroup); + unconstrainedResizeItem.setUserData(TreeTableView.UNCONSTRAINED_RESIZE_POLICY); + unconstrainedResizeItem.setSelected(true); + + var constrainedResizeItem = new RadioMenuItem("Constrained"); + constrainedResizeItem.setToggleGroup(resizePolicyGroup); + constrainedResizeItem.setUserData(TreeTableView.CONSTRAINED_RESIZE_POLICY); + + // ~ + + var selectionModeCaption = new CaptionMenuItem("Selection Mode"); + var selectionModeGroup = new ToggleGroup(); + selectionModeGroup.selectedToggleProperty().addListener((obs, old, val) -> { + if (val != null && val.getUserData() instanceof SelectionMode mode) { + treeTable.getSelectionModel().setSelectionMode(mode); + } + }); + + var singleSelectionItem = new RadioMenuItem("Single"); + singleSelectionItem.setToggleGroup(selectionModeGroup); + singleSelectionItem.setUserData(SelectionMode.SINGLE); + + var multiSelectionItem = new RadioMenuItem("Multiple"); + multiSelectionItem.setToggleGroup(selectionModeGroup); + multiSelectionItem.setUserData(SelectionMode.MULTIPLE); + multiSelectionItem.setSelected(true); + + // ~ + + var showRootItem = new CheckMenuItem("Show root"); + treeTable.showRootProperty().bind(showRootItem.selectedProperty()); + showRootItem.setSelected(true); + + var editCellsItem = new CheckMenuItem("Editable"); + treeTable.editableProperty().bind(editCellsItem.selectedProperty()); + editCellsItem.setSelected(true); + + var cellSelectionItem = new CheckMenuItem("Enable cell selection"); + treeTable.getSelectionModel().cellSelectionEnabledProperty().bind(cellSelectionItem.selectedProperty()); + cellSelectionItem.setSelected(false); + + var menuButtonItem = new CheckMenuItem("Show menu button"); + treeTable.tableMenuButtonVisibleProperty().bind(menuButtonItem.selectedProperty()); + menuButtonItem.setSelected(true); + + return new MenuButton("Settings") {{ + getItems().setAll( + resizePolicyCaption, + unconstrainedResizeItem, + constrainedResizeItem, + selectionModeCaption, + singleSelectionItem, + multiSelectionItem, + new SeparatorMenuItem(), + showRootItem, + editCellsItem, + cellSelectionItem, + menuButtonItem + ); + }}; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/general/ThemePage.java b/sampler/src/main/java/atlantafx/sampler/page/general/ThemePage.java new file mode 100755 index 0000000..15b995e --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/general/ThemePage.java @@ -0,0 +1,108 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.general; + +import atlantafx.base.theme.Theme; +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.theme.ThemeManager; +import javafx.scene.control.ChoiceBox; +import javafx.scene.control.Label; +import javafx.scene.control.Spinner; +import javafx.scene.layout.GridPane; +import javafx.util.StringConverter; + +import java.util.Objects; + +public class ThemePage extends AbstractPage { + + public static final String NAME = "Theme"; + + @Override + public String getName() { return NAME; } + + public ThemePage() { + super(); + createView(); + } + + private void createView() { + userContent.getChildren().add(optionsGrid()); + sourceCodeToggleBtn.setVisible(false); + } + + private GridPane optionsGrid() { + ChoiceBox themeSelector = themeSelector(); + themeSelector.setPrefWidth(200); + + Spinner fontSizeSpinner = fontSizeSpinner(); + fontSizeSpinner.getStyleClass().add(Spinner.STYLE_CLASS_SPLIT_ARROWS_HORIZONTAL); + fontSizeSpinner.setPrefWidth(200); + + // ~ + + var grid = new GridPane(); + grid.setVgap(20); + grid.setHgap(20); + + grid.add(new Label("Color theme"), 0, 0); + grid.add(themeSelector, 1, 0); + + grid.add(new Label("Font size"), 0, 1); + grid.add(fontSizeSpinner, 1, 1); + + return grid; + } + + private ChoiceBox themeSelector() { + var manager = ThemeManager.getInstance(); + var selector = new ChoiceBox(); + selector.getItems().setAll(manager.getAvailableThemes()); + selector.getSelectionModel().selectedItemProperty().addListener((obs, old, val) -> { + if (val != null && getScene() != null) { + ThemeManager.getInstance().setTheme(getScene(), val); + } + }); + + selector.setConverter(new StringConverter<>() { + @Override + public String toString(Theme theme) { + return theme.getName(); + } + + @Override + public Theme fromString(String themeName) { + return manager.getAvailableThemes().stream().filter(t -> Objects.equals(themeName, t.getName())) + .findFirst() + .orElse(null); + } + }); + + // select current theme + if (manager.getTheme() != null) { + selector.getItems().stream() + .filter(t -> Objects.equals(manager.getTheme().getName(), t.getName())) + .findFirst() + .ifPresent(t -> selector.getSelectionModel().select(t)); + } + + return selector; + } + + private Spinner fontSizeSpinner() { + var spinner = new Spinner(10, 24, 14); + + // Instead of this we should obtain font size from a rendered node. + // But since it's not trivial (thanks to JavaFX doesn't expose relevant API) + // we just keep current font size inside ThemeManager singleton. + // It works fine if ThemeManager default font size value matches + // default theme font size value. + spinner.getValueFactory().setValue(ThemeManager.getInstance().getFontSize()); + + spinner.valueProperty().addListener((obs, old, val) -> { + if (val != null && getScene() != null) { + ThemeManager.getInstance().setFontSize(getScene(), val); + } + }); + + return spinner; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/general/TypographyPage.java b/sampler/src/main/java/atlantafx/sampler/page/general/TypographyPage.java new file mode 100755 index 0000000..358f1ed --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/general/TypographyPage.java @@ -0,0 +1,160 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.general; + +import atlantafx.sampler.page.AbstractPage; +import atlantafx.sampler.page.SampleBlock; +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.control.Hyperlink; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.text.Text; +import javafx.scene.text.TextFlow; + +import static atlantafx.base.theme.Styles.*; + +public class TypographyPage extends AbstractPage { + + public static final String NAME = "Typography"; + + @Override + public String getName() { return NAME; } + + private GridPane fontSizeBox; + + public TypographyPage() { + super(); + createView(); + } + + private void createView() { + var fontSizeSample = fontSizeSample(); + fontSizeBox = (GridPane) fontSizeSample.getContent(); + + userContent.getChildren().setAll( + fontSizeSample.getRoot(), + fontWeightSample().getRoot(), + fontStyleSample().getRoot(), + hyperlinkSample().getRoot(), + textColorSample().getRoot(), + textFlowSample().getRoot() + ); + } + + private SampleBlock fontSizeSample() { + var grid = new GridPane(); + grid.setHgap(40); + grid.setVgap(10); + + grid.add(text("Title 1", TITLE_1), 0, 0); + grid.add(text("Title 2", TITLE_2), 0, 1); + grid.add(text("Title 3", TITLE_3), 0, 2); + grid.add(text("Title 4", TITLE_4), 0, 3); + + grid.add(text("Caption", TEXT_CAPTION), 1, 0); + grid.add(text("Default"), 1, 1); + grid.add(text("Small", TEXT_SMALL), 1, 2); + + grid.setAlignment(Pos.BASELINE_LEFT); + + return new SampleBlock("Font size", grid); + } + + private SampleBlock fontWeightSample() { + var box = new HBox(10, + text("Bold", TEXT_BOLD), + text("Bolder", TEXT_BOLDER), + text("Normal", TEXT_NORMAL), + text("Lighter", TEXT_LIGHTER) + ); + box.setAlignment(Pos.BASELINE_LEFT); + + return new SampleBlock("Font weight", box); + } + + private SampleBlock fontStyleSample() { + var box = new HBox(10, + text("Italic", TEXT_ITALIC), + text("Oblique", TEXT_OBLIQUE), + text("Underlined", TEXT_UNDERLINED), + text("Strikethrough", TEXT_STRIKETHROUGH) + ); + box.setAlignment(Pos.BASELINE_LEFT); + + return new SampleBlock("Font style", box); + } + + private SampleBlock textColorSample() { + var box = new HBox(10, + text("Accent", TEXT, ACCENT), + text("Success", TEXT, SUCCESS), + text("Warning", TEXT, WARNING), + text("Danger", TEXT, DANGER) + ); + box.setAlignment(Pos.BASELINE_LEFT); + + return new SampleBlock("Text color", box); + } + + private SampleBlock hyperlinkSample() { + var linkNormal = hyperlink("_Normal", false, false); + linkNormal.setMnemonicParsing(true); + + var linkVisited = hyperlink("_Visited", true, false); + linkVisited.setMnemonicParsing(true); + + var box = new HBox(10, + linkNormal, + linkVisited, + hyperlink("Disabled", false, true) + ); + box.setAlignment(Pos.BASELINE_LEFT); + + return new SampleBlock("Hyperlink", box); + } + + private Text text(String text, String... styleClasses) { + var t = new Text(text); + t.getStyleClass().addAll(styleClasses); + return t; + } + + private Hyperlink hyperlink(String text, boolean visited, boolean disabled) { + var h = new Hyperlink(text); + h.setVisited(visited); + h.setDisable(disabled); + return h; + } + + private SampleBlock textFlowSample() { + var textFlow = new TextFlow( + new Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. "), + new Hyperlink("Vivamus at lorem"), + new Text(" in urna facilisis aliquam. Morbi ut "), + new Hyperlink("velit"), + new Text(" iaculis erat cursus molestie eget laoreet quam. "), + new Text(" Vivamus eu nulla sapien. Sed et malesuada augue. Nullam nec "), + new Hyperlink("consectetur"), + new Text(" "), + new Hyperlink("ipsum"), + new Text(", eget facilisis enim. Suspendisse potenti. Nulla euismod, nisl sed dapibus pretium, augue ligula finibus arcu, in iaculis nulla neque a est. Sed in rutrum diam. Donec quis arcu molestie, facilisis ex fringilla, "), + new Hyperlink("volutpat velit"), + new Text(".") + ); + + return new SampleBlock("Text flow", textFlow); + } + + // font metrics can only be obtained by requesting from a rendered node + protected void onRendered() { + for (Node node : fontSizeBox.getChildren()) { + if (node instanceof Text textNode) { + var font = textNode.getFont(); + textNode.setText(String.format("%s = %.1fpx", + textNode.getText(), + Math.ceil(font.getSize()) + )); + } + } + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/showcase/Chat.java b/sampler/src/main/java/atlantafx/sampler/page/showcase/Chat.java new file mode 100644 index 0000000..27a8bb1 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/showcase/Chat.java @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.showcase; + +import atlantafx.sampler.page.AbstractPage; + +public class Chat extends AbstractPage { + + public static final String NAME = "Chat"; + + public Chat() { + super(); + createView(); + } + + private void createView() { + } + + @Override + public String getName() { + return NAME; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/showcase/FileManager.java b/sampler/src/main/java/atlantafx/sampler/page/showcase/FileManager.java new file mode 100644 index 0000000..cd50dff --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/showcase/FileManager.java @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.showcase; + +import atlantafx.sampler.page.AbstractPage; + +public class FileManager extends AbstractPage { + + public static final String NAME = "File Manager"; + + public FileManager() { + super(); + createView(); + } + + private void createView() { + } + + @Override + public String getName() { + return NAME; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/showcase/MusicPlayer.java b/sampler/src/main/java/atlantafx/sampler/page/showcase/MusicPlayer.java new file mode 100644 index 0000000..bb510b8 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/showcase/MusicPlayer.java @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.showcase; + +import atlantafx.sampler.page.AbstractPage; + +public class MusicPlayer extends AbstractPage { + + public static final String NAME = "Music Player"; + + public MusicPlayer() { + super(); + createView(); + } + + private void createView() { + } + + @Override + public String getName() { + return NAME; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/page/showcase/TextEditor.java b/sampler/src/main/java/atlantafx/sampler/page/showcase/TextEditor.java new file mode 100644 index 0000000..90a1e48 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/page/showcase/TextEditor.java @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.page.showcase; + +import atlantafx.sampler.page.AbstractPage; + +public class TextEditor extends AbstractPage { + + public static final String NAME = "Text Editor"; + + public TextEditor() { + super(); + createView(); + } + + private void createView() { + } + + @Override + public String getName() { + return NAME; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/theme/ExternalTheme.java b/sampler/src/main/java/atlantafx/sampler/theme/ExternalTheme.java new file mode 100644 index 0000000..9e209aa --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/theme/ExternalTheme.java @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.theme; + +import atlantafx.base.theme.AbstractTheme; + +import java.net.URI; +import java.util.Objects; +import java.util.Set; + +public class ExternalTheme extends AbstractTheme { + + private final String name; + private final String stylesheet; + private final boolean darkMode; + + public ExternalTheme(String name, String stylesheet, Set stylesheets, boolean darkMode) { + super(stylesheets); + + this.name = Objects.requireNonNull(name); + this.stylesheet = Objects.requireNonNull(stylesheet); + this.darkMode = darkMode; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getUserAgentStylesheet() { + return stylesheet; + } + + @Override + public boolean isDarkMode() { + return darkMode; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/theme/HighlightJSTheme.java b/sampler/src/main/java/atlantafx/sampler/theme/HighlightJSTheme.java new file mode 100644 index 0000000..f40d637 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/theme/HighlightJSTheme.java @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.theme; + +public class HighlightJSTheme { + + private final String css; + private final String background; + + public HighlightJSTheme(String css, String background) { + this.css = css; + this.background = background; + } + + public String getCss() { + return css; + } + + public String getBackground() { + return background; + } + + public static HighlightJSTheme githubLight() { + var css = ".hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}"; + var bg = "#fff"; + return new HighlightJSTheme(css, bg); + } + + public static HighlightJSTheme githubDark() { + var css = ".hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}"; + var bg = "#0d1117"; + return new HighlightJSTheme(css, bg); + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/theme/ThemeManager.java b/sampler/src/main/java/atlantafx/sampler/theme/ThemeManager.java new file mode 100644 index 0000000..61429cd --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/theme/ThemeManager.java @@ -0,0 +1,111 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.theme; + +import atlantafx.sampler.Resources; +import atlantafx.base.theme.PrimerDark; +import atlantafx.base.theme.PrimerLight; +import atlantafx.base.theme.Theme; +import atlantafx.sampler.Launcher; +import javafx.application.Application; +import javafx.scene.Scene; + +import java.net.URI; +import java.util.*; + +import static java.nio.charset.StandardCharsets.UTF_8; + +public final class ThemeManager { + + private static final String DUMMY_STYLESHEET = Resources.getResource("assets/styles/empty.css").toString(); + + private Theme currentTheme = null; + private int currentFontSize = 14; + + public Theme getTheme() { + return currentTheme; + } + + /** + * Resets user agent stylesheet and then adds {@link Theme} styles to the {@link Scene} + * stylesheets. This is necessary when we want to reload style changes at runtime, because + * CSSFX doesn't monitor user agent stylesheet. + * Also, some styles aren't applied when using {@link Application#setUserAgentStylesheet(String)} ). + * E.g. JavaFX ignores Ikonli -fx-icon-color and -fx-icon-size properties, but for an unknown + * reason they won't be ignored when exactly the same stylesheet is set via {@link Scene#getStylesheets()}. + */ + public void setTheme(Scene scene, Theme theme) { + Objects.requireNonNull(theme); + + Application.setUserAgentStylesheet(Objects.requireNonNull(theme.getUserAgentStylesheet())); + + if (currentTheme != null) { + scene.getStylesheets().removeIf(url -> currentTheme.getStylesheets().contains(URI.create(url))); + } + + theme.getStylesheets().forEach(uri -> scene.getStylesheets().add(uri.toString())); + currentTheme = theme; + } + + public List getAvailableThemes() { + var themes = new ArrayList(); + var appStylesheets = new URI[] { + URI.create(Resources.resolve("assets/fonts/index.css")), + URI.create(Resources.resolve("assets/styles/index.css")) + }; + + if (Launcher.IS_DEV_MODE) { + themes.add(new ExternalTheme("Primer Light", DUMMY_STYLESHEET, merge( + Resources.getResource("theme-test/primer-light.css"), + appStylesheets + ), false)); + themes.add(new ExternalTheme("Primer Dark", DUMMY_STYLESHEET, merge( + Resources.getResource("theme-test/primer-dark.css"), + appStylesheets + ), true)); + } else { + themes.add(new PrimerLight(appStylesheets)); + themes.add(new PrimerDark(appStylesheets)); + } + return themes; + } + + public int getFontSize() { + return currentFontSize; + } + + public void setFontSize(Scene scene, int fontSize) { + String css = String.format(".root { -fx-font-size: %dpx; } .ikonli-font-icon { -fx-icon-size: %dpx; }", + fontSize, + fontSize + 2 + ); + scene.getStylesheets().removeIf(uri -> uri.startsWith("data:text/css")); + scene.getStylesheets().add( + "data:text/css;base64," + Base64.getEncoder().encodeToString(css.getBytes(UTF_8)) + ); + + currentFontSize = fontSize; + } + + @SafeVarargs + private Set merge(T first, T... arr) { + var set = new LinkedHashSet(); + set.add(first); + Collections.addAll(set, arr); + return set; + } + + /////////////////////////////////////////////////////////////////////////// + // Singleton // + /////////////////////////////////////////////////////////////////////////// + + private ThemeManager() { } + + private static class InstanceHolder { + + private static final ThemeManager INSTANCE = new ThemeManager(); + } + + public static ThemeManager getInstance() { + return InstanceHolder.INSTANCE; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/util/Containers.java b/sampler/src/main/java/atlantafx/sampler/util/Containers.java new file mode 100755 index 0000000..9de631c --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/util/Containers.java @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.util; + +import javafx.geometry.Insets; +import javafx.scene.Parent; +import javafx.scene.control.ScrollPane; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.ColumnConstraints; +import javafx.scene.layout.Priority; + +import static javafx.scene.layout.Region.USE_COMPUTED_SIZE; +import static javafx.scene.layout.Region.USE_PREF_SIZE; + +public final class Containers { + + public static final ColumnConstraints H_GROW_NEVER = columnConstraints(Priority.NEVER); + + public static void setAnchors(Parent parent, Insets insets) { + if (insets.getTop() >= 0) { AnchorPane.setTopAnchor(parent, insets.getTop()); } + if (insets.getRight() >= 0) { AnchorPane.setRightAnchor(parent, insets.getRight()); } + if (insets.getBottom() >= 0) { AnchorPane.setBottomAnchor(parent, insets.getBottom()); } + if (insets.getLeft() >= 0) { AnchorPane.setLeftAnchor(parent, insets.getLeft()); } + } + + public static void setScrollConstraints(ScrollPane scrollPane, + ScrollPane.ScrollBarPolicy vbarPolicy, boolean fitHeight, + ScrollPane.ScrollBarPolicy hbarPolicy, boolean fitWidth) { + scrollPane.setVbarPolicy(vbarPolicy); + scrollPane.setFitToHeight(fitHeight); + scrollPane.setHbarPolicy(hbarPolicy); + scrollPane.setFitToWidth(fitWidth); + } + + public static ColumnConstraints columnConstraints(Priority hgrow) { + return columnConstraints(USE_COMPUTED_SIZE, hgrow); + } + + public static ColumnConstraints columnConstraints(double minWidth, Priority hgrow) { + double maxWidth = hgrow == Priority.ALWAYS ? Double.MAX_VALUE : USE_PREF_SIZE; + ColumnConstraints constraints = new ColumnConstraints(minWidth, USE_COMPUTED_SIZE, maxWidth); + constraints.setHgrow(hgrow); + return constraints; + } +} diff --git a/sampler/src/main/java/atlantafx/sampler/util/Controls.java b/sampler/src/main/java/atlantafx/sampler/util/Controls.java new file mode 100644 index 0000000..43d89a0 --- /dev/null +++ b/sampler/src/main/java/atlantafx/sampler/util/Controls.java @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: MIT */ +package atlantafx.sampler.util; + +import javafx.scene.control.Button; +import javafx.scene.control.MenuItem; +import javafx.scene.control.ToggleButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.input.KeyCombination; +import org.kordamp.ikonli.Ikon; +import org.kordamp.ikonli.javafx.FontIcon; + +import static atlantafx.base.theme.Styles.BUTTON_ICON; + +public final class Controls { + + public static Button iconButton(Ikon icon, boolean disable) { + return button("", icon, disable, BUTTON_ICON); + } + + public static Button button(String text, Ikon icon, boolean disable, String... styleClasses) { + var button = new Button(text); + if (icon != null) { button.setGraphic(new FontIcon(icon)); } + button.setDisable(disable); + button.getStyleClass().addAll(styleClasses); + return button; + } + + public static MenuItem menuItem(String text, Ikon graphic, KeyCombination accelerator) { + return menuItem(text, graphic, accelerator, false); + } + + public static MenuItem menuItem(String text, Ikon graphic, KeyCombination accelerator, boolean disable) { + var item = new MenuItem(text); + + if (graphic != null) { item.setGraphic(new FontIcon(graphic)); } + if (accelerator != null) { item.setAccelerator(accelerator); } + item.setDisable(disable); + + return item; + } + + public static ToggleButton toggleButton(String text, + Ikon icon, + ToggleGroup group, + boolean selected, + String... styleClasses) { + var toggleButton = new ToggleButton(text); + if (icon != null) { toggleButton.setGraphic(new FontIcon(icon)); } + if (group != null) { toggleButton.setToggleGroup(group); } + toggleButton.setSelected(selected); + toggleButton.getStyleClass().addAll(styleClasses); + + return toggleButton; + } +} diff --git a/sampler/src/main/java/module-info.java b/sampler/src/main/java/module-info.java new file mode 100755 index 0000000..f32f9a4 --- /dev/null +++ b/sampler/src/main/java/module-info.java @@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: MIT */ + +module atlantafx.sampler { + + requires atlantafx.base; + + requires java.desktop; + requires javafx.swing; + requires javafx.web; + + requires org.kordamp.ikonli.core; + requires org.kordamp.ikonli.javafx; + requires org.kordamp.ikonli.feather; + + requires fr.brouillard.oss.cssfx; + requires datafaker; + + exports atlantafx.sampler; + exports atlantafx.sampler.fake; + exports atlantafx.sampler.fake.domain; + exports atlantafx.sampler.layout; + exports atlantafx.sampler.page; + exports atlantafx.sampler.page.general; + exports atlantafx.sampler.page.components; + exports atlantafx.sampler.page.showcase; + exports atlantafx.sampler.theme; + exports atlantafx.sampler.util; + + opens atlantafx.sampler.fake.domain; + + // resources + opens atlantafx.sampler.assets.fonts; + opens atlantafx.sampler.assets.highlightjs; + opens atlantafx.sampler.assets.styles; +} diff --git a/sampler/src/main/resources/application.properties b/sampler/src/main/resources/application.properties new file mode 100755 index 0000000..8a0318d --- /dev/null +++ b/sampler/src/main/resources/application.properties @@ -0,0 +1,4 @@ +app.name=AtlantaFX Sampler +app.description=${project.description} +app.homepage=${project.url} +app.version=${project.version} diff --git a/sampler/src/main/resources/assets/fonts/Inter/InterUI-Bold.otf b/sampler/src/main/resources/assets/fonts/Inter/InterUI-Bold.otf new file mode 100755 index 0000000000000000000000000000000000000000..d5c49b8158f0fb76d1548376883f123ed2c73e13 GIT binary patch literal 222924 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 literal 0 HcmV?d00001 diff --git a/sampler/src/main/resources/assets/fonts/Inter/InterUI-Italic.otf b/sampler/src/main/resources/assets/fonts/Inter/InterUI-Italic.otf new file mode 100755 index 0000000000000000000000000000000000000000..eb772c8a31ccd31d1ad4de9a1e004c3857714c49 GIT binary patch literal 250376 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
gp&fqA@ z8*{K(DjYuD+uIM$Cq|kWjWn@R%faF32L)8g#?@I#fC=UPuGW*n1;>?xjm4iAwF@H_|nzjSjUZxl*4@Q z^0_Da5I}$pF^6;JLo_xUU3z6`yBm)2(bQ0RvYTqJmbaYEdP^b zR%u7F9-Ne)snQOr6H9BO-*LMkoC3o-F$0|(cn=VNo;G$zw>KT*nWsA`aRc>%JxUI0 zd1F2LD}Ff}nC#>c{4SW=p8%PmJYr?W6@!ep(FBg`3(yYnNg{WYev?j=ixY)u=yB0< z6?N-L4Kdv;NMl~ZY@+fy3g1Ep!ITc;Q=2C9P!kwy2l+>+CI^E(WvR(Yc2p=}g2hB) zj+-BWM1y!2TM-SlCLYEeY)Qe`pwMnwupgo57LYPlN-Z1ioWAb!1JhSDRX9IZafAVu z4+Tf*d_!Jn=V^A{e;GRN&j$L{EP^5O><$7kZYHn+fM84p{c@)jk`}8}eoPiYaL>bc zE{S%aC!+!}z7vC8eXXBFh~p|80LN$E&nADOyg>gGA|g@7V8z12Rb`lb0hh0#2(=Hc;swkbpj}Dq-)Dp@USabY~2r2w7ocM41b2fyRme>76^NYz^H64 z2z67)9CyWXaq(Hyt?=Z4;C%Ker1-3bR^@o&p(SuTGEIb5WrB^1CM=+UMPG_ydZ^V?E*bt=!{X;XlgV1*iPgfye?yTzm|A@2`=kzXwR7<;f>sBE8&6^lXn3v6(% zqYZKiY}vU4PF3{^a|`zD?%#~Z9pLrUEq!u>%~d2q9pauRtkm%f)se1@grjC2i~#mU zU$R_WaA8p-jWP|792Pay##IugkUvTRx$tdNbztH(iowO1YYFtq)h(t;b$a&=iVujN z@htU~9^rW#ky(^(QFed4@C)oP@0<6HOK3{4h*`my zN&uk3lKE5`R@PO6I9-qZaBk%(m1kG5_>APVxAr%wuh#iQO>4}*g1fecK7{xnT4$PZ z(eLPYC?Nb*R0sz|cGgF98Uijwd7w{?SlYvApH%%K>A}#+-Ht)F2YvJ%KPm~Io<)ls zW;ZW4HCv_}bJBb=<=Bc@z5OiPW#i-Kw7b@CDWlzkv zKxR!EH{UehGcV{G)>c0cN$R?h@-C$La@68f|Z^xA&gE7AI|X$Lc8}UJQ}c zg<(2Z9qji#2CY25&|eN6rS4D;9sBocF{l}!Z>v^IRqh$>7boxNv~bZT6O~J+k`Gn^ zP-~JsinF^%alUdCR~Jm>JJ@U!L%XfQhel~@E%>F z2ATDivY(Qu%(8fJ@=$B*ot}tZfd|6{$5~kE{i7Wzqo`0pxM{X9WPBrOwm zDuQ>SMw^F+kLeEKTn{`BB}%{4^^~!kAdbf4W-$D=!Q`iB``XFy8q8mcXqRU05lRsYf0Y-Xo{jeI%3rTiaU zAYNWzMUf0!moW7^VgSFdz8;jIwRl)Z`LKMJz>l2Y&b1TR9}laChnbe&I=}y}jq=;x zmZ3sss%0ksH}ZM7=SRYr$rw_nYqKDW-VzgQi}n4A`tZlM0NSc5U3Yca(j3G6Bv_X< zm9x@Tn3XO&iCO7}^-=TJ_~VegDQ`u}Ma7i8!TZ91O%062iL31%p;~c19>}qM6Q1kR z*=a4*d7W*TS?vb_`Zkq>P%ANg}#>Crxvd(cxP*}PI{ATB>F zG|8$St8JK$D#%$zc^y3ym>h&zsJu24)qq^_N6C}%|4oX&SyjQJ$14YU!&a;c*Q?2O zeW=ecFvqGtr+#~B0PaT>a6+JaFZ$q?5xD~S6gHwB?yac@_Cv4N7_JY8NaXrUt*!)M z8X&syB5;X3`U#+XnX!XaR9-+tRjenKH%rFkbP;%-w1f@dA3td$AdE=m1_@lYBP?I? z>Zyri33NWVY~z)xh|2Lf48@RE2m6awxs&#To>tk62i!dL!*n7XessUL-p_f!By3@- z2oJy9Rk>CYZ%mD&vs)p5fodbeIEWLl${yik3%F!r;BUh)Q&$~DOmA_V`QK9A7}^mY z$EU~e7?g}Snrb+jKK#o|El8A#pvp)pKTaNh0bFx+lr3=;M_=VFd`|-UQRz5QJ(8x$ z!*K!OKSsZ`5!JM+soWTgWqV9o^XWGMR-SI@$Nuoy*Ry( zI6ZYR;W1`<;-}7vQ|BHVr$X=)tCbns%6zo}x})--db(7Y$BW8{*^yIS#|CF1<1P5O zLbb)Ul4nuAWfTA!(`zaU*$6s^s|}&a(vww}24u4x#!oRxd?p2fzEj5Y(O@2Q6Fk%r z9fxxT)VSae=XE~&=FQtxD;V+3o3|$=M8lgm%jWc`TT1Ho=B+T7bJTKcN%MX4O8O=^ zLaa61L;)IS$&Tc@otPy%3Uyw0qo626I%ekk_Yoa3^JVLjvLs7*1^2VEAMv{t-nswx z6*Ny3i|_{t=_`V9yJl{Nri|+7+_Ex->&W#Nc+*s)NW)4GG3rPgBQ8#H<&}TACe8L7 z2BZ+7?7C`$(Zm2n%hDQ%cB;ozqj}#YQf~QD&=tO1e5XI_P%5W@w48i`!EQW?&z7e_N~#zk*#JwJJ8MU(9{LL2Bih7Io3#<%ml1IJSQB>?4^ zKhY>^M`4t;>aM7&r#4P?D^w|-63K}7>DxOpv_FK-QQZ1HVFWdGc#@RO*Wf;5V6h0tLP0}`COf=#+%%LdLI~`{zySp<3dW?Jx!q`KmjE7$ zo15_?6^kaH*zKJEAHGK+$<1(kkdC1r(=%JuPgLhqRcUag-faE9Jv9Xdp3Ld9IDyc*k@g|;5A2f^1UOOIl%pOlVk+AVBt z*P0>(R2$Nn1(qN?oNA;0BBC=<`dz!C=k4(4xxk7Cg$;@tXy??_Wn}U@lzuSvh?zEq zkI)de*9i+H?%ne=MA~1XA9~^dNp^#BlzwZC1+Yq5_5$dI1rXAIHe0fEbSov>NMw+& z*iCajh(|u!3US6rTf#H=f?TpUbiKfTuagC$>&--`b7XVl<5w6$74{M-+=Ozp5EJ$WE<;qz>}6qpb#qH%kJ|eZP#>r%|;Ae{kvJfO&N$?t5!6 zHQh+P(oUHUQX2FjkX?mkDRWw+@eZc8TFHp+0BTP?!{Fso5dBiabT#DY@X*E~ffdG7 zkHsdVIy2>pRab}HIL~Hsyml67c)CRt01S{$zw=l#qS4LTcJ#H@%pKW}&86yIg1prR zTd@wkQz8zh62JzB7RQz3mXx_mE?Buny!0`W2(mrP&CW_PRM^1 ztF>LochAE~q8oDGuc_S9y{~}Hyv8V6@==jjgoaZJLSo8wP(2nv8+Ap+8u$mz#W|k4 zFw(ed{+@_E7OD_ShPyAwpdXH}EW;|=Vr!FS$e*fXv{Ds?MV_Wy**?rRB58PvM3$a7 zW~Unl88)JcpY6ygasSz}B7;+>meaWBa#{yeU_La-#;e5tBwcBZD~Ezc0S|dAKDj`D zsrUp;qATKe2l}|LnNFm7Q9yAB?%ft4Ph16!pG7E)l}c%$FkbqZZVQ{WHQ&a;p>_YC z(2QJ2(@>6l7X1|3xCg$$kg9FlL(iden#LcJ`C$@6u`&i~q7Kl zu0EBUO~AY;H++RgOO+^Ivx_%vMQ&3GMR@*21e7i@Rht~I8Pf71CL%9zm`T~_bEFo(i#FYK4q3S9nc}}0Eq=L zC?``?l)Klg4gglNd<4Z{FSPz|EswX|I%}R}o0c?LPrYpR<;vW%2^SWgyC+nH2K16O zId@Hv9l#I_;=%TdH*LRtb=$Az&*n`nW>(Ti2SenqFc{VoYJ_t{6m+L~s=*i)l!aU3 zb5@6!$L$VKM!DnsU~FpZw`<{j5EfTb#f-mwf3XbX79IOF9Z}!z;{c=k6GHf+5FJrE z8#TlhQU_*I@R^+hXX`(fz>H=&dEG$?>5CRe!iHtC_K?9CU6qx4NOTes&wGyL8F~~M z({OKlf<6-*<@T?~S^{QdE^Pz#x89^T^qaf1&Ld`vIM|!G^YY?VZjUsmO;};!;v4UP zW7>H$gy?Q{sH>SM?`G|Z1&;pshg^*(afq?rtnQ7mO(PRjHe%>*+EHtCH%pF7|3q)w z18hisanw&TLhCJ~HtuiUQIN0(cZX_Al;<>?;`&*u0Ak==Y61{@K>Cw^KYF81AF4P@>0Ax@24ITI zS!|=LW(iZAuO`>6Ed4e{KT8p2XWV)Gmu@+V3tPRL&(f$k7kia+NfSjXL0o{9ImiG8Y85A5_L?yeV487gf($%IA}J zA1BjKX#jsc(K45hXVl+i*e9GDMpxZj^F~*F<|kEzOGW${u}5*-(;;(E*V4G?)uTu6 zERW3lo6c)AzhUe8^~3bdZJpLkIh}UdM}tMrBBR*p>`z5A`vYaDW&o7zwMW`Xt>V$m zfvlWxmBlQhkd!$d%y^LT?B>;H$r)1SC}$a^G0TYJVsEo&8M4f`(Rib)6Q(YzhoJlh z#n~U#u-tJg;eB-EDNZOF{@)9oDoT|VJULLH&iPCdZq{tL;t!1eh<1_IyNcC3E4FcU~*eSXBln(ea zgqo-mP90;Z<1b)+`0J^T;~};Ez+Y9zP=%K1Tyq>rM&6PXMrXFs=(IBsm@lM2sMt?L zTryt@IW$PmV=~9J9@BD4BS|>I9#{pjC%aJ&?YKqb&e7%HP|B3rCzM@a6dVAP=td%> zM=($b841bcW*es4i8O)=lO>wE#ZrX|qjV@n^0$?wooEW-(q#VGpN-PTqAW5 zF(PwxWW>m?asPjgj+ahs8D|uIBj~g!a!J%WBMM>#lcWCbewZzm*NTcZfqnz%>VAqp zipr}8W&}^e*UEAJ<21d)Dek(>EK|XYnKC(IisZ!r9*+5D+W@y;f0+=Hc^%$0t{pVk zjU+niN`|UlEjR!m(b$tY*CN4>4JoK$P{4c~)mS7n#5fxq3~^M^MxQ2m7RYBJx-@!rrYv{sR}_ z=@>;!_ayub4QJf9--FSPzf)XM5DkCj>AL^>d)QUt@f7Eekum=6`R(!IM?+CC{qT}H z{L?>kx-?tE)AN=2h}$^d$E^P?!}! z!2PH1U#F;ZI=tJFwfhmz`Toy9BRpS=FW;D1OWZ6EG|CNKPnF3$=qSXj;h_#a1YDcq z=stO@r(0{F@m~0WXI|u-8@STe)l_mV;JXU9;MYl|V}B2fVAO%jbr~R~j>e_7J)yb1 zT}aCay*5!NRelbP`UV@h>UeH9mkax9`{RoxCzIF0Uwo*M;~9-lP`bAn-ZG;41YS+c z18F?Wv&K=WKI6G676siK0V!@HBd7DyY2Z3G;6oWUKC3zhT`>&uqkaY~eHQL(Ui7nq ztVl#M_T}B&@r+-XpW9OFPPV(TJEseoMNO$t2DM%ScjH=LWJJp}q_jwP<8L`#a5t6- zGFV^g{F~EtL?_*i|1sNwzg!u`xtD%6ev62K*YoURCHs}LRkOGL$Lo14)eMm7U0D33 z-CXwKzl(J4xT7K&D3&_?#%}YDFtdmwM3qr1dq+8!1v1cO(AsUd^h&IC6gA#|_vM(huWb_hfDO~Q&LkLx2BOjIm4pdm@uz821xA#Z z(QSn?vpOw`p;u9~nL6&F&)YC5sfgb7LR2|3=a^KlJ90Sbp`$h|dypMI4}|tGLQ-=l z?V$t`%3#bHV4%8w3k+_(Lwl)8--8yY$HYZd0?h%G538q)?pv(Fh@AK6Fzxa{uj0N+ zM0K5Zko5A`5CVWuvKk1V9X(iQ+U0g-sgeD-8anLnYuJ3IzO)uZN9>knK*hk$=`6P>j*N$@- z(@_IIt}wSmR`91KEBJE_4eN}XDKdfc+AFtdS`m*%_t;BIH*Ta_3TpZajJ(w{RBM@a znQd9T$Z-_$XfrQ}JebBD7rDT__*<)#qBTs#%JHea<_|f;KsdBD!mNE5Pr1?LMcu9C z^xAK>fpAN3W~v_l!`vqwh;kI~P90$zoiu78LPEX9Qp!p*3tfOS{J^C zw;)ypp9pO5U^vm-jucab<%QV$Sj6)-k)Rz-(XORvGcu;ym139sJhlqE2q`fLQ?gV=BR9>C<+D(aKUo_Wi$sh zmo)IuYprb@r-I@-*!oP=R>&Z(7-J$i z1Xt55N2$v$xZYS1X#Z3KL(5!+hq6BDSuaO*xF+y*m-mR0$@dgT6;E6hS(fFfz?Y-T zQT3j6+@?g^VA(uIni93iG9_|pwNv?iGU%hz`XSjg*^cwo7D~uc)H|AXM=arkBY0|f zcT-=S;<8}RoKEK&NhOhuMpg9AH-w_V?Xd;R@fy?;O7oK`M_0^o&+@<5%repg)FA!q%W)%^Bd`kmmt8X0%`R!^1|_6zphVt^IN>mL%tCNR zfhk@Oe(A%T2Lj<(#aDc%@&rZnNd_VM*UO^mO)-^Y>4=7*{32=Bp^ulb0I3Ek7tH$K z7`$@}4ejw49mcG|JjBXfv_ka7ilNsG*w)J%tGcR;FjAZQG?NOa(^Pmu1^tC^&?dG9 zbK4J&~03nDp7J4vzW|ei%E94%c-KrX7wC zypzuS62BX(hfD=ph>#*!B~Z~-V6lv|z%u;b7@?PFPV|{^mO(sJar{qrjt%4sPZG&Q zf)k5pJ>xzanhD0pEH*T#krh2O`b8?J2w*TpfK5{j1i2|OR5p$Zocf(|;c2d}V2LHp zkTw$4+m3A4%|HH?w2}A;IDShsVHA1IR)ahuDeazP`PC3V&}x}wd_sYlM0hI)0DU= zv6C?$il6K@X$yu)8y3+na(o2BGEKo9Qv}WtYpkRJ1-fR%fM;@5SO98@{4N%{AGcnI zmN*JLmniCO{Y0p3KMhq}$Plr*2FgE(Ke5^l zg`RC7oMU!KI5<{LueE6y&yK=5D~QJC7LOB`3HUdF!V%ovc&4~=dd>BXm*N&#*2cxm z(9dkhV-InzB2B29Ic93n*^PMk{b)8s11=7kcRhOBXH%Gso5!cEUwfMd*G;5+@sGH- zHF3@22h_JuDiun49k{iLt*X89l*R+(*8<%#K5?i{^p$BrL7YrlSA`^G z^Nw7o*evcfg--y8_o1cHprnIstKJsn^sXOBC!KX_pM;bAT5J}9x23Vp>gefwe=_$N z$;kjRKk(HBh|XiWq?W{t&$8Bn~Qr)uu@b*G`^D#g{>oI>Z@+WzK6K@JdW~=%}GDHCsj1 zMKJ?kMVXjDPr|8v3{|^$EQs1+v@8mYzlJc%qzH>?lrZ5=+N70>*UlyKQ>_En(B|@1_ZIb9{3#C^=aEiW zIT9yz*Y{_5sr51bQqp=Ge@M4xeHC*p+ENz`B?{}D0iu%eGthqlQ|iK@qmAV114J|GneCVn62s1-Kp|9ls#*-uwgdvp^_1|1sb}l@+=D=yYe#_R#h|T_+C{$V0yxG!bzTC||oSRSQAU&t4oDa%$ zs^M6w9KCn#;)ht6xkMpXqC~PEVCZO>B~!U|Gg&77_}Z~m?$3^T-d{x0VF>Q3q5fV? z2MkovOv%xgSRKJpKBcr|m_~dSi6=+{gW#CvKhP)6;^^(vs}A^QKF`dR`AAYGL=1wb z@t;0i1b0kHE#9Ph9CQjJPlK>*rdhMNd~vA(*1SZQ4eX0)E2uSv#Pb!aZ<;A4Y$-Pw zi->@s*i2W#Bxmwrx(TJj8vb*!k67ghRGnWe@SrcLXeB~<9FJ(B6&VaW90zQ`zZ%70 zGvCo*&Lw98d!xK0{M44FEP+f4v@vrA{LVCy6q(D7_3KZ`fb2WVB8D^u<2p#8Nll{s4b z9)P>H>9@YyT8h8{1Vz$z#|d{0ria}@My5w%zi_2_N@;PynhLA-YM zRt>;%+QeIed-_>da?e;4_z{Yh$-ifRQboqe6bKl{eMSJn8B>LWEtnud^Dvo4ph$-E zUJ1^L&SDgZzA_AamaQ8;tSz2nDg^VUxoC(BqkXGe9d)<-uywLNY;MZAmvY+iVMVT3 zfIXA;2@p*NR|jXj>th=DfI5=TTAI6^-ZGN+_?n!p8eTgG$%{h$??n+8zC>OWV|<3- zqFD9qqVPa$*_Wl+7sa0zGP_D-0&^_w=nn5ItYHNatY^Wcn1hx6Tx1GY7$UEem+tFi z$hYf6I`=icJh zTn6$7oAO#4`fqtw7iYqR^2~N0RhsIKE6YXov*XI%h~J&JLA!S69{boq{u*;y6i&N_ z5iP>F2O|Xe%JCX91lh|h3K;&$J^p^k?6p8_2{!zUq2F7_M>#)%tW*le7B4njHAKR= zbma>wX>ggisWIL#3vDp)_hzcj$4JqZm6T&Gj(gPq}7&uut<&_EyI;&Dq6f2^bcwYe5#H2 zO=_#$#U59zt;lCMO!q5^e40-xcTVIob)-W{1m$b_jExB$?cL}1hHKDZlPx3Np5gl_ zb^`lH_2Y?|mrTwNj^$vwrGfPGfv=}?$)vg;M+0Fm3=_KEqh&Ard1W3y~?Q~tHh zZJmZa?Q0Ww+)m>{efjvWS+=>O(2|~lgPD_W|3&Dq5Mw`RhS4Q3?je1Coa? z>4Oxf6QRc`P%-(?e^T8;*qUi&TJ1C0mqC3#lF5~xh{T!X6yJP4UYOC^0xk@`8 znO%8Z0sWvJ9*-l2p^ct>N3d-qWbq^6ZWNl#J(DYwDO!q)m)bJ;HL_^>(t9@@2ZMX< zy%8?n)MzJ_eW(9`%e^PYu?Wsnu0GxKX3<{z%Qv$al_@ z_0FT^JIA1}@bAU;n5mJ|Bd0@9QVq{kcnVaw@Sb3w5RQ=EiAPyS88Xvm5*!6=+-~hU z@Nz%?df}su>e%5o;P;yIm*~hj#^SHCSocv4kQEF~0zEzN1RkpAKAB_T@pqT5D(8k> zn~l9@P%KouUJGe-;-?{RD;{`v?Anbaf+n~&2R!DoiTXj>Y2(M(wGBgq5cgHB74nPP z+B&QndGf1RXj=aFttX_9eh_zZU|8MI;*EQkGV6Qkg1HFx9*e8uv;bGOZB|w%rM@@yiqTfYAN^ir)d_xtL_jY zYx}zMJ8gDNExD=Ij(*gZh{T3^D6#-boC2qI-)VXyf}e^MpG;5fHzUu~b(2rhzZfN8 zuzvSv0b2)RQSza_C!RA?J_lTnYP&T5u6(DpmY3&iIkgfEaWjEv^{1)>k9ehRJpZU@ z1sg&__p+M?2lflM_%Hgcq<#bxJ}WKT$WIYLM^SBkIVXIN(xXZuujYAE&qx#P3FjwV zMNfNb{UETUSHhv7t3nYC7V_qiJfc5py0Q@du5OM`0Ajr! zK8iC?F2v*7t;Q3QcwiFy1_0I6$MmIk*7!BbqE}Z=ytdHrSm@fTft#m4Wm!g@6xS3v z9m#o;^1NS3h4iaX;RjnMa^abEJGJZC$%l9TWz_OV^E6Ix2j|2pt~I89d=py12#irmqRbz+fcvE-Qq)R<(k#faZYy>9 zOhafA{J7oPVjtDhj03j=x2?wG5mTASCE*=9Kp)qWT4x{l$*co!4GeX1wEkSyfrn_| zFXlW&KfPZ?1##g191Md;9C$bPfv=?>jQmFosEA?R_(4OhEF`yEKY@{cBSOjv%3cH4 z&gUZ7RzW?fL@d3DfC26DlXU*RC~Mk7n@iD3zKo-uW}^BC%^VoQ`5S40CTyvVFn#U> zPG~X;mX%aqf06E@!)niW(16v&4&%dE-|D3;q6tgLa8Hy&ZuI(JfVFn=&FY#qs9r(F zk@%itfIBr89jqHDDD#PREC(s@OgV#wsvk9l8=GvXuArexp(l~lK9;K8L_<~B-B9(A z4V8$%6=u6gFJwd27Z!1qc_bRD)Zx_dyM_v&utz*xr16f8Q5)}|#{YfC<*fbNJ^u8q zdkmv$OTTrG?oKePdn}gSJt7?N=0DwI*X-_bGL42d(=+azq_tnjTeQ+$wPL;4Nvc*rRE?H?kA7ca(^6Bv z2+j%XP}#sy4xBmAR+}erj$f;wR_nti6ISyvG^7$m#0p&$-K3sZL|(e7>I|4qly)T< z57RE{0!PNX;dCZ^3!fX#(F0HywnpUK-84Rt+K0C6AuHBVC-SMB*=oB+*=oB3mr$HS zZTHA5X8fbJQ=K({>qQ~_Q2}UHG48GT;ht+3kF-4>KKg}OBPt8!trmyS%2}|o6r(GJN zjE3NCBDc7J9VtI70=)k)wWfR%sK`1B*a^(bHQ1Xr8zxebwG^-eKg&YM(Fj{Uz~Sl8 z{>3c!PbD45y+OD2M4}NNxA93#>jzu!3%yh_hh#og;NLUac$qHH42$wI?#A$0Wnf+> zb&Cq-q;gIReOaw%e)|nA{Ah>)LOthg)vM4m1C=-MIY#L;&^Dt?aOHuGIyd#9pPEw6 zdygsCN-{~N!5c>+bu&sgxWZKa2*n=6;y9eDY@#V!kv%f?9uG{J!c$Do;_gh5)|)f% z9ak95mhPG_?Ez%uiWbHg%A^*jMbKIZ>GRW&J(!D8t~KxWe)ZizQx%SgW^mf4XAVp*Q#u9{Sj!>U(J6Ah2FM%3uIbw4%IV8ro-c$U*RRN zE~<7`H9-fB+bf4 zg0usA$Bps0+6I;a+MTeNCuOXrU)NIEJMa(r8&4}AEqpQ9W#2l zZFk>4bn#r$`voXy3SI>zT+c6TG7=70@g+K;+!vlk>S0k%$8DV$)_HD&w!It1a?LCp zL-lIy7AH*8X@$9*0x+v2Pua+w?b@+q{-h19pdsZcz*JY8K#jCuu_v0A#L?wjX!hso zX^X0iqCq#bDJpp?u;O;*Q@vUtQ74XChTh~tz&)IgVKf=QrG|3DM6FEP2vO!N-O#V4 zV%Nz@Gev$;F;W7UAb4yr!t=QR1VDq}Su+4-TLnbc_vb+TyDY>&GX~wmPf$Ekz8123==4wbkZ#L}Pq#e&zI%B8 z-|nHrf4T=BbPtNVdw@`8%@}kKbgs|$s>qfxr_2a%-AXahZ?*Xqux!A^p`Pmb$Ou9+ ze3f|;4&}T)Gg;eygNHZ|it|TUJ;(uRT*@c&w07Y-4|OgThbL)yx@x%wXt{j=qWDr( z=M9^4Z01|BGi#Uk2op`EaY0vTSWQ>{KKS^|`Hu(|7*21mDB1GNmf7-5#HM8V(rA{l zrd7L_?n*v*0A|NFoZa+9t!pY4hQFF=CBFAJ_~D^eU37?|eX$U66kSgbq`$!g>2FXe z+uvXV{0(Ms$thgZZEt{H-(+|D8=!C%4OQj6v3rlG(4PKtVH|NF`C#G!GX+KOjATS(JP1EU7U46t)h(g@18LTVYOIlt^i)=_a9#fKAR z!vw1#d3C}>(UD-*(zUjII7&1yYiU|T{LbBjB*c8?q9fQc8nV^_P<76MI5MSLR@^sl z*3lD#D7=HtIfUYzsITRoj%c)DjzFS6tw2{j47xuOLg0m6QQ6Ou+!Rx`wMdcsZr8z ztv;-LoN;{rk|PN#sji9DSZ;wt*?Q5{A5@-RYi_sRGkPIM^1ffF48$EMQN8cwe?6r9 z&k-t&S#j%isk8L6%Z^*mtO>`MtZBTY&$d4Y`Yd9Q5r5?Hh?AoW*mS){U^0FwIknhQ zHvTs&>XoxGVKyGFql2oFp-4ZWT(~P5xt1H2+*gmPHY!JICl8JX=i^?j9XFkKyJK0}L|Lz8_UtM)Ma@*D@diAk*Gn zdqng0uaF&5`3+5vc4z(}(|#v1?UDIMfxtS!{78{=SQ(#Q)Y(LSy*U2es#kv*_^#`O z3c7x0U?H!a4(D~5l_Oz40h_ae!Ooq4M+U=N5qd~ z=GXs42{$L@79tSSWd!0=$w}#xzyo1VIW{Yg{K4)g=3gx!s8kC<9{CVAK?SiNR6~-B zCsSo((x?8bQ(zx4kl8y7>+v72m+6!ch{@Npr{$tD|D zZP=wcOzuH8zMuZ=;i;$A`<7z^=hxS_&_)^OlrG<+0$i-x9F)A{*C*dwkls7U%{!Jv znakeVL+4v(M`rU~mZC**nQn7tiG{&v*~^tBBmFdhXn)TlL-} zV8H7=b;s9ZTkM`heH+g>=I-Z!ng$9psCgHEd%*W|VXQu?;;riPxhZwR*RTg!_dEwV z#!z7cb#$}n62YSTx)T8zhXH+|ZXTn0w!q?Sp)=j2eHtv}O#gbw{p&dg9aJ%J5gO9< zbMTy#%kUd#nzjoA&=nN(ZV4?}08wv&k6h-wR-I}Bi2c-sChsNt4(bB~@b@%CD5BVW z+7Nk``=l`P+Sln~0BEO|wj+(7Ykezeb4PM-1lgGIS_ec9_6N%|&~$S8x-s)Q zh194up#j`ja0NS7I{e|pgYj+u3EUX`A07#7tpvF|7k!jQ_4K@4HPL?6bPMkvvpVtH=@wba%O$Sev>eCT4sYeLp5r5L%v0RGga+5 zl`HAF@g#2Chb#K>VnEPHl#s3nU%^jxpW7}avI2|)MJj~f^-9IVC_x(^>1Q=(wAJk12wbTl8 zL62F^WXA?0-_m^*HoECX>uy;ox46!Ta?Pz>ho_}n;qF?CYc{?kK{vVwUM?``aaJlI zJ}GnqtC`fZm=NSlhvIB2kmRd0Rw&^ae9~a-xaz1-Vban^^Gee57aMFJcpCzoR7|e6 zTB)Anh$7nPINaIWD2#x-=EUHO%r}DP4u!$gBve-sHvTG$INfXKvOoQ#61jtO4=(&1 zRkg(wr_~fk!+eBU3^P0y5j%On zw(<}P#gzp5wZ#XKDx=x23*rb9AtBz{Nz3Uozj0sK>D0z`>S6X-tsBL@3N)EMMxn;g zGFp03{G?xa_b@%;(sWMC5$`ixw;j{Y>WF4(9`Q)a+m`VU!WRO{ng&bEzw z6i~a+)GSONPb0U`|t?z7mx{BP3}5y{g;XKh!CrsA+KXnD07+J>_JGXtt= z85E5ZbY#AdV~VPKZxmJMUFR&%=uz?ncrst~GGR|j$PP%3OsJNg60t{4tNf~;4 zMR@5~kaACygem70(bVpI#7)(|+B(+(J;2H|>aIiPsB&r@>!5w>B-yfW^( zjv}(0G7n2-+A3Wi)I;#y^yY>Qkd~_HQzJx!W3*u>R?_PL(ndi_Q8J7+MPA@RDIAN0 z8(l2y=vssE6_hMj(#KlAO4^(eSVd>pB`MV^Rod`;c79VxEM*|$h7ZQZw9q(e$6;qkM`Bfs~DaLHRu z??iXxQfF8u!n(RI?hzYi(;HzofP175oagHBc6i_WP&vyaHYs8X6*dYV3oWK47e#K| zB!>`>S{k-6|HE0TZ`(ksLWgytW#lhf-ga6Jc@fsu8bYV|RO^THIvwv#||Ti{0hN0 z*a%^EDT?80+ep(V99#mo#llcZOu*xHo5+&}VH|D`PvOvs+z#mK|@mT9@X5tktUeZ1kHDWpspzWGS`(vah#)hg=Jlj>t^REYXNfw!ywDw?qo9O_Q^<>n2OFtejlL#{TO z#+8Rb*0`h>Pq*vG^L!)4M#7}$r{Qu1*@KCc7q4>LNX5Xji#&GG!hNujlCbkCkhjzy zPrGZ5?Th`Kzq+mKWx(b=Rhjo$7Lblbs%M;$I>S_(uApSWcRyu`2u~h8+DB}lZ z9Qit(=B8xqu!>QtF0Viu$mfK3a~#rP#0VAc3z4ehOImVl6fK6Ey<`(?uxeve$9pYO z1$AbbRU3^TvX)Gb3vg~VZl*g>BXl>7r;`T9agn2|fhMUQHryvabq50duM%M=&4-FH z&uOgcWunM8DuzpjmeM;T4YsWhAJN-x=JP?p_5Z?mx*oRBFiaPsY zmfYJl(fU^Oc6dn6qe}syMs-Ypb4hO{(=9D?oN@JZPg7CxN>L_iUhpTe7CSEfViZLq zuwULeD}Dfr_Cz*|wsMNrBo#Npr)HYpR8~z*v<54*wE_m_GWa`i(mY(CpdGHDOWg1V zXWU`ybs%`nSJA>RfZ!|Fp{8;AF>=h63Ny?(ppGW2!$32Uka0x&!f1W?YTh*l*&{KN z2eTRcf$6+5750`(WIm#&hw+(s=$blJ^Ra2&Z7yA81?{lh(^iu5z?o>%yQP0uT|GgU;58~*eR=`V`#ekkBde887xS{xP6w9();B%7_G z?p9T*;Zvc8ug^uwa6zn(;NjH=w3>%{?xoQ_5DF$p$$U>v9W5pEK4rL2)`J@0L2k+X zXt{m7avl}<$~RlKP(ei$IthgvYFI-He!++2n34`7@wq>$sJ%dnXfxVu70F}iu%VF- zX)@eeh6`7KYi0P>t+CsDDetdO-d*;OK$TPVN914fqcD0UF@VYi1$5GH-5GEQ+jUT4cz!Y>AMK5#dJ-rrHS+wM? z{?_8(R$TVIe{_6(J2IXu5CU}MDzBvj15A~gR!2r;6wZUb0Tmr_dJcI^pIK*itA@cH zEmbTnHiW&?!@bCib6ck(CMx(YBo*Se>TyoS%%XLr(SD`sg>$ia=u=x)k}A8Qu{1HO zPc18gjiEHoFU-G%HrhC+%zv8F6KF~;Xi6)~b_Y%AjVz-g3sufCCep@a8x^^KF0ae_ z`8%$ny8^67XAN}8P>pu-nPl0Bw`Zjs*AKOrMqoBp1l|EK|LT+oK%!7huBH#OT%twb z$W1}0se!uuKhE9*JZfVN7dBvN*Mm(7tTA{*2OBrQ^xg@*_Z}eh-g`6Hc-J;Iz4vZH z=%Iv!B!o^9T4({1Pz;0w63R##?VkINcGq4L&iU{CpTi04Xfzs)rhMi7-cJn?E0jvb zgOR@kv0oVre{^_dbvGNGR{s~ zlI=@ms%Q(F^j+lFox7c18NlOv@dNOc+~f~dz%yMCN`~~BN`3V+HfB|RgdQ{_F{EK8 zM(*OW{_GaKDaV1J>y38q%w{zgupDIojDrh!hW4rOXz=NBH$Z~S9rl-0klQ1+IEDaLfC1)!vTn&mCgCw&Rvh>3!vmKnI)TT@>t zYECn2ey&-de#7}NnOe)*`X}{G7%+DX9~81Vc~kOc`_~J1PF~y7$~Q%T?GQph;oS%v zK2P;A?7Tz0sc&J$oZCO=wXYUu&FzKv>`7UkUTh;9-zBMa>a^ptzbg#OuhjMDZO0*# z)NM5s9!T;PF9KROZHl&J2f@1yhuDTp+((70i#uTCcg}Yfc5Y=j{l=>qY^ITca18#F zwm>VPZQ-9g%-0h(eD%DWa{2m=#OH~>H!=qS+{;=~J_;@rWKDA}a29cH5e-f7G=xR( zZfG_2bl#wHGiB0nA=M6#MNp^ z!e)x_MK()zGe7rH0Hqe6;EEYB8FmT|S{vRVk<$a>%RicB4STsB6JY@C?o7?Kv%8x|Mrlji| ziTN*+#rj7=^@n`ar%E6E4-XZ4ygJ2G*Hgop$6Y~OMiP}PnXmUFIV7GqO~#80Sa2O0 zFr4)vZ$^h~`u5wS=a8}VOljctKC-`jg)CiG{u{qxy9#?J^2k_il$Qan0OnKwyYg5b zk}gbsS{+kjSTC~(*X0hy`&I4JytKXWxG|2!v|Nm+^{VlI&{(CP#$EjRijn3 zHHpRWW_IE76L`t0;Fmo4)5YVD?8ohgW*!)aO$>rZXLiTtO~k8O{S^`|!Zjnkg;z z_W8jY&2wIjVL5s;OG4pWYEz`ET$Idg%l=7T6|#mExQ6q)>4=I4YW}nYS9_)KOY8J0%1<%Pk2>A$K=NA?m zHI_lFvo0*A0|{!89$9A9i@yX4OR0!I9bQGT&8Z3z^ridBqu)<%Y3Th5VnAxte%U$nhM z*f^s!*ti_Ss3i~{-0%2YpjpZ}hdY|^yNCwf$Am2z_EP`Pb>KxFBkZvN{B1AT9JQW$ zkz*5jYIFhKX*S%wHN|BkzmW!5)@-<;sv>jW9HR!f=NCD^xYved@Yx7jtqLcDN#9bL z%9@SI_jrXreZVK+A>Wc^<+jy|)q zRtsUtjb)9IF>$mVh%`KvH=@>DwtdK_v&1n38N6j)^`DX`hdWXZf&!^d=EWR*k@3m; zagx!B&$RIlYL)2fOg08=wqse|J7ZHDu(dVc7z6pI3&%^Wg|od)Z5F+q6ozUo-e}cI+_lU|f+}THdGQ;U)&65e)N;9wHlrb5`%7`PKO3C71>hqt z*?2o+3M=Md$?B)mH=$QfFa!N)TX*Ng`A3Pr+c&jbP!CFXND8Z1`W3I3BGT>!hRxzN ztj-ojp3G{STP>)IoT{i6TMB6h7l~>?WoMuom3Jqj+VS%b6Cc_)wVGd-Mc6|Yd8^e# zYi2dJ%-O`Y{?3=@)rzFlOYq0?8Yw(?*i2sCO4W@iwsp6^ynsuky_W*rm*l^kJl;0tSi~xp`rFgjpt5EYdICCe`^1HZ_J@h6Ru8l^qOT=0UkRP4Zq=R}g*~l_H=pnO z=17Sl-dwyA#wdWwUxA+nY0zJSkD?{Sl@_2{st#XYr3Q%8JHzYVMo{!(NZaN3Uy{fr(UK47#=qfrp?Ze2 z+}>j z7N$IevJ~5sRd;{P2>mwcb0Bnq8p#W^` z2Ngdy-N8`UMOQ&iQ^>XxEJwYMu$bMQ^+sXCXi`_-%lf7k&VZ)BR|4$ zxWNx7mJ*`S0;zgY0-!;>2ZG&N+jb!Iy6;g|b{AW6irxKn3%dk@RKO5|dF>NcPy{yx zpECt$O#n1kCmK(Tuut)k7ult^iLB_93Btr*pLZP2OT*&cmH%FGG(SIn;v#G|onC|fKo*tRWUd*~mDKkvJ6 z#cD6lx+~9@-$Gu@F34C}(dab0VM2p-jf7J_om!G@<6EX(7>)ox5IW2>#!l~-dUyeT z)pne4I#^K$o20fn^?GU9qefds9jc$8{B13u56|W*?GpR5j^e)};b$cm$gwk1ntqRz zrfZPW^bN0u#4n3@WFw!Hrq__t6hy-^@Bg2E0*9U z8U|?8X6w>-^O@x)yRbK|z5XO3n? zPsW>m&W5m0T_%}M#jx3YbV9`gwXb&tFtHc%J(LrAS*3bz{~>!ze3Y{m$5slD;VHpX zbj7Wl36_gDYPf9_NbVbVLXYNamaAUHp(jzlQ04X zy}fCCa~i+QW5@BYV76dOqS(mx%r=BY^cyL(A%_+X&@J*3&>(`@XelOXWgxJtd z0BL5X)4l0Ur`r-t7b2amVUz%0u$NZ&rAVMwUGN2q2w-shZoGO<@CE1d@C8>-WXjXk zf@gR(-;Vp*^r>&s5xeipq$7?49kGX2*f>C~6>W9QypefD-pDl9AtQPKZ=0Dn68<72 zXTM++Z5=u7IuBQ?@K5b*qmu%!s_xVjiRyd!1Do+5UJmp)(8)yZ2v<1UFqBtOAMmPD z3Z&DS+EywTT8)^_=~^ul7VIqVNhbA=$Ue0S`v@}7NcErCs_@+iz^y4%KGe8Ha-D5<0o}u zyjm$9$H~(BYDMgKaC{6FVRXZgTP}~Yfn@lP1nF$&-bP42WLZo_yymL~j4xm}+1LZB z%-7gMz~2bJMrDE29h?ULLdjih&>`RpKY=2>3%zM>KZ11c|IuXaDmpqw$X*%qpL()} zu2w6}R}<%f3GK)0>a5FZXM~gdX-tc=Y7ewEN7+aadzuODmZ??A4}4xv{&QFUCqNnV zjGRmP;U#TZz1eJqHBTF59g;WBV5g8>gIywXd2qv~eX!0?1?w%0i)@s> zhxHacaYmaaCIt77bnW3?#1Bb}27T>x)>N&J#foe`%e4E#$p}CjNERQE*hDX$%>j$V zakUsp=DRCYMaq$g!67W@HEV*rn4tnL=Rcq2nyb$0EzYtGaK^yt8|HEPj)2c}P;=q* z#h+qsr|)`MIDMB1r*FIf@3@`5D_KNCx6?P|)Z3pfA;2yF)(|^yat({LN5X0Q=~Z8C zH!~^5k6sAI!3s;#5gGJ~-)j-l7o;p3PV>&lBbdrPzTtJ5zG3tvUm}7L$ALkLHyFk1 znZDt*2<{hhGXfB;4Qxj41mjq(Xal&yElGffY-aEFvNU+l9c(AH46w1uiR{k!Lp&W$ z9D9GYp;7OlkpsaI4u-(DaTu8-zPn;oaAB7l62b!CvWB}^bST=9;^wkk#V|7BNpq;Y z6_}Y>tket!zfdv!nZ=4b5HQI0-g^KwBK(Vxl90QbjNs8pyp)5NUMBt&UdBV0@0)B9#0Pyk2{MZ>7VVhZb-$kHxItCVEnLVBj zJqKo87d133n>KO zatxrbXA)FPJlK1N9ajOQ&H!WEZ2reOtJYro1fdv`OLP|rD&Tu4J=+|D+2#<;Mq)}f zUJSvnY$gvs62gN@nnMtZN0nZVAt=TXSrfXPJ+h5}tC=X6LISl&2wBY){ykDOfx%9%Aoi7K z>U8!DnQY?Yc;w71evC3&J898|6#VbxZ`ZE9i)Td<3K<252M>0Z6bZG8qrx^es4e?M zkT=FGDpRI5&pibIN^+GKP2t5;!mHQgIjpR9(7Hn3aKUee&s7rPL97nKCNBPg zR!YKNQKxPdM7E^xvWptAoJ*0eK1>cn%$wRF1Q;lKC-y)|Lbm+Vk(U0&0rdm!C>PH1w-7rCC?Kp72@RLlOqqqpl*7D;DVpaJH!p z^(3GC44{leS)6Gun@)MEG%aFySssu!F=HFSV!3T3d)O1x>Xxt8^`NLfCsj1T5NKaeSLqqujUWA z@ypY5Oo9(19+;*X7-aKfyybgr)u%*`X%Nc&?UfJA!g$X~3W*1}^%J;~CdIP};NX0= znkB7bBY3mh{Nt}%uIK(6);(VP_|4Yac58tB5j^KiK4BK`!(uA420gA$V#?_8 zr9=j5HIKH{)(I&`J3GKx!@$&HF@BMz^Ku8^+-MSi+I}we+m)MHAFwKnSTG`~-l8?n zmwau7{SML!RXxho4+pqSs06_Ag85D2tuzq;)BDS z^qN{`X6n?VL)tBGv&^kid-0U-s8(qNwDBC=#8CD_n#X>{M4HDlv%eP@%IopqOA~1x z5tV>EkC|y65g&x)?7P^Q=8D4rK4_Aya!SKdt=d~tukd0E`DE7(M7BKz6TqoXS0?>z zXJe4HmUZ9AdRUXz0E*fkT$O!O3lHRFY)Fw6k4Vgl_8B2FxV1SCf&H&Za*qQOFIm55 zyN_Qu`_+AHZVuy!nLB4{JaQF+&|pl`8fa-fV?atYDovzZiQvu0!ULH&eO|@1O8a2b zn+DdhkXWqnwMV8MoqOC45GCZ{BB@ZGmi&{n3VdC8F2fgJEP)k?M=qwg(rSO4#`P$v zY1_0R9`P9IteCW9(4eKChVllB5I%01z-wB0V^@Lc4STkQD{Ru_)U?UPM)OkA=kxc) z?YFZAiO4Tv+01HMStGr`+Uv*9{vu=(;~16u*x0l<04h3dWP?-E@$4RDVWAtGf(Slt z>E0sz_lhB>zrDEU7qNwIu7G2}7%MLTD_e)FaOVx1UpR%8wUtX5d}G~XYbs(n7Y;7p zxgyU6GpK`~rq(64fwRZ;=^2`swEwMSUzF-t6#6XbtE+2&wN~FgYrwd^J(3D1CcRW^ zfCjS`XHwFF1<4CSBfHnGHoe%LNvjTR{rp5q;iP0oa_Ep!;$qT*&}e(NI@79K?@hqf zeJ7F&Cnr1X$;HBrIzavZ!kpqE_C=x36Hne=^FU}j(?mKTW&`10LR-DI8D>fb0plTd!0`Y9;d=PcF_=2ri zbr+y7**TtnX{(z&_~MFdtN(a#_Gt=oT-(R;5|g7EwF<*HYN>dORC9`rfF#O#Y+zlJ z*MzKO4LW1>4_H(ux!Htv-K@{mVi-g|3DdilefyOY&2LY*lUR5Ji-6Cx&%p^lV8(_V zJAdxPF9|Fkay}M|t6;UyFsHSR7hWVLgL|avYBxReBWtb=T7tP|4iCbWCP100<-932 z#}d@i($;KxgUM||Yq#0?z+Q}3NtTkKM}}7uOyT8_eCNkSto|ZIkCZ&hbAR4>=Q3;w67U#t&pL;nf-^@~Vjl3=e9@atu2;cCyBv~kWc95X{p1ZRGq5j;v#;Vyw8D`2~g zHaY&QSw~B|H*z(QxZxT=2SM;0TeJXZ{fDRRV;C2XzaFy)W>f1mQv5Aj| zJ?-mM{#`16z?);9Zb#xw8D`R2tm#WOK3<5g;gK1pF%`V_QJ@JB^!>mhIMklvC!h(3 z1)IOa;Gp7Z$$v$}wbBy9T_J5$(&)6&OGfjNA*W`2H|JYBJFx)U?DQjS#btI6Y94$f zuoGb08=jmv0+PZ*R@tG3u_wtp_`HR{rS_1VIgK)Gkiv_6%997f`Y;qxZ_}6X0gEfJ z+G|(`4*R8uatJ=i?jQto9{+utRV$}OB6eB`w@>trG+?Qh%Hd~)@`;okwXHCUvTpE7 z3OzawE~d-Z)Y(74hS#0FFsA$H(T7bvdMWhiANgG9(cSo8NTN5-$l=kWX9+#pVIarm zZEp~k#MdIZ4F3mFVm^RcqEfjZCH;O=sCLv@kd07=oBw28#6S2i#!{QHlr2@4f@s)} z7X)9u3jQVJ-0}I+(v$KLuH4o3UW=S96=uL;c%X z&$y`$FrML}sCik`Jb)Zv<&jjxM)l{em(E){Fk)qNV64RbvsENz1jHHnXr36=IRb*_ z8a2=&)p{XCpLu0D&oCPB|G*7$lx4V!R(Og~8L6CnpPRkGYG_ahVER@t8ucOre@z=k zx{@(SGq4jT1gExSCHX_i`iDG4-K1BslixuM{>%h5XW%dhhs|yT!mJLOFy=!J4m1-u z1Vn}cir#bz3_rYWomscQ@cZY5cD zv~0y&h1^LZE64&;L)rdAh?;jdtnDjaskvESfGUvSBSF0P2C9~h62J9Jv1B@Zm*oC2 z$^Dv$PGJw+B`x}pvLqV+=Y^@7BZ_F_HH&DVA8%C=Kh&eKq_*+M{AYj9&8a*M^jp?K zaBY1@fHpsIo}7VG!rB!!L2;`(fbzCwP@^mL|2vkb^{DoR_}PW}uXZ;9?Vl4-RDw#S z#Vv4rw5mcHm?i!@K#i7R)Iv27!po^c|>WR-h_{)Y+trg?HD+Z{Hd19w=_xv7dyE@neJN}p(mt_}yefT>>JUE%!tOKtda@+ltnT@PJ7Q(h}0*`Ui zvmo(kh}Y<^BlA_e5sFcjYTD5;EYhc`ZoNCYTZl4?zkr-@%Z^^v#8aMz#B%zqc{O+YxD*ZiTK#~`nzyubJrqQR5p zoJLu24|7?{tPO#$kG^}6xw7O)Drt*}v6`wce7*qIw)CVYcFNrJZAMn*2&mR97g_Ay zt&BO8Wn|sN{K-{gGZ5jm5TtI6<8@Dv{iK`{zi7R~vopw1)IT1vIHGvcI@U*@CW%?o zpLdaX(OUc?Zi(YHPLKxrefLMRyrcfFFuCy=V*uWji|9FH6n4UO;1pg5*Ss@5%~e2L z4%I&EOmx}VS6pVG)NV=C7p~#%OE;5=`ib)kap{3RwIwlH(|75%*@~Ing<6nl;bUqY zkxI(*n$;F5&Q(;+Ycm05n@K0KmJA_tiIy~x%p)cS410ilqz&OeP<>*>E#BGpI@0y`=jWHzK1 zYEO7gstyy^lc?04jd?-zvNA7F8@`cT2)Y-;x&et!!=Amp5x*#8Kel3dfPUHNf>=lk ziv@d;{~z}sS`E#!80b3UD>7r&L`8RFk}0?@nbz`+3#uQ>K~?TzHn6tyVMgi2Et^pXTlZ zPz`ByNo7)tbjQf=1cUr~Lloy;fY5rj5DU;Q01Y8fZQW{TX+ZHN)Xcj8C5{w=jU zVmXKr!}nlKPSDHX1HCam!?iGNAD)x>b&P_>e$*HrM~o^6OObf#T8I}2mT*@{$ zZ^G4ISa-rNQXRY}ku`Ay2hQUkzxP>?X%9R5InU=sLM?3P0b}%4f_;rjMN1&*M2vQ~ zwNk%9a!gW%A6q<0vT7BRSW^Y|FW`ZnP%U+dq6QFW#bDqCO}w9!K>gRdU%D~XT0B&+ zv;0iu!_j z8mrBFxs&>j`i&q;3t6g|43Bv(vkf)3{=~Of9BuyR(1ZQPBlppUFIp12)nE$TAsJ5w z5hjTPFN9ic+i>8+vm=LO9d678*PNwlu~nYTTSB@^QtS8t!@n%z~`aBi0+>W90in0wbThaH?8HwIK|W;%l6!@Em=Jd=))eLNgjf~uxwbAH5LWp5`U2kn83F{(eOuDuMyKRE2-YCNA zis$~Ldqf+phjVjgwLMw~>LZm$&siRo; z1!NJ+)%hX!-;#baq_52WvrP48eNL$Kl`@hTIS~xmf&GnWX)1xJpeps>Hj3PVwY&;q zUM7y}#H;$8*&Duu1!5OCD5E#AoonIYtOyHqyKniR??Z~G^BmXKvjW>#P1fO-;6;x~ zxLflGFOG)g*XEvg*s1%x#0(5cw6n42B_KdsrfnccNx0%lqG~U5jK}M#_lXdSKPN^b zs+)xnwZ-siwfVEl3d@K3d32DGm!bjGTzPzpvxPvuL zIyG(9y+(W)R*_shY)9e_oHr{UU%Gnzj2iSU(o&>fQ$qy7L`xAs)Jsoh|BwrZt!^=Z z6?Cv`0JaJXQ+rnxsc&1QDXR+hbi&WFbMsiY`K;z2AU-T-U6wSMmxY2vAcYKVMSyLJ zW6cxPVB##nQy=1uVSt_58QW+Np7sq6^mcl>=PVe@Q{9qjh_<;i;pM41RER!p^;uqF z)>V;@a#y*jpN=KJU;})LmY!?B_a?tlHR(B4@J;=?d*8-p!3K%Te`v4U6BWYKAoulE zI5QnMGu^j-kxan&sU_fA?hq<3z_xZ0?Xud0670o2dP9)f;Ht`MpzDy=|Aca+bNaRq zvy06{uh*Nn79z?9qDvya*i_vF!Ti_)b;L=K5YP;ZzJdVH7z)dN7h9aoRxDxfE>q`z=z9MVRz zK+-^Q-BxFqcgcE^y8(`HazBLEYE#tSY!zWn{;s~ar*4g}sCNGb`4;xYvxH3%TLlE5 zZfuN@D4I#k-K+%^c(x`MSYFfRA1^% zw8>E2eHJD(&~{n?`V39P5}^JHQe##UO{-PC-@Z;OYadaUZbp^xUIZ) z!~G0HcNRnygueS922UI6xFl!(;h0iG5HB`^AdE6fVnWGn$y>S?g{0gf+8N#oYeFoY zuZ0pGW<2z)m>+r*ZHw{9bFpq8@(w!bJ50p`d=#n(Dn6`uP&>5kyik| z^FdAvcW4%#;$UAnEAxHkttkJ@SzB#E_&Ke%#F_{>e}rBD2@Q<;@-_BKyI=xaE;<@3 z{4C}$5>SeG_STNtaErz}?y3bPRnYne0>)UDjfuo7U4+;f@GT9Pa+^4xP(4SaqIJa_ zJ%@paq0*z<#8}UcMJrmOyD$$p+f3n$N=FAWTlH z=X{tcG*S7a`>JJ#{(DQ}x(fLtOOK4y9ww76R87y)90i z0rp~d4#)*TZVA*j&+crwy%=4eVCd%V42|b2v~!T^TfWDjr0dnNwV&b7c4KOl(#K-g z|40Z@;7Tx_>3=}N#^=1QOD)N#X7ObF7BsDw#AeIJqlE;`ZX95v(M2@<3VJou@K~6iq`J+6LA28Gn|g2=&q-_Bsbpy_H7^ zG7WGG-3OSf8+~W@8F#%{d-4-i?OEgQ-K%Y`0Wt$@gtv7VwXxs-iK*USugSlL_lc}O z3UCNwuUWx|Eb%ev&0T;3XE640dtOJ#V^)ZEh{_~|;piDI)Jm}=pE5#N1M)@~ee@0D zo5cey`<;TkkRlBh2>21TL0C(NqSSf>ph^ zZAz;?9pPfh0k#KLjOw*Ts|ljvfR%@k4--IN?1A2d2`+!i4!T>A{M_TA^`&~6d6OOr zJ-Y++Y@bKWR1lNm?&?BxRV_^}w0Sf@siyGp?!I7;l>cZ$Tu=B8&khOt_Qk}tjjA0W zXW(nM7{+R0%01O;u_W=g`V2M~_7eYGsF%eW^4Y8840XjM!q(uvJ*r(Gk&MIi?I|EI zStIS+O?K%=aBLK*$l7&Kko9SWB2qlTOnHHv#Ul2emU3Gv&18-6-J+>J8ONC1P9H<9 zNI}CZ-l(WtC(b{pZWZOI_=MFbu9}{D_>J%J*w%6%c}9%iJhgBL%m+4q0s+<)%l3$; za(n#`lwJ{7=m%+p1=mup5ob})J?)VidJm*DbRwSWC(KSz=>&?}5?4tG$|%7$P<$(K zHm7Q}%;{(uqV9DNXpHP!R@qQ(-gd$ZX0NBsT|!u%Z1sky5vvJblf9l=HIY2ZUQKU! zlQ>_|cMrrPv~$$*a0^jmcu$B`=u_2$#QDf`QN2Me^H&iq2S1LB0yv+KTGx(L)S6@` zYYrj^%Bw>vKpbmMYKsi(iAHHX8Txe%Rdtyp-CV#$eSn`Wz|789xvZP z`lSl2!UGn_^6g^H3iC;xw(t;$6u;S8h>ySmJbWRVw1X2@3z)bH`JC z7OwrS;7iuN*wC})nbDu>FGM-& z?ZP}W_Iv8#ck|47#$iV?Yqiutc;TI9@CbO@-21O-26}tXEmYcUPBZ5M*ITm(i0L;c znXw8k2$WdoiFa2|eVe&ETIb;P^}vo<1&724=x=?h>^BEN>giMIpcn{!ly4<57E(>$ zI%@TsL@mq@yW8$ajAY%iMH~PJ)u@9+Et7S{IY-;MO32T!y;|p(GisNZQA3Oy^@%n~ zZAY#7$|}vD+utC@ppvsO3Ma!HEPrqNxTL~9CCLh}WmcW6aZ!rdGEZS2n-!<18kIk{ zv4Y8JA+>4pF8_9PvEk5^80|G7MK34i`LUir$&k^N?8fO_~&^7u(BbTO#Wk0st2&am`T!bQJ$NJVDx60 z#XL}qTMM&T4ab0$W#ZXldWyUsh`9a7@pi*sW-IulU-cq&!+cZq# zG2m4&SKd_0DwstgWt{xhGf@9pXXib4!eY}@R5RDvKJUFctY;6hEibfY#pwy#WItgySm^wu_D$V%gj>M^}YDDUaf$Eu@-Y*Tc?)C&;%5AUt9MhmY8Lw z=h9t_j#V|U$nZrL@tqzn#ke7Kgcwjr_{l+*4UU z^uK0_bGYYT9p_%QX~M5%K5a(!iQ@duNb~fgn>kgCTgEFCSPso{5N&WL^MJG#VkhzP z{ztq&hvJ3(mwA4LsN)WTCX63yF7!^WUB@C33XhyZtuv75MI_U>3XMnTKrg5@&^C!z zybj)kLBzSo*+5))N@XZe-?09~$-PzO6{4g!!9aQHNJ}BgUBQuN(zm)Md2340q|&n% z1s0$2z3*1BbY6e^#aO@1P-d$3ZY2&dKs zyzI|}_jTSCM^=VjoXV#~6(fY|k5MGIfKfuUVytl=!-Ne8G_T&&Rqy%m*jnUBJYw-QC= zL7?kx$hgfriHTHRkMOkQTNZuORq=Eqidd>&s0{4{`K9WIZ$$PSaw~hCu18@1>e+|AV zA9ybNN(h-nJ~Dz?1`xWhl+cl|S`^F@1VVInaUt841KH$;Y?s~>AhKV}CP`$!lue|_ ze(A%qh1Q6&|F}E4|HCqd9t8Sq^75?B z)LjOVb;S1xAXRL$~i+p7AMzcJs-XLrpkv&8spvRS3R zd#z7t=9cSImbLTx6#jbyR(pCszy~&BEyg?cayuZ2Ok~etzc1s(`*!abZCIpM+p~G-$-aBJyATh+fq1dB(pfn`SXUVFKw0tB z-MoY^{Qed9o&%fUzn%Jk>wEwgU>Ty#`->P2VGGOB&4#G8{~^Heu}9uAkG;AiG53pX zCy0CfwNR(%#XUu2Xcm2&i{tIUqw9TbL$N8Iw{ez#w zsCo)Nt#idy?X21=OX{C1YG~=Bvr3A1t!l=))|OC?5_`-hHveCgd4-unQluEZ(`j;^(ewX!;soC8H&y*5iD z1~KdU`k=EptH&cc(25fj^nINmaZgZnYBkT#M$T~9vtg_A|0a7sUAv9X%rlfq*W5jI zo#s2;r|MR8)p^Po<^I(deRclg{sji;*3=3TjRo?=Qe$~ghsa8mp*d7wu|iYLE3{s! zC(^fD*f2b`o?Z{uSFa2fT;=VZ5TUYcI7VEH=-bL>9as?;e(?P%@8}%p>ES>Of%9v# z3oxiicX|@nWn+&iFTQVJu^eVS@hwZLt=*Ro^8)ye@)-B8PV*s2dpk6U={Rts|JeD75Iz3ab$1KHnG2Ir z{@b`=Y6PESO3F7}yYK_iz=QuHHL;f5@*%hULwF7>BlG8z8NqBQ@$NeU0T}qR{=0ge zh2qZZN#ZX()OZVSC|D(41>-MxOIT)&-BkJpHg~FTH{O|b{FCe;j)%taj#~Pd%^1(! zb@ZB^D%@QK&+=KotfR9YAi#By+@#PPKE{pSfpi(A4-94nfbZgW5z?E=mvdcw-_t59k_FD4pU4`OsB<16iTYFo7(>UTTA9QG#c29q{7T-~YP8Qdb~(Q^7|p=`k>K zPZ2GAjh&0;`Dz#EIpV;eDV&jrJ;m#qw#N?|V1Z?jOx`5qP$+1tHSHIrp>iu$8KwaK z;l9An@t4I(ITDGj!~(TeA9E5mB1SW9hl5;6f8&#c>IL8nyz9Jm3e%z#^+zUc0pZbL zfSdO{uBYqcalO7lVA+-5z^o4Av)j?^tOdR~4+cg`r&1M|b4`acAZ9$+3rZ-Cr&_hJ zVBtc~L?K#t-vlwB@KFHFY2>BqF97wAXRou@+Ilv`zH+5~WhiS8V)iC_j%-*?cwOsH z=1re~&bNGb#IeY|ss9SL483&d??V)YJL@Nyt8*ETK;F|1{yW>O5Zx4_tJZ#3A1s!W-Ba9G0%e##~n9 z|HH)y70vCr5gp6)H^Pl1R{^r8B5-TMiIiz5^>sh`I2JA7haF~fnD5^f!sHGEGG*LtemfS(FFk;f^xr=M}1RVS<+VYo$hgAy^1 zH?vJeH#sb{pTw z6(jR=B4_9{$8~HIna~M=+yJ`gE&xjcL!^bVZ(!H(y21DqK7NkCE8e>eV>lmuPIN#+ z4R^~tH-(9DD?lKkhadyZ0w1^>l(p_5Ts6q#0Y_N#MUIKyoP&qJrp6=qx=cipYG@sW zhcKL|SX=?isgxQE<-Q~OZ3xnVA5hqnN^O7|y-Y#s4N289h;^&22w%96EqH0ypKJ^| z5#c-de~>4?TAj~buf-(`e2%st$nRlPE>jr zg;*_vs?FwGsWbt!9y725H$XDf916{guwv5#*~eWN6G}y2o2}` z*x5l=9%%fG@5X}En-aUXAH)xx4>Hbh>cA(xK?`NYl$i)%Xb5=AtO1#|1J$dNK))bm z;}#%RM-UUjJcPv!HNeMXNBXzs(vT2 z#rqK4)$ltISOEr`VbCMeRjrXUl{@jT?jn>X#ayk zsT}dYkfy@TYxg?&slJ1;ux1^AXx z-a708-DJyhJ}s8No|R5l`{+kh)$H%*5YTn?20swnhh1!@&ZNWf`QnCTR+tgzxPPjSG>^-g*W|4 zVYAJ(-S$s{$e+<{0zvAyEg?uU3CS)W{KW6wsGjGA5U;crqm`lm@h4Gx@Op0vTY=S+ zZJTtx^oJW22|-LD=0lrh57%3dh+`Qk?UQ^+E!#rP~2tWv;K zrV-Z)`u2KO^(ZQR#%2;eOircjx^Ml#+K#0NmidRWhFR4k)m^~FF@zzW5j5(9Sz}O) ztW1{RztI|IyIa^zC&4fO7iB%N?vJK&B|%5A@mGoYt$FgbI}v)BgysuIAYucHtG=zL zf|LPTkL-=f9U1I`0Q0a(S&cx0-QiZO|*5x%{{Zt8Egn%`apnUwp2 z#y^mM_y5r9YS#bXtzxdEQj*)lC6OmRiIEg=NhGiJa!D`^csRixQ3LD|rINdRv-ofR zX)@?b`mm3yiudT~rILU-n!d~H^B%yMQ)_P9=10==l`M}BO+`TRWYARX7fojpQ=n-< zOo7&h-B|--3S%&E`o8ZEW5yhsJN3OBzZ1A$HId`DL~>^{$8U1TLjDPB3F6=c)-|4u zc_1?WQW($PWd$aQ$cVW#Ak{XtW#9IV>`0sDO&T1_gJ&SbGxwN~b;z1_&7CzZmz|Zh z|ITu+VMVNbuOVZ|MPA_?cxI>Xmb^xaK1SB!DdLOyM!<-5__!y8hpb48f6u1>ei*(t zt@Z-sb4qqD<`0UK+C)UL41jdXC^2HG_Gxjlocw|^oN~?62^&CFBFrZPsQ-d{WWB;; z(k8M|3ZG83JVH7}j6;#{2sh}v!=hS$Ds^Hx$q=O%0&7@%;yggvF;BhW*c%uyF#ANs zfjC6Pt}tBYaMK+!t7wCkDu|X)i<%EqH+lDgv<|7^hmV;cOJ)J&i4%FN9m<9O+1fM0pi)eggQP==+71;0t-q z&Qch8tvJ>0ih2u$h21^!X&8C4ie7A~0^~YxZZ@QD^Bs9W-Aa1e*@2N~IA}i+)e?n` z>AjKPh>>^Kl`mrC0l(ohJD2!uRM0V0JHiU1 zS8McX@anxmL=-~?WGf6hfo3S&Qp%BF+^lf^7BQ|MfXb{ejY^j>h;1qOf6U9&Uo#Ik z1L?f-m{n#_c?06>LJ-1YR#{D@bC~07A#t_B?DjNcIj66-?Pnuqvp#*mrnl-ELWle8 z1PS#Nd&p?stQK5h?FRBt#5(uAjcrdYN7QHYKxVl4sk-0FXIxa48|{|M=sk}eR}253R^7x(+F7wF2<#btNd~h6VZWB(uum756Z-tuQdk=K1ZGmH8h|XxWW+{a9p6pnfT&A>5;ujZGgpD zQS-7?%EWEn7vY7T3e#?pzEIgb*B|2ntHcA`SE>Il_Y+Fv31*$%CMX_Jj-Dz%0#D=q z3`Q*=8_haBsU_kF;k$rJKff5L^h1r5C$OP!_IbY_@P0@M*OyO)GTWSkgQWKoK+Jav zi1`_Ib{>KcSdC{0qghS#vk^q~PrM5=Sgj9Yry0a3=c?)zn_#e< zl}?O%{8Q5gDb(VL?nwnK(o#r_!i3rOJE*sFjN{%aQWMXlx=L9+Ayr9d%X{_1K zH%|*YpX#R>CZ!B*yDWpLV8nT;3a`S;SLe-B`H`iMl{O#%j784hU!aHPHhyq7aGK58 z%BHf9z=~DaD5;NSP0&OSHBQ7qo3UPQBreQUpHTlPHY113N^14>4xnBiBS4J2os04$ z6A_#2;5}WPM8I=Ty_2N+;SK!%)C&TFYsAR+)o`t;xXBgc;5H|=b@Lviiz?x)EfnYy z0N<)HxJTHk$LLXlmq#zE8~lXBIp5WOViJF+x97_f)wV8hHU_{lzTaWoah>5M^)q~xgY}^LE56vgcdrAQ`z=A59H`!s*!Q?M zw@k@weas$3n{m*aSWRvz94q~>4T8nuk{4+SEQR5T`Ji$dpq6E2Fpyt$rw>FtR#Q@j z>Mks5vFsbtfRkqQ|9N%^Y2V!`SRW_<=$nESX=b{68q{Y{Ym1JGGuD~^!|j!)xofgb zBqJG{P{td9>+tpkhWUU;Ha>b0C@^;zL9B{HjZuRf8~EG=WOJD;8Hg{lk6NCIwU>e(<$Xp^fDQtFtE;dW9`=Ri6UPj zP^RmNNTGN`@r;56IpxN9$Byd1(RVAe1k)%g&;8H{^2Jo$;45-^8kwoMre$j&5~3&| zq!-&f6cEzSv)?7u-qApYijXodR2Y1Qh$lF^V;_KSR*B^%&NGzN%Ibdvl`1os4u?~%mTz|y z{)PDH@%lKlz!>jtic>BspU3U&ChrX)Y646K8L;v3cw7tIv*-#|FjT#VjK!|-@3UZDPGJq@y6e5X%soV0R^=-kN6bwaV(&w}CHrHgfjlej3l zHjT%-mr)Plp!1A#2<0PDM;-xppPXUq$CeP+f7FiOhzMCL@_}Tx5IL(G70f!g>bBsW z%5J%}6w`llyCML?eFq7U9{U4$(cH#(Cm@=A>hq$mF(~zo=Z;tYulW`-!@mC? zqW2N+bjULp*Ti6W1HIv$S?Mlk$3^*n5An7<(9HF>3y>+w(lQ5vN)hf%BOeG1f9%Te z4ol|UY7A9F%pnnH{(pO(*3s2Zj8Nuncd0tUjI=catN;5WRjVt|jPuO8Rm7eDIYNAd z|MkR0h-ns;lBoZ4R#xFpshZndz51^-;Dvi9WhZ&SA>za$y6jfE{139?Sycz>gQ&H0 zM}?&s8#1eTRM4kJoM?TZHr7->7gF^b@f&-I8PP8EFus!ew^UdJVO2@OFdXj#+?63D z*Uwgto4i)p4~8kc7hZ2b=Kb>jSJ;9)JToBw0@Zb!^P=2XF~cD$6G^)u=wh|`o&|Kn zTw^=1#!JB--GUra!Lxl=@Tgi`-sJvWRtNGALM!Opil#m}f7=@n_R zoKzjj8>%<)PC6gC2fS=vFQqk9|J`e9b@}rwa06Oznt5Rs)z4(M?}K_!XHg#dnX+^k z7<9+6lJLQfTfk;6U>#YBbqp-J6tU9tz0wvekcB@}mVnD=7|;{=zNyzym!H52Cb`ATszz;jQdH56+!JA`Z5u_ zuI6<$Y)oDg=k!c{+Z~|JAA1WRVghW6b2S_=%1FhxCiQoK4WKyR8Led1e@&3Suv=pS z>ZLJ=bO#Y8e&7jL#O(DHf=)n8<$x7b+UWjft`gqO)8o17+n$VbH5Gmq#5NGVH|yIXoZT}+v?~V53<|2$ zo){myX88sMdE+HrL$XGphfj#S?~FlQl^M`wWYyffond6759YnEYxPwfFkP&B7p`1b}piWF18o>`7T{Fql3=J zCdMSTZiW^xBgfc!wb%*fyN^P-4HQi&yihUTI}NmpO{RbZs>!^NJ8QqW`6!eHqhG=3 z7c!=Rnz+^)*3#-ie6JZH)Qw78unGQyxI!U8BX1(2+i%$$M=TBb%wqjI+<2M# zyB3q7{6gjarpCmEn{KWf+ z4~&BEOJ*Al-`BKQyc0z`VvtOhf${1kYMtc6siAgv5?`tTi=4?}Ky^4$=DI(+J}!&K zz}cH>o?;QxYMJh)Ja9Iksudq}qQ2Nmcn}7JAwH!~C91Ea@9vGrR!c|5qK?4uNSqpF1G7m89?O;yK(#r(;2u*wcHcyi1pDn{A%no6C7y)XNHvG( zEOgajx9FRJgS-(_=^25t8MNiQuA;wkQD_tYHJ z>YR^(N)*Z}^w&y4&)vxP9wG)Ta;@+rq41TUq>^n~?amD

-6z-_H>W$=^@kG)6X-=e=@k*Gt@J}GukuOGr=?2 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

f(7;SCwaV)p%BS1<&ddcvhFlv%1Cpx+I>} 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 literal 0 HcmV?d00001 diff --git a/sampler/src/main/resources/assets/fonts/Inter/InterUI-Regular.otf b/sampler/src/main/resources/assets/fonts/Inter/InterUI-Regular.otf new file mode 100755 index 0000000000000000000000000000000000000000..f3a05e7e6998e099bd58950f77973678e24be65d GIT binary patch literal 212624 zcmZ^s2VfM%+y7^Fc5g|6G)O`qxx0k)c6aI2)C*1NB8tK#Ig*1kQfLa;yZ-Eo6?^Z! z7i?g!pdifx_KqU$|9$q^1l0HM@BQ3&c5Zfd$}=<1%yN0B%$zwzM2b^{5|uT6zpJq( z_bwqO4i|Fcsr9vW{)EM`6NTnpD}<@nPn|O3uCnI&Ld&{Uhz~ESpE0X?du2zr(DoM# z;mVsbqtJJ6{DvkWq(=xbzp*XQnf>~yi9+c3zV3~dV4x{xQn3%;y#-2J5D~K`+Ku!& zu1B=A^(;H_h1V|@YWRF1Qax>fWt{^qn2N7t7Cs#9fwo}T)&()RzE}wD*3ORZo`WZd zyM>srAK$x##HS|5Z{BmNcV5)!Kg6&ILw{pX~nU@>9EU7xiT)a-q^w`c^3QOLKoIVBMBo zV$4Djjw&XrKzIZ++`87IqA@xW5orp{02pgwVxU+h4#_YXBb{=F49JjNCD+N<M@Mo798qDfN4%KMnv@$;en~mx9O6uN);W)I&UVgm9`8KCxzhQl^I7LB&bOQ&IyXDFIlp)Q zN0hUdPqI3URH0YpY^r+PW^kd z%nQjsC+|Lzh$Pl zFLqyPw@l0tEz|UmmU%6G!x1g>NAA(N#~sl!0xjb@m}Rw$)DP)DY1^oQ^hz)q6oNb} zCY?TwuP`}&ff@CBx!J z=X^=a68`(*nlCQ<;wd3^oB^)eIg?`%K6dM_9oOw>r0eY;Z#%U0^KHKivF*EUJGXth z?WS!jxAks+Y1>g-UfS}+mdCd|N~yMu+B|pjoX?-wj660W_YXh+=+U{a&s}=_M?yp_ zbKH-*e`<{}N-Siwd<(TZ2V4&RLQCih>l19_HGF;se#N@tcg%Mzr1Xw1$3^(O9X#y# za==(220RaT3K3Qb##0(7o*Q;7IFYaa{TbGP@7g&wtf%kWu+FgC!ySEB;UauMcr9Or zS7K!a_#7Kv89p(5GKJ~CaDVvI976cXzRBO&XKpu$K)NDy?)XP z#EF>ETQFNL!Fsq-oFdK_my0XK8nIT~3LoVm@u+xGyohypgLqGTAU+nKh|ThD`G~w% zerv?Y>t!?M!-r&xd{iFPJo1p-i?RQm>5zYDMe;AXOB<>sX?fxuc|d-zRcMLwZ}|yX zyp|i4PlRfBj{Oj1=?Ri}uzwcFLjVz$^Mju%_>*YsEPSM`VG`SKFALwi(Ru3xC{(SzEL zB2ILhADf?;8_iATr{-toW^;@2xB0ob)!b%oH})C(#W1njIA9z!4mpHFIy7^KxzjKW zhgo8NVSedQ4qc2;1006KVGJ|8#y!Tp#(l>9W`r4OTw+|RhN+GSos)p&8KSf%^adoo}BPn<2z5NC>u)n0wQxK7+4 zuGc>iH;Y@uP2w(byZ*T&L3>Cat44}v)LQYZctJcRo)^z)+tfz!lK!JUMX%HE7VE`p z;$6K$uNUu&kHlx%%VL|@u4n35s!n@fg=wGaE=Qt1K)c8>R9qphRxgUj^woMgJP`PZ z>N8a?-Vi72&uMpRcd2*8IpSQkOOMmO)vwi0RkeDl`c_|~eWI_^wwR^b=lUDkRu!+N zsljT9idAu%S1Z#`Qwb_c4OD}4r;1b&>I5}c9j}kkH>mmWKTgz&wGypV8>#uUd==7u z(YL6@+D?6$I!k+Aoukf$Z*smmRh_0iuFlX`sWY(-Kd2s253Bpsz3KsVzq&`=4X@=H ztjPoFz8?RMqwb}%2jOJGXeX=%A`&p~et~ZqW($KZH^{4ga z`Ze0c+C=q&_OLod{iL5_7`oD?Xw$Um+Ei__Hc7Rq+tkdYOXlzFR>!K@dXbu;j?sSAe$#%}{?PVle`;@P8?^P>8+xu9E=Fo^ znICE&Y9DAH$sZj_TA@~MJRpBC9yA^@9u_;r7sgY@)5bI6OXFGNIbj;l8!w2jj2Fe% z#!F(C@v^Z_>^5Ez--vIGSB=+<*Nr!f^~MI{P2(-;HlvJpWUBGDOp_yIuFNyuHQqDc zH$E^v)Q{1=P?c(&dB8jf4{@uiR%6syeV)2j`$^5wHml?G>+~A!9{ptV&;a2WrahxQ z>lp4xcBD9*+B%u8y`sIUy=H7Rqva4YMn;*jW}G?L93lt6Gu6y^W1E>E_L_;}dvmCn zBz`i7iJ!%?|g{H^!nm##49w$ySi;Nv+u{>Ij(8JBQ<*|B{K1d&^N9r+pv>vYy(Ff~8 z^+Y|v9A%Cce~Aa=U>P*Wm}AXKbDW;1=j#P}q3+SW@EC8@Z`NP8J7b1N{A|@N1_@X}$%&ztP-azG>E*?l&DaT=d z=@+T8-h9Jck3D6zvD2JrPBJH(N0~>PQ_QL6G#P8oFsGX{%~|F#=4|s=87G^JFO9Fv zMzhHbnhVTkv&9UV3yrUhUFIUQRs1M@VwRj_d}Dm8kI-?rpbn{n@R<*&3)OzLPyMa_ zRD0AP>UZ^<`c=D9yGpxUyFy!|T?7Amk#?zenSO(IgLb2Kvv!Mi6a3JF`Zz4D`}Du{ z1Nwe_ub!>{rvIV;uK%L{tpBP%ufL$bsJ~=Zm?N>zK6OCmfGm+M{wFfUg~mt5$Hphd zMq`usP@E)Is1agAbUpCj7uc#cAr*c)6%2e5Un0~x|oIXk)>3GNS zuH!xJZoNz|cWiQe>iEpDS?|%i^_St}U9Yawo=|JlSMnM8lzh(oKs9QsyI^9q!^fT2h@95>=`Sl}CA%PvxrupDNmK%a<%!YY?EE`WVuq?Cl||Q zvR5vVE4070y|P2L%SGCLd5Ub6r|HM)v(;Vt>FN?SUCUM9V0T+5|5RVdJ?d)RFTU08 zP|s=)Xs2kawNtfw)fVkE?M&?q?SAb(ZK-P2XQ{`uceG{N>H0J37wswiUVV09z=u5SL7StAK3pGvdFd~gXn!||D8nqVns#>RBQLkf1_L>o8gz1|8mcCKn zq<^Y^2G0`zmBLr2|Mc@&txwuFW0ye~6sB_@pu?w!|6-wi4|Um4S~nxf8%|~9tI#w? zJ_sGb$OX`JM$3j~F!EYxCL>>gW-)Rtl+potGc<>hzd>^uN&B)qMs9%SGx7;&0Ym!} zcvlwkVW@|Zr$fDrJQGUifk2)MEds>|UjQv(=&TQ?I2Q6!Xc;4~fR=*_q`wL}l9BI0 zM=|mPD0Ys7+z1`R$jwmffe5(?I*ySyKr0#S2n1$AMnS7>!k{%akl3QM*aky&tSJC za301`+6J2@XroOFl&*Io#(>o!JGJKoMn zsw4F)kO!f6G8)grSbu}7kUpPsV-DLAism&$CwW2{fztr`T(PmZ9mA!zo1km zAa_9@2B^0-6iQ_RS|0Q}L1@tLKON2hn$iJb_F!B@Vvy7Gr zeU8yGpwBZ}7W4(iI>mnx;g>Oo(|BKJV?e3z2_3x3V3#hi3t|R9Uk50=F&z4?4LytO z0~m48_rXU9kAPB}5@P_Bl^6{+GT7nc5XojN^i%LT?xiwswb=pPW<%xO4t639&E<4I zF&}(sL*w`>2B!o#7PD!9Qs2Pt3?G#Gm>|2RcK;FarBE9G#0B7I2ImSw{9;3P_bd1v z>8X#%CWw2%9viZ$KN*}t2za;*+0n!)*okTDF+8IrD@NOLsQ1>Cq7dC63ej`+Dy^d%vXPG&O3 zU?}>7Fy=$E8F3Lb2cV6O0MyHf^Pp&7S%&x)XgQ-dL(yKc67lWODu&irSW?a2sFLzkP-+|C35JdcC&;5d>D!tx{NIcG51 z4(OQ-&VGbEi@_<7kY_XGPswu_S`*0Uu>20{!}AzHeS1EmGN2bQH22F38Jr~vN&N)y zo=wRAG3sUL#SBiGguH~IHz4G@SkQB+jR4M}guI-gF+)C$<=0Tzsa*h0sVx7-@^P{d zzM3K5O0HpWh9xBRF%Z{6ZFDO8bqr3p1g!zqI#3F|fiXXV-pJtmOUShh`9$(2hURJV z1qr&yEFoV-OL2IYAe$IwI%FujCevIYI z91ne*5nG^7F#2oIC&5!_hgYCaGdkt{jLrGbXKkqe$)kK*{)TP^D2qvPI|2IK z*a!WR!MUWMxz(CqX6+*IF{8kWNbhPCN_c*IW!vQ-$Vc$iLH48NCyl#^9_~Xec*9ezBI$(E3XL z0r@YEFlaG@Q(2**EeP_Pv{HuFe65TTRL*ix0Xta*9mxo^r#6bgd9Kh#GvwQ9V;I^y zX=54MA86wk@Z8GSvJ>IrZzFSJ$$C-g#VV+7Ta>JM;gFSHKOiS#!^$<_hw6|^pf{CcgM zp?!eX!|0zwdl?7Dp0>p1A?Q*@9}8W^D6-|{4EfjE3P!Dkp2U!^t)0w}Ppz$F$WPa( z9Rc~>+G>XUaqSeFZO~I0wGnz6BVK}@&gefvsU3k%_H`zslZ~In;LU{4sNDhHQSiIf za}a(F;d2@C&9(Cwy#jhZqt`<(V8~Cm><>0b{dQ-zhRRQNa~aB( z3B8;&klg^hnGxD84DExpTN&E#YPT`852iJkP}B~0FsdASCxf>- zLL-|4w8zz`KY&hseGj-7P}=(#^$zrY@Bq@E1AUNDyP#x?K#zkyZ1XMj5k{x>c$Cq} zcBpPZ)j}U<^it>(jG}v=WOQodr))lfKF#Rspk&{~7Vs=%Qa)4%;&VWD40NjR3pQJ! z)Yd@7L&x}H%9&<%`=g1!mfLOuhb zZ!@|RN^J^MB=lWIML^$U)Cth{88sLB0i%wGe#q!!pdT?hJ@aEm&4*HZ0W}Z0kx?f? zHvzJXVzAj}B$V2b@BwN&A|FtD0TqI7v-t(Oozdx@9gJEG-FXCGAPn?n&@UNv7W6Bd z=b>MNZ;(IP74`jh2$P+BZ}T|x2S%L%{gKgEL4RV@nb4mZ^$?WG2Nc=quZ$vl{Ebl$ zLw{$~eb7G`MRvc3QLuIGPezgL|HUX8AA1>fH}r2tk)7^i6xro|Mv=`PVAK=PgN&kj z9by#hT?vN#3ndxyL6pXjkD!o zXUL}@`?G8ic13n+*`^;l&?W#K#ORZuuy4!8$3deR>IW6WkiSFY#~MS|L*p2O>VYw4 z0lQE`7=!8*&(K(*u|()-LzT$r%b`OV{TgTzLvuX&otE!85jx!F1!yuu^OH)kIR)yp zfgLFqqf@+_F{oWr8J)_U#*oj1_e(;hqdliVGZ^xpR3<~dm&#(uFH_kzZO|N>+n~8N z7zZkk(P2v}9~2<}qo9QhttHCCkng3uHqS$S4EblOh|#ZxVw_u$EtD`c$EZ?9r+zPE z^oOA342?Ne!DwrtBN_c0=qQ_)pk$-Kn$yW{fKE0>b_{gt3$hPD{)?()^j;{X13K9! z*(=%0Nr3EW3~s?RYexGEn~!R0irZ zg1)1^Bq;548~Tpgl%RX4-3fZeEE{_EF*fwP**5h2V{NFsb8M&{$1ytf&+#^tcCHQO zaRQ@Lf1YSV<(Owf&zuiJXp;lbg`flBU!k20tv@s`TXXXUD76Kk^-6U!w1!#jg*Ma4 z9;sc3;egr;&^sTsl(E*c6$k_KLn!qbpmj-|%+PwJsBZwRQMA`0XdkOqGma$a8H`p4 zJ(HpR8Lbn9@c{H}hW5j>PN?$`{~+`N#&`sJ5x5lbk3ug4m!r%(p;v&b5Km+3YKG2P z)f#XO;-7_H%Lo&C9k?Fx&qHru#8=Q88RJFhT1I>gy@@eig5JW2UC>(r#<%e@^maz< zhTg##uR!kvccGl$K<@^qlkqB)#v#fp6QNHt##_*580m&mxq%r4eU35Sfl|4FOohI{ z7;i(V+$f`@IgHBm8p0V+>U-FNq<$y+Kpw`sP#c|W>^+9oaymbaw*$UlgQw`k&J_TdIXN*1%y4i;MWD7&+eXtA1hhlcB$Y-%#d5(BB!yFz6p(5AuHo`X~4sKKyX#KF0D9_ah8sI+W^+ zJjiF%(Vc{W^68Q>qoEojhd>o$#z2vnkmyI<00U5-SZEjsM?9|e2u4yKk&GD+9mp7H z1AP!m`gyd6zPhzApnPyQH`Z#-wMCWax}v zAH~SA(9sN?_mj^}NZ6H5-vN`#IF6Cyp_Kq>&1@)aosbitbPq5w*7RD2-VM;+m@rXK z-OtFQp!JNL0;PPBhnx#a6}p=~xpq3t$_ z&<-22{Z6nLZ9;a@#fZP4-Hdnu+QUf7vzMXwH2M;-6!((tEMv?{=yJv++gSlt1G0fr zY}P_gwYd>W?M~bbsQ-wYz!^5TLeI3h1$vgv?a;GrZiAj(QAG4$^|^z#{6 z4!wXec0(^@lpDn^m<0p*rj#^A|HAaBdIT_9f5E|sl9-taY^k6 zL>iRZ3&=VswIh&&pwwPKl8sY40(x($-^I{-JN<5O56WBvy%*ev@N3Zf0qn)3JRbxP zA^aYc+78ga8POkM$Q=v~X5?Rq+f}nSew2vYrzR;gx z%(tM=GBO7G97FFK_2!Iry@dxx3MvjEO%7{OqR8JtsL0@Nt3;G5l z{m}J{NQKfffTaB21SpqDY2RidC!@~@JsbKhqf_0#W5`yLVLyaU?E^a^^k1N` z4?_PL`V*s5ThTS{qd6d%o`-tSSWH1#QzUGx0;+*bfuEH^vlvQ{f^rbzRA>&!MH-|_ z$zue4pU;T@K?@i`X$l!}A=CrL;9g2U7NE_{GH4}Ojd%*50?vTFq7PHfWCZ#(NQQBrPT#02P#44ti{tOaN%vki)NNkO|Bu!$73V+z{dd;yAn zBIryd1^q|RIZ6uJjiB?D6!afK=P@Y<89Jv)ImFP}j1x`f90EVz1x*CW2$w?Xx(?yd z(DC3Xgd3n!!EA(EpmP{UC-iv6u^4&+wFKO zuN)X>PK-O}W`wsuKL^{8=6>jQ0K0Wy%s78w$j5R1$dK>jgxwOfHaO8oPV|j~;`RWv zzk}iq0JJ;3!$ETjR|LYdppgvi<6Q$8+IzbOG3q*K6r()>jb>=??uua)#;Yrqk7g^1V&p0MZdd-VopZ8x{?^V9y*MnwcIrvq#zC2*yUts zpW#BqTyDhw3{7Pu`plKaXp|>xols~$7wnsm??N*e`3@9zNzfYTDr6jcp&mwqox8jY zo!z>8pa|mv{pTuX=-)56s7!$Nl&(@nt$?EM3Gx$N2bQQd$_fzD$b2cVq{{W}R4#y=tVL3_X|l!xqSH6!;!PXQMp zegO1ha25JxJM?O>2H~yHYru5~e+ym9&|blH6C;;HZ)W64Q0hxydRkc#4tj(5D%>2>J{|?_pfe zGLqW+IYzcZpJ(K0(9I0(dtF-?eKzz9MqddfI|Dkk^UnSE-dP!xzzD7!nAk$a$N z44s3z(-}H%aAzk0I(3zsUk~=LGG~-8~HL*WJAgz4LJ|VQ5e9rZxq% z*LPDJ0XhS4FK6g%z>P6X&{=}}B!9_jAhMFyaen6r(99%0Xz9HkOe)ph=8oK+zurl8Dq?M$@6=8Tkzq z_D0Chq3HWmluLe!D zpzm&g9>=Ixp%|yR7!zt86yq}YM1)bkT#QFTq3n6E3ql}W{vk$tM2OpOWYhv7?m#?2 zXK!~EFa{cZJ8mP4C@A`pFv4(5jpq>>?EIh$Wa8d;pjix^-yh6o^tYfnARlQqLh&2| z?=<8u3oYoqg#2ZZ1--jacqINic$~PKL;w85Uo^sBb&)c9LVHiJYu1GP>A~jS)<74< z^&|@sHcZgxa7mxZk=8|uMi zq8gjDqs0tyEE+!`LZS^DyNkpX;%0G|ctSic){FPV4jjPk#ZOTU8HpdF4wlK1epu|0 zWpcEvm45sPcQ$@_+lW8B(t#f&o{K*daRvUQ#4Y&q4)^0vNIWZF#E&Z9!p|i)$}_n+=D;Ga7c4#ky;G?Kua2aT3&)5jgQs*_?h+zS_6I{*s3koPS(!C&r7e-Zqx44 z9@3uG)@g6!2h$t1&DxjRclhb|ANc9xA^ZqE7C%r=QmOb6XptJJ#;IET5POC?P6gBg zwHQCzJ_|o!y+U25?!-^bAH`40U%<}|H>h{ihiZ%3p}tl>s9*7;)_wTVVHkcA9ETqP zC+kk#t!Lops(JXqZ<$_+ABRuH&mbH0CHO)88Tgs>-TEW=x%oQ$Oz~s({Al}4W2^Bi{%AoQepH?A$Z-@niX7#R zagG}Nv5`rRDUMl=*^W7mxsFCh$kFat>{#YF$+60Dy5n5OWsd6|cQ~GOyx>^x_{g!_ z@vCFMsqiNphM5KU(eP|DfS>Vpn9I#m%=66a&AZJf@gv#w=7;#B316Cj4$uY+8ZdM~ z{s8}gX#-9i&^}<*fb#}iGT^!acMN!Vz`6l%57;>1`!Ep}7B)OAJ8VqYw6OVM&0+0f zU17_^R)w7rc23y&VHbs68nz~EZP;yL_l7+c_FUMjVQ+?g5cWyfwy-b5z6tvw?9Z_M z;d=O>@c3|NczU=eygYnNczyV^@Y&%F;ho{D!~Yk)HvFORb>Z)aZx7!U{#*FLh_Hyn zh_r};h>D1sh@&Hpi)e~yi&!3Udc^q=S4Z3waZkjP5$ht}kJu9NRm86mha$rxVoEmv-{MsAAyBJ%sl zzXr;IkptrgrVh*j!Na^wps6 z2mLna?voNMJW@*f-m@{K8h`BQ6mYBO^o{3o> z^IpuxnC&s&#QYU=DAo}h5t|a59$OY$7khN7c z{@CYY---P=c1!FRu|LM{i9HY}+D= zofG%JxGUnWkGnDM-nd8No{n1|_d(pJaogi|#r+ufN8J9w0|rM8jvt&nc*J1e;PHc} z3_fP?34@ykFB;r6c=_N{2467vvcWeEeqiv^gI^u|$>80C_YTpAL<|`^Bzs83kcmT% z9nvzSbI8&mrw=)A$eJOy4Y_y7BSW4Z^3sqELp~Yu`H(M%d^hCRA$#LRycs_zen|ZA z__X+(cyD}p{J403{88~Uym{5kQ@#DhbPp@WAG8=5+_U}(wE(L-ksJ#lF3(B(tV8hZ86n}*&w^nsyI z4t;UxYeP2--86K|&~JwBNeWAfNgA4zo8(OznN*WBF=<-T+@#i|Wl1ZOE>5~W>DHus zk{(WaCh6s*^-1p~ZA{vl^i|ULNxvoiJxmUZ8J0NAIV@vX{;=XDOqSnse^ z!_FUe@vy6g-7xI7VfPMuWZ2Wg)(v}g*jvLs9JXcHm&1M@ws+Y6;rj6C;pxMRhWm$4 zA08OqGknSLmBY^*e(CUQhTlK@@!_uz-!S~s;a?B`efZzWDmfC1$%tfc^2lU=^0ef6 z$)V)Vj&5Gu05`U?ihExyU;z-Jf%$qtowKjE1>ipD>)a9usrJkL7QR)?`*QMT)dUxtWsZXZ9 zkosEcd#PJezexQy_0QCUX+~N^T2fj@T7H^0tvszRZARL>v{2gOwAE?nrd^$OW7_R$ z_oY3W_Cnf*v=7rZrfo~xo%U`bHtY;zDrl>;ps8yiRsSty!4Xv(djkm6Vs=q&r4sB-j?2zep32r>F1_j zoPK@!UFi?ukEp$zzCQiE^o{9T)4xjpIelM-BO@#$F2j|Po#D$El~J8BE#ugXc^L~b z+A?}FPRckf0=*;1n zd6`9-BQvWqr)SQ}oS)g8*`C>(d2;6IndfC*l6igR?V0ywKAQPV=F6GuGvCYHn7K7` zH~xIv{;WY+DOnj=1zDrBYO;>bnv)gG>dso7bz#;uSvO_fk#$ej16hw`J(u-*);n1r zXKl{fk+nPPr>sA+_GLS=W3m&nle5#Zv$H+fW!Yo0YqF2Zo}GPSb})NU_Tuc5v(L`H zF#EFX8?*1pemwi7?ANp3$^JNdbM}tx-Pu27@6FzqeIRE*PF#*NCpX8NQ!Va{baH{{%wb8pVWIZx)in)5-Ycq3?&uz$U$!*W=&Rv#!X6~iAYjW4--jn-y?n}9E<$jR6 zDR*b?_qo62{+(y!Mdu~uW#kp)mF3msP05>+w=l0GuRCu=-m1J)^UlmWFYki9i}J3> zyE^aMyqoiG%X=vA#k>u9pX6=L+m*L3U*wzlVfjPyN923*N9X(VC+APkKQ{lw{O0_& z{O;3@I2^;4a80C@3f`7+p|ZFuvgEf>{M~3mOVq3OWjw6s#;bqu~64 zOAFQ%tSz{s;QoTg3Z5-kSFoYr{en#e+X}ue__pAeg1-t56*>wB77i{PR+w6tUFaz+ zD;!%`S2($FM&WUVfx?!;j>08{D+|vkJiqYL!Zn3!3-2hrzwoibXA9RAZYX@ea8u#7 z!mkT|DEz%}pGWhAd7?cDo)k~IC(l#l8R@C=jQ33O9OF5`)8tv?>GCZ1oZ>m#bCKr? z&vl+#Ja>B@@;vEz!SkBuZO=!Z&7Pf}Z#+MH{`4I58s126oHxnq_GWnty`|nU-dgV@ z?{x1R?|g5wx82+8J=uG@_dM?<-mASgdT;mM=Y7=sjQ3^ldhdJQjoz)^ue{%TfAjwB zlfD7IC||rU**C(M>+|_4e3ia>-_gEVzPY|e-$LJF-!k87-&wv3eV6;L_1)~d%lDw~ z3E%U+SAB2!KJh7Z+VsbVJc?MfVmxQuK7uOGR%Ky<7B2(dR{97JXOrYti0fQEV0u zDjrfiyg02mr`TIuUOcYYUwl;Y%;MvV8;V24oyALwR~4UGd_nPL#n%+yRD5Ug1I3RQ zKUe%p@tegT6n|R0y?9sgkHvo!?=Mj$;UzI8i6zdGjFSA4;*xPC6H8{5%r99~vZUm+ zl8Z{NF1fkn-jc^lUMzX5WK+qPB|n$^St?4yN@Gihm5wOQFD)${S316QTIq46jis%n zy``&4&n~^VbWQ2arT3IRTKZh+>!qKRZY%w!^taOeWoB7S+3>Q=GEdpavf8pKWhaz1 zmUWgbDLc9Btg?&Ct}VO0?76a!%C?s6F56c=sN7v%TwYgxO!$TvrB8@YSrFC+JjGDZyPCF*fI5Erj0p%%%U+TjX8hJwPPL_vu@0XW4;)(XKdKmxUtD&Gsk+z zjvIT_*x6$PW824`H1>?K7mmGZ>`i0u8T;7S7sjq1yK(GSV}BaEcbsEf+_>T6(#I8! zs~9(KT-~?{ss-mi@swq{+Rt2g$s#aE=RrSBB>#OdmdbH}f zsyC}Xt=d`jUDe)dvpTwZXmw_FN%hp~_UbdLFQ~qwc>H%WwMQ z{Vsowzt}(4U+Hwzrp{Y|7rg#{QSYrET|c>g zZhdooSN*B=7uR1|e_j1;_4n65S^skVoAn>nZ>`^5|4aSfhbHwe>i^U_;1JmT+rUz+S=P5^7x9XCI{LYngZ5EaZzePgmm`gH55< z*1&i~)U{JgFQV%oX`_$Z3;F7TRWC=G0GKAr z_GpU7vjYo4A+N{dE4AXwt4NBYO?|MdEzsW7 z(AqtdzMt9ELt=edR5z>dc3*Mv`2QBl%Gh5sr~i)PI_pMX@o`*2Urm`mz^z?d7oaw7 zz!wcY9i1fow-wbiQn<0Px2v_Ov8yA{)5OJSqUa`0&N+LVRy1)ZLMZw2j^-BYtKzcm z){gdOZe%Oi)X@`YL}&FZ2(~vjQ&!D*Y>VBwJ>7@*R@c(7TjRzk`^ko_0eiI z3|}LOFZ7Sj4OzX)pH|<7@F*0ZHQ3#~aG@PQ6c@E(A!^y(-4h74E~4iwqNlXt>(;hV zla*5|H$W@$>S?8lwo$q^N@so82GY*SP~3J()ZV(lDrE=t+kz0PZ`&|J2ZZ3;|IYq2Mx)p~bJu5h8%L3{HZEb;CG*e(^ zORy(!Y-nm|MyRRNq`;D3S5K%h(8>na*U*y!RLs7szI!UHC)JejwYRveFJQ-DsM<-3`bt;qnHlWq z?l(*O>tb)s|4}r={okdT(bCdy0(K6ip1!PneSxCBKyhE7uUN&Uc1%fMu}UiX()5+M zxbLgtiu#ry?6;{kcw`$){XgRRaxEGk2sA8e33P`7?R{;A%KRs8Mq|s;{)*JD_-_Kv z5YAX%&fY+4XG@>~2GLCR(M0wU?CcI{k}3jHIG^6EwXt+D7I2Dj+Hlk}qhkEJg9_o@?Y{l`OUtfi#H=MT31Grlg^Un5!w z|Fs;_%-LV=;6D~m9t2gL{a^R=hk^_K@eF@$%YQ3!#As+bqU9P7KMukFlm~JD_t@w@ zJT$sn8jrZ>SkQxx@2_JE=J6x1mj}E4)f=_T13i7kZ#}${v>y(_3qT>dgH3(OLcRT= z{+>j;{de?q{vUDut=972(bIF}q=CBsXDBuOAEPI+PaZ zfnY@sIycxE?8d;sXUC#Y=hBY$)=*a<(2H3RlYZCoCG8l>0Yo+T2D$?6p~eo3I4l5N zWHhw$Hg@%{2!^^kdU~6?LNv+yJXQWS^0wf?l$4bgmBJkf^mO%h27`Dz6Iv1M>L{?> zo{silftNmd+I!pjw7}c5w8M&l@>IN_qqnQTYkgA60`E*DUJzOWM{HRE#`H2PIYQ`@ zb}QT-qO7e?zN0gM^0o#S^b|A(x`WnLSE#v#FB`f7jf;X<+3l~7xSqGT7d5dX{&R;F zaX3lvA34CP`W_JA=d>*EgdfrXS2x(hVXHJ4bMOJJ;DS(dZ&$GYGT7E1@5`*P^}w1wLHLcOg$c=B>9x+%0I)D-MbdN@^}v$LyXnU!IHa%>HT0*iZt-8~^V zbX~#VqChu_5b9oJ-P;}PS`umuwgtKth2Z40hkBNyhk8PR)~3*c1>L=wDdmG4R@Y#ZAK*?lC$W(e8Ec1W{sb8R-s2#*AHAPe7 zP&Ao})pz}Atj6uK6Y_Qcz1N_W4K&~M2SV*jC~Pgt*kts!EococqZn&5)Y#TwIb>EI9X%A^ z6@ou$-O<%f+R=;=w8*-HH%3;lKPyz6BCLnnVOW&q1tZfotissq;4z4#eFmqdXV}4B z+D>&hcAz1Vja3-?n_xRyxhdFYeYSUZ1{#CGHcNV1LS6X63gg=@GEu(50LRkKVICk> zqR!s-#-3iwGWs&$3|lZ;Sutc2OW}UESXY5AT+s;a4_L<6e?@zZe_R~?x)(Nqn=PX_ z96J2H^+o^v{a1$*G<7U(w{ARoHcOo)Gi;gN)ZW}MkJi0KR;Yo@x@Q^2c%Zqf$C9RY zOL{vSS}|EsH99*m642%p-`?CBv}RsUMZtouKnJZ&)cm%c(O2FQYyS6^_}Rkx4bs}U z*c%y7X;ndEV;i~!+gtQ5nNUG1#vC@deU@#<9qwa1gdgB#Auk+{^Rbk4bzuI7x$$Kg zODW9-7}mk2CJg3akT!K841vRs=`SCiZ<+Ps;#m96zD+3d^ZNa@EOi}pJW$`=h6Zd5 zSOWxKc#7cmQWJIec9KDorCQn3O|`YVxhX=%G=mKHu}dbe^bm-(%(9C z96?QF4IT_s+wiS%L%yS32EMJDrG`pmnN3Te6%(E{`uHn9i&ekc+B&N-v1)UxEug8Y zB^c_N#r~|1qZb8RmtexCNY!pt17`-v)yexmC8yv6h&NbQumzShHL za}gZn{?hnr{r+ayB^>N--oaD#f^ZC4`{n@T;qleg(8^!r@mSqvH8`07O~!0`M>ZjR z^AftN$X`kW2pP8rVT?f-f1m{ubz4UhVhYe|eJy-=g6y+=UK{81m7BA(Dqdt61~Rvf zF^c?t+8%h1FdgjEsHY*+?+|Jmh_#a}Dl4;!+TR42)p|lyJh*k;*zQ_$>k&V*V8Z&5Y5l8tb5f<28b)!eR=I?zk~787hjV(Y5U z>BKcz3>gc}1k?L!P7584|3-3Cb-IVU*<&5+_&mjARuC#Hgvtu3 zT8P$0so18xHPbC;je3XrGPtY}`zvp4$l5VA;-sl7&=6`zZSdvdjs?~Otpl8*Qa-dQ zJ!nLeb#${T%3RiG%ZzwC%!MVF#EFz9d+ z)7y;-TXP3iKy-s;9~>n6?r9xv{vKa>;s)kb@X|yj_{S1_ccAD zYAjF2@)3iJVD{Ds?l*sQM+tQsg!d99Y%wJ@-L#$WJI*OC>Ce(zS3ysK_-p$Q{k(P7 zaD?!8ert}a^HZLPw5F;$zn!%;J9$d1xyn;Qor$MYXF}LQO4wek!yiPlo%8DBDJcqc zH^Niy=^OGrLF^LQ_iV%NA17O(b_^7&ANqDnR1a!jJj7FEtqzb1dy1tmyO*~$bl~(5 zql$x;OWS|UT2yP5sI1NpUpCN+eOOcIh<>rMwJPK(Dk<+9Wi$!2c3?xvU$ePd^+hT+ zSF66b;wg#`yYSkJZ}1)Qgd?Vj#sD3qd5`JFZf@Uz>3?Qmr~|G+s2d^9&+1iQk(Gn5sDfIDTIuj`!%}KJ+E>Se zq0D=DsMgWgL4qS!--2(+z@D3Zdu7OI0xv)nuGobb}Ybn@>=t9zw5Sid3$?TZ~@Gwows-Wjw$uM zwWI|aD2{eyxNJbMJJg8dMr)@$Z(dUjSd@&DPjtl2_f(6>7q=+3)#a zfwC4AU$Hgze8nZ$)Zq-Jr(=QD3x4Z3*yrc2WQWG*w^kmXpS#&_tvo(IXW-{C=(on8 z&+mh8d)Tdk!^^o^Cgx)o#%Ilv9-lQ!LM+qt`K#ei&>;ziENvV6JuBqFF?JIU;bb3SAeKW2# z2g2XM4IZ!0Z&`4^gI?F&!pA|_VI8sM_^+#n`dFsbU%|r;dB3&wyFpm6`?r1z(VxMt zPHdWBp_UVdod=!%^;oVZh6oDg^?OUJJ3~iI=5}ONUrG9(i-OQNA%ptQt_bHGmQADj z7>Z=AY{%^#D0^U0psTS3(}Ug6El3r_ju*$+G%0n$vB5i;VAE17o;$CU)l*ch+8XLZ2$>gzx)MU&453bkRIy9c ze-?oPSgtdF%Uh)yGIyjU1BcL(1tF7$@HVQ3%pF%`?*2MoxwU%sqBUT$RL;Y_NZ-&5 zU`?KAJukOFU;EQnD1%iKI@Yt7&Hg3R>#wf0&hh&eaqBfv-^KFY?$%HbnyD{h&c7pq zs9k75=JBcagUC>zV_66e z3{S(>!fW@1?OE9?s<*cK$fXGD4LY%}=+wDEobaz`p*M$?Nz_$X2g}VMyJ#L z=jv9c{v*ap(-Z1x?dZ$iO7oAHDgDRyIK!~pui0L#sQN|L1O};E+>7H$ayZB(f%`Sx z-lGS*sF;2pBz_DT-VIp}BY$I=w!g;H*Eaoa-RCyZeB0+WSw%c-t+jQ&DHE1aY3l54Dn>)Vo?82Qq<_->*JRci z>ZC454dzT=MBZ6@D|U4u8W=urIn7)UnzA6&%Mfd;;Vq}B4p-JT#9MA{L%ij@>ic|L zA97i(&|!bW>#wusT7O-wRU|SDyP>PftaTlER**TMiuUQAU6ml-)%3k=p=W#Q%Hi-@ zh4R!Dp%MZ5|1#dyffox$Yyhmj$BDh2iRBGhx%c&Spb4%}H+_#+T0K^4TRmybzHsh4 zTQT03aNWzSCEr^{Rq%Pstd-weR?}ncTCJM0pKb;D)hnJ)ZHz6m6-gtV6Ox~2g)Gak zLbQ@{0Bf2RuvRJ#ErrX>r-zmvUM~8lxqlo(Qll>KZ$@h<^fiGMJA;OmwO2)5utTV_ zwmE$h1fROtv&BEA6S(Ysd;h+~*3{UEQ%xLV_P=LCI{RNsgjQGw(|xIJpTD@gjI1^E zf82)x;ooyueq^y_Q9h5~gMm&HrZq?PO;A=tSndb=TT~N&t+j~z@oLYy@>?f1{U=nI zcj+IdSar5MPj9W|heCLnw){|BkzGSdtZBaQkl&hC`kIk?10Eh*4BFK4?iK|W@Qv(4 z@V35|H~Ba-w8~WHhq3mZeATVM3mTqpQMSGy#aai2p#?qY1wP-hI&ngutBTDG?;+W- z!Yqc&;aF50F(J_W#Id&5L1v6JR8rnW*4jAY z%IcO{YlDd^?zuWR!PeA>8$7;>TB`u?F)?Oa$Is+k*y*cdZ?BHZkK5S=tfTVdifRg> zdP9o-A6?f17gh27zZZA!!Y%?TOA5;_CM6{*2&tu|DDn_e5(s=HzR^%9F;OY8FfB~Y zSC*QVm{z7#miQ>mM`=FrEh;K1zF+v9yE}L3f9}03qQB1{KKIU-VcK2-Nf$%fMG5f-Ly&}R)- z4@VR#ku`h*oq*Gs#b7#ER>&l+t?R*q@@jqcW2x|IxW~~mAA_0-WV}`^I@eK37q6x>N`1#`MHrTC8&&SD(ehenm%Trkx zxQ2J4+G^CFbU>9@53jAfw0bA1HKhX}Dn%mYl|@f4^^39UyH~yMl(QOF+P%~-#%k}! zjJ3B`A0kakwR)=+QdV^D4ew1np3V%%kI5Q5J~z9*r;nNuNi9^&KJ~Jo1Npk_`luPb ztG<)fn3`H?^5a$*_ZUpB)pDdw4ONwu#yxG=YWqXs-BQ$4l)a4Xv8n0=N!5x={7ETw zs#;!U<@Mh1RAuOnS6-?0i#)!*CspgI@tTwNxEK>2gMA-^6CZ>9)S66E-~H-3dQu$} z)k6&$JY02ptDH&&vmb*|imI2o2}W?rNnWiRf~0b zRn;^#{aQYx!L`Ly3ZWuu*AT9+RGfMsm#tM~?D+cSeJXZsocal=u(tS7njlRTE+?q( zG_^@d#g4{bnk&P;YS2XWt!&TIX1IDFp&jWEl~l%5WSBy?$x%cKS|@5gZM_uPJ*GF& zJ~cpP8FY}OMboyoBDKw~$c_p-p|d7M93dx$g!r*T6MH6(&KljTXRpy?M@Ojxb+G!5 zSKp+{p-e9Iovpr8)%SSyJzQCpMb%Qj!L{TsRt*}dz7y2<+v>ZwHfXaoCsu8Py7OK- z+fn89@Y+4QaJ7u>!WDK%d*ccRBS+)F?P?`^ZFf(V2q;Y9x#Xx-Y}Zb$e!F&BD($pX zBGfi(7oqS$(r8yWJ~S z36BX=`D;v=k}mnw4VRcOl@rH=seCymOy$HeVJcsa2~&A?OqjZD6BDM;4Ej#p>4^zb zIe(1W+l15v$S_T23s*UKOt_X`xRzhImS4D*U$~ZExRyh>mV-)_XirVcAzaHrJ#Gq* zQBNPp(b80fGV*C@szMq0v^3SeAfHwTwJ*r0<)HQj`LrC=z963_1gm{PKCKRFUxde~ zeL;>^hX^gd2(1ngT7D5)n?-2(soV1OftFu{)@Bh}ei2%YBDDM>v^I;-@{82kOx-9B zk5RXc$7ovC``*iJ!BxCmV}u)e6@*bbr=F zrJ|iH#c2D;G1{(jOm{7n?pkrRZRr?olR73^Yl&#BWSYiKjHa;@qaFUms7J80F4l?^ zttA$%B^Ip}Nn4-9XsZ=k+o@EshgLsrT@$0Na$>Y~O^mk6iRq!G*+WZHTR_FACv>#W zqg7K|R>x?|>KJWV9iy^HQdQC#OC|8+(^9D=@amyAA(d3x(IJoOL@FPUT85G>Im!og zd>K=_q-fJC>do3^g#y-!{0dkr_A6j5M^wOCuBd>NP&h4V)kU5Pckiac<49jxTVHpt zliG&XL9unv$T}#wo>WVEXLS;8NuXo#b?V||EaAe9s{3N(V@-2X@2(4X z0Tb&E1s=zH`!P8FiDHaag`&sH89MfTU6qMwWk4dJx{y`(denui3MD;0YM}ipSFZ7z zQaQM`zrbpD6`FDjL`JqN4j#;z898bKQf z*+VlQ8&>qo)RxMwg42P7x*l@*wFSG&r!CxFzPf`z7ou({;6g+_9tVRTgYi#hLCRyw z3e5G5df4ic&Rs}#fAR^>(=n(bPotGdtJ!x|J$6To%?iped&3st+jrBD!Urf9@O9o|~; z9)nukx&mnN>%3a1RuuIctrRNg%1!&k$)b>=ix>TS?U23YOn%bT{)O55{`W}zl zK`rO-r~LK8)xy^cSN-+EALsNqjXGStcv|j{L44O`c|4m-~Jb=&_UPN|6_Qj zP{jW?kj#tg&A|32ZX`%;ym9uszTo7ELl8v{@H z>cj;ti#lOJ^D6wn72twuMRW~aE2L|l=zh_YqFmC|U>6WYCqi^uOy}5&Kr#3UUk_I# z<&;}3U5_Wihd<$qcSRcI0^*+tAN7Q+nMGch|?U6gdA&e4t$ z6!RtxQgABqRZuF>O*u)|P<2rE+MRi|M06IXZquut=(?0h54JW<1*ayUpj05bE+th( zR>RdMGpyE)eoVf#kDv0_Zjq`@UAs-H4S?G5rts@pyjrq)3`tF|9ye0`8WYumR4Suk zYfGb!J+j?VYpQx;>gqS54vN+CCbdmvw?3{8pIHYfI5lAfr2=uT>6GaL;?(rDSdT$6 z-KQFnj8E?b*TBNqylvqt$=lS&6`;FCH-7TZJ#GT)#{`i z=d!|6Q+%D0)<({lI!M8(feK0mdewy~tVxTn;MBl6Zq=(US2E14&A-=E`Hg+b-&^e} zwNXf|jcm76P{X>~QwwnUYR|aTu~K``rNXs%Eh()*R5(d}Yf76*b*0a#gZk7#%5P?9 zbyIL^-4v7x)M2!g>+qVlPhEXgog(#%Z#nP{B;aRO`(qAs6OpnPYZZF z7gL`~Vf<5m?JKoGwBPAa!P=#itNUx0QZDbCYVz-??>Al5dCvu;5uo+xggQvUsU=fT zDv(|mmRAR*yE35TcTJ&C5p%S(6gfwO`aQ0}q{pCgmZ&DI93`qizq(ePR0n0&LAkCh z$ZT`$NLqd>C$)+Qp{PJBzIJV1idRe;f>PsyMvV&^97OvGWPnOW$U)g7g5DiBW?Y-@ z**WwfeG}9!EWBe7{TxY9-6v#?tmsY!(aA4~A>-=swLe0v`XB!$u`9S&Hrc>s3G}1N z0zA~;32s4`%e1542#!G?yoJ$t4^!|7=3_Bd()DP+V+*!pHxA$g&fpfDf>H1nLWFk0 zt3pruMc|>rSYe`2D9jcX3d`xYfJ=l@VY{$bI7+_)d|9|5+!Y-38^G@L>%VQ?V%_@F z@BL19Tk7_!+a9+wZq*HR4VpD*)!?-TuQwRd;JpT)Hdx$XO@luh9BOc}!9$%v*G$(+ z_p0u7-CMdby7zUT>6Yq#(*2>^t2?c`s(Yx{>6_@E)raf5>J#aAcr*3y=|56`gZEqg zI(?~rr+&Zwr2dlru3i>Jv9TB^wiMfmuZZ2m*Tr=D?cK5B4`P+UO24W*+wix+=^o*p z>AuwckcZx*gU2Y3MIO67Bx5sUoNZD;^r7h|Q@N*`XQ*eYXTIlh&)uHY z4b2T-ZkR#8GW!Gly6ht_i&r%0zoJ@oeV?%>_md!qMZ??1fHdP_b{ecJn^ z(eJ>1>GQkKai52cd>chJN@+B%(cDHq)33VTqTh0Tv2k4E5seEQf7^IV<5P{LCQX`z zHF>?s=q80tzG?CY{RZnpUmxFAzA?Uoee-=6`j+_q>wD2xHv5`en`6v_%;U|o%-@;+ zFdsAD^3(YR__gzk_sj5`;5W-}rQa66!+ux&ob=16FVHWdzVXb6XC^;0=b4qyY|Ke>}^E0fc>gB9WgFGq9;=?bm7*lbt@P}Dif-y*uIa*uIJ$@?M~=D1 zm*+TqsVVgb`D&-HGgvh7ELLC%h6VIPe8ECFa z{FSN3Vh9ZhoD?|3 z*g_k>#GjUIrWMjSzdX~vM^GcQ|uMaS>(jsS5$9y|I zytGIzc3#y_7EP=AcUjdbfX7k1ARaQvHkmEq)cmZw$Y!&BdOllZsl1v6Q(ZOO3I!(x z%Z6lXH`Y~TbChUvM7dP9un?ok>1&YF*?itv>dYpwknc)a8!I*I5|M4GpC*?~swfl7YI5xz{@@DS}G)O*t7#qOX^L!c>p4`2Qb+XB>V-KXJ zc3-;>e<1nFS8dJ^laxy%Z>L-+&)_roZh4MP)=^p^A`fB3dY&svnTM33hKMXzLoi=L zbl4hu|Nf4$bLW!FTC_-u?O^pXclay*!Ts&~&sC-zXz^@nTzeX};v9?qCZjP|@P#OC zk#?JyELGYV3{oYRm@Kchn(psCa`AM+=@u;#I(3TJ+x@=HbY#cYy?ZyObx-KuKOrG` z^IoedWnIR>10}z2-!WoCT+GNp$yQT`9rdzLrtD2@3%4*Ip2dx=-*_Q`inD6f^y$lN zY=Gg5k!eN!15BdSk(yyQn<|Wfn(QJ9SJB>Jc+4UJr@$$r}r#>KpotL`y2E{WQ;wG0Vmh7HiY4-G0diBm zobNUj@yiwuue#Z6mMf$xnf~crK_tdwm_;AzNN3$B*_k!LHRX9&-8Zm2UMl4WNLeOc%GOJ(rPYjF6L;sqJUEuQGaqVFNpyxdHZKokH${2A{i|;R z&8(wH(`t^Mucj7q&#;JwZhYoSQndEz_a3@+?V^u1bCSxUv|>SWvfZg;w+AQ>YKX;>ZDLA zzC~9>xe;~FRjISRK+02lE5{`12uL83l*bBIy&q^Is$pdVhTdmkrU2HJ(Jy1OVK$Rl z(uu2n)XSYklSr&X;<8*x*lgY~n>FM|9mRZ2k+fVP@WYCv5R0x*U$*L>ty=?DEt~$) zJliUkrT?*i|Ji8)G{u{?;xjwhyrc(?C|*@0&v8D`^DO%VUgCT}Q$?ObU{#UypeD*0 zTCad6AMnni3<4{Pq!G>xd7*O= zyICX!*nRaZ%IV9B?Y^vs=*4DADN>L@iX$Gjgq5>$Vqr_-U3Z0|(#Rqv$1`cJcq$}ywa6>jQKFYSnM|p6W@}iN5N71D zJFO-jCH9^&pntmn?$PHS^R@k8V2yV@VD8nw$0W_RvM71YN$JE57b}i^x#HbPUB%}V$z3h>{0T*JoJB08b|=@Kub&{Ar1gv_Ez4w` zZA9;(r?Msy@q(NfASd!AcbG3vv=QT_kUW}a>#6b92M}}evClL+bv#FE%JapMgLrT! zo)y50`2d!}=Ga)Sff)WUg6Gp132w=gR#3&ByUd3N$euKrE9FcZ%lD(^451jstn@VB z&2z1>2Atqt=7CF=$u_Knzm7)KXUA)r!h#IeZTcUJC_}Ku3f6)NR@|UtW z0X&CovGN>|W`5`$8f{7ba@Ur!4=<2ItzJ@vf%sH33*ou_(~72ywDJLl*~?bVUKPN6 zZ}jJpHo3w;>}VKIV(aGynsoAyoAe84M0v~&4WRbvPxHESijBQELVs>M3qHU`1>9uD zX;W!HNvr$osZ)sTKd|U>&C*R?z^ddVIfWPUD*2|BryJyIHbd4?QIlA{q?4+NP3VgK zSheVU(Y`>cu@6ozKu#fkw}l!+N|!REbUA|rs4zK=;E_@eSKv(f9XV5ahk7SW8Y$<x{ATz9G3 z%;(!X@*HPJl7~n%(-+fFb(UBh7CjGhq|3f6hX~YsgO|By?|xma{JGfcymbJ7jXx8_ zTiaOtNBVzv{dvO5TCEOcy#m;)tl1sbhG>i{_O-g$p%nW={oY-FsIgnuk1hXbaZF`9 zizJg{CEMftUe9M)AFMUvqf5GIav%MZBl{vzU_8e{7e4w!^lwhBhgc$IB@O zKKV`?*8cv{U-oUXdRdG<7QOr1X6c}mD`iPXrE)n}%8?Js<#HBvSGjyt%969BavQPd zgXWql17E^YNKnb!uw&l5byk*Wm_A|T^a%mnx6?l?(&nfl-cx1dDN~ZCH|2$=4Xlco zcc!%MN82iChMw36$$G0PDTSF;v(AnJg`+0QDbgC|9cX2p{g_W6jb2FZQobV2RI}aL zX2%AJac?<|$ciTmmG;TIStv;do;2wi)-;#DrFa=;*5>N5LR+41ttnuI24aVqM7@)UiWTe& zBpU0^Eqo@QZ*>lH(n2E6qR*f~$#Yo{P1Z$3!-6Pou9ZYAmP-jHQP0dLmYzgJjrt*n z$VUm$_|+sSE$92J*#@GNKEyAU^IxB1%UQ})>I0JgN7h8^$H~>PM3?4F=*>!vG}7$d zEX0V`Q?O`ax~(LVd$PO$BH6T3n{S(LXvq`j@yu*1Uq6!Xj^)+vRJ#v`U(br8H0q6n;aZ>^>gXiI`J5?@V$>hLsnJBy=yKPs=48Maq(bl(PHU z^LVJp^W+kqE0ySZq%)8CO7lr9mFJfgQLL$Ylhjlh7krH$$=1?99{ogx z*N8QH^j`j~iq9t!ig}=y*UxKaE9G+4lKU zGx}0P=J7<5=#rSE6ln%eXBpHRh15VMuHwc0v! zN>RZS|7Zh`=+>U=xmVITrnh?4MAGN9F0JV-+I=ZU*L#*Okx_%>A})fJxi0XvenX6_O?hgmR6ff?DN?o=X{#h z&51piaesa|fFI=tm_J)-Bmyk3H`y50iq=6%%)&}&Swb~hBp2AY&LC&<0$O6nS*fjP zQN6N%%97*&>Z10%1c;nF5j_M;a9|A;x%_mh(sbyBK60%aB8*L@AO6{2Yk_c|Kdi zubv}zl`)+rV6b%1pSc^PgS=b{kt?mIY0+LE|*E#%2l{(DKC~f)4(R~bft`j2#-tXqHzC&6D-ck@(nC{?+Kcwy1iX^wAD+Y zaM2{65rv!m1yQ&R!$%WF7AX|2WcKvwKU&!^!@O~W=21t@A%Yaf z*Vs(5o`1m?%Fm=)+iV8|N`Q-OSc2D+ZFBh>#lDGa#`iu|c zv^IK+52DbqBD>4CD4~pPBUxaofe+wOG!SU)Rg(-=P17im9d%ZV{R8dQtlZ!w%1fMK zv=*QaQpIpjzJ{di5S2CNnnb>YnkbRy+K49SpD-}rWi)qbt>R0A*hHiDJ8IGt_IUvD z6d$59LF;TJ)ZM04s%ehJhy`!HX-p%QqL3GD z&1WVeNNYUzWf%7{os~Gck3OOc#Yp6x{Y~bwvXPyrr)W2U7uxu9A{)&@uCT_;ObfWB z`m^A!O;%&s$On zl|f498EiMLcM^C|0{3WX{eZPLO|tu%nfuStt>)T3; zw`$$&6#+B`5_porHfZgq2u?PZL2_UjRV0`NQL|9*DgEc6^q&S&|Cyz$lFq<}9idjC z+0>oJ&oCRUL`rJ0Av6@5cBiruR-R*UeCCj78^&(2e_A9PXqtH0Lu%$b=^<_|72C^c z;au!2H_@KA6e8U$S|!t)DlhrS4%+CUEo)+)%8s{V2~iL>lLUoIewE6bL1Oq8lCN^v zQL7j2T60f%kmsmZ~=6Mr?8sv zZOQ!}I=YP#_=BFU^n6CRwd97AyN=?vqiZvNrf(z3zn<_fk^39@+ml;L;T_;6Y$Ep+ z@^2xRuKX1Kr0`i3w;MhG(zBm%e~~+f-0kFcCwB+Mi6-}Na(j@w2kvy%1so#yFuAeh z9-*)}a*tEG@#L0MoX;t&Cq2i=f1c`_K<-uYCz5-O;=NArT!L>~bdei6A|qVv26Fit6 zx|$Y4=owD7lDx-IVq>lDmW4&gAZ-xUZ4>H@O4I-A#D9Cf02axy{K{`cFsC zNP2we8A#7^dS0b4y4Ds{cQ?Ai71`t}{Y>LPx$>FLDxq9qk6dyOk{d;jJHgby$fTzM zJ)`KEKo4Cji}Ca{q;RG0sU6*pkW1GeyB#GrfL!WtSm>c^VCggz$fGBa9vg)z6%_Q>N`4V z1(Yj`tH}L^o+5f?Qyr;Y1*PA{(L>kcD%a4uU81ovl-!#XM&r)y78(dNhTQJb{GsvU zcAw^nQolzOu8i}A^c2(cJ^5pycVkrc8-Eg>K~L;yIxQxnE&|K>ea` zOsC0Tky}P(SW9XANaa{Zex)ydrsp?$exb09p3MaBB=;{0+eNN29(EIs z#)DqzKV=*!X_OJ}IJrm2Rr-dm_N9AmfwSaZptwhArfwrY^^@3wM*QF8wx<#D58PdBIgi=lK?U(iLll)f^hFG6SuVGx9D2*q%F4sLDW)(&)Gx!c#u zIHsZ3ARG<)puuo7n1luk(O@|mJb*3)x(Mjvp(}uH33OYaI||($=)<9Z8Tua34}-oC z`i0OhhyG9KcR_yP4 zbA+iSOmD*UEll6TbP=9D@QjD&Jb12v=X!YVh36G`GG!_?^gzQ_X!sf$rla9dG&~J2 z1H6jhH6LE3@VW@^Ht>#x_e6Nlh4(M;-VdKB_$0t*5PTeH)DVp#(Wn<16`)ZO8vTpL zP0%<1jXR)m4>azN#&4r>5gJ#bi4IN7X!0VOgrmtTXwm~s2BOJWG?{`XGtp!&nyg2Y zZD_I|zE=1)hi?*m^Wpn3eAmIZ3}!vd-Z1xrIS1zPFt31lEzDbC-VO6PnD5iAqwsqU zei86{4Ss##mj%D^@OvMAMesWWzY}<-J)TL%Gwn#Q2%>u5Rz($un$HA5g+d$Zk z!gdO_Dg?zMXb6HPAZQhW?jeYyc{4O`kLCl>dK`k>`Vw9G-vod`)q$OweIgAfNo{=*9fyx@Zua`3`ryl@ULT*Zqfyto`MR^r8L zXyuDm*=V&7p*n{T*$0qHP)4R-!FKSZjp6hOl^qjX>B~gv~+N288{M zup0=gL3lHS4@P(%!oNcJ3WOg+_yx3Uf_BkpHw*2~pxsqO5KA3~h;I;a1`!;Q%MtlI zB99>QEF!PqrLXbQS+sA3_6yMd8alj=4&R|;cXV8dj(hO(M!XV(SKddbF6gugog1U` zLcID6UR{LO67bqz=t3N!H@bE~*Z0tM52Ab#)fQ2|BkBUWwL-Vo&@CC=GSDp>-NvEY z1aw=A?jh(t2;GOF`zUlDkM7eDtw(f2M4J(9MRZF^t#NR;t zL&Q7LQ;(hv(bJ5cEzvU)J-eZ25_-Oco}VT3=)!% z&<_b&NSK0zPm!V;Gb zQbUj$fz&QY?TOSBq>e!91f+h5)GbJTgf~ri^I5$48s5xCT2rJgN7@faTaUCqk+vIY z2a#5ev`a|4gER-yMWlNp-5=@CBRvA?u}JTY^dU%p7wHp`{vpyoNBS2?UxxJ6NdFn> z8<4&q>E%eji1b_N>y5rW(Dxnmoru0u(f3pIU4y=VqVGTGTZXhSzB2m$hkgS3HAcS{=og88JmwTaRGxx3?7WZGckBR2LFY@2Ql~}24BSxHw<|fLndO#A`JNt zLyZ`kh@pcq^j!>HjA6wX-UGvb#qd2C@ghcifDzj?e znV!h>LuPYiMj$gCnUj%u9GSN<$_t|`7!`$4BQWYqj9QOTk1(nRqg!HhJB;p%(Y-Lb z2&3m?^sjikA>M9+w?Dz#w~^HnS>2Ge9$6=mRgE#tFlIQ$yn``cV9d7|`x?fM#n?QI z{SIRfW9$QDn~?oFvfo5@Uu2I(_GDzwMfNwyK7nipa$=D4E^>ZA&OYQg@s1wvJjA=v zc=sB{EyTETjFXYu9J#L{w?A^DW@5$;%(#phc6?&OCt>)c6F%vVPX^*sZ+!YaKHZ8>kKofA_>`l_4@DhOl#im1 zQS=3hR-vdAMY~XR6h(J1(;YLv!pwX4EDfIx!e^uL*{_)O3}yvk)^nIO7PE3O>jTXC z8?&l0yA5W)iP;61{VQf~!0bOU`#k38F(&|XGB9T?=9J;{N%;ITe7*#qufgZP;q$Zj z{5IzLU~V(aeHL?jVD6ikn~k|2VeVqg-G;eGG4~4Q+A(hk=DmY?d6>5h^M1#?gP12{ zelq5Ni23E1e+>(oV!;bo5Qzm}Vqp_3v|`~)SU4C9Ct~4DES!gh%dl`A7XFQehp?~$ zU$np%&tXwREczUa_F&NkeAyCT{)Vp_;;UeM^%1^WiLb6>u{Rc*u{afrM`Q6tEa`+L z`B+kfC0}C6DlA!tC0nti3`;IyX#*^M1xp8D>8Dt_9!t+*>1`~1h_7wig=Hoz3&XPBST+&MreWEaSXP2%+p+v*EboEkNm$+=%k!~(0hX8H8-INBI=-2J zZ$82|oAAwPd~*-qy5rl=u%a1Obis-=tQdh6Iao0PD?Y%A=~(d%R-8hy2Z|e`_&pRa zK=HRIzJ!%ISa}>PE3xtlzUzzc_G8sDtbQA-XJPfvSiJ?Scj9|*d>@4GhvEBo@ck5g ze+NJK;DlbZ#}9|_V{`nt5I^q4k0-IF4c5GcH9z4eBYql$pEB{&1pM?Je)yEWeu-1mPt+2K|)^^3(zF0dKYk$DnKd|-y)}F%J3s^^sHE*ozgmooY zcLXK9Q8FGSvr+OTO7`Gq3w~~npMSwGUijrD{4xl?l;W4a@aywf|18$;#`;REuLh}> z{3hZzFZ`B)-xlMymH2HFe)q@kq4@n<{C*!Bg0UeM8&a|1Lu@EQ>0p#*p>zgH7ozkB zl$N4&2TChYT8)jt*w`8yJ7QxzHfCaD0XELS#)a6p4jcc%#(%N#7&czRrVwm;4V%Vb z(+O<4fX%7cyd0ZvV~Z!Y48WFg*iwuwN3rDw{+NP4-^QQ6VrvU*ZG){HvGoUR{S8~U zW9va|t-`i}*tQJY&fzZu{_2Ona`4wg{51=IEyQ0d@z+{xZ;tKJ*!~8#_rvz3*uDze z|G*A2c8tM}JnVQMJEmjDci6EGJ2qm+pV(={&gZeS8+OKFXK(Brh@Dy3nU9^HV&@U; zJc*r`vGW0THNY-!?0Or!W@A?wc0I)3Z{zQO@lR9y(;WX4;Gg;UXD9wSiroTsKZD)l zu={=N-hkbIVfQ8MzJ)#Av1cUqEW@7r_%{y!j=;au@b7N?yBB+#V{bV2&c4%>_e2TL)jlF+l#W3D7%8Pdnj|_pa%{%$H533?16*n zI5-jq-^0OaI5-~%SK#1pIQS0^p2Wf1IMfM;hU3sg9GZzk%W-He4sF4qe{tw64&B3H z5r>=MaBCcn!r?b?cmxhl#Nk;u{4EauiNjZMqydij;z(N@>53!$aO7su96yEQw{XG@C(JkziWA*%qAyP5;KWp%n2Qt3aN>8I_y;GB9IIH5vQl(^bDMyjnfNpdO1$7#OWV!`Zt{3gwwll`Y29c z!D)sHBPyDr;ssQ+LB-3ch(bkgR18AJcvMV7#R62UM8z+t*p7-aRGdY{EmSyhrXkJ* z;7l0KyoNKqaApY3<2jeInEa2>}H%j zgtNDBPQbY)IA_DT);QM%=hAU*B+gC7xsP#fAZIg0!Ul?_nY2$fb; zhM_VFm3>e-5|xut`57vgqw*XoAK<(n&cBHBaX8-(=f~oFA_yZS?;=)y2;JDZr7hk}|F1VPA zi|^v%Y+U>n7k|aYow#@m7q8%=16A&*dInV?sCpSyJyF#kRXM2o2vuL8>IYP9LDha# zT||`wmppK(87{TLrPpvN373ZA(j;8^9GAYur4n5F6PNbm(pg-(gUfEX?2F4*Tz&zU z+v9RHF28}xgK+s>T%Lx@U*qy`xV#USt8iJy6*I21#FdwEr5COY#gz%TQiLl@apfmm z`4d+T;7TQ~+{0B7SN(A{1Xo|d)dXA}f~(_kbsDZN#MM=}x(QeJy>W9W zZoY?`vv6}2ZkFQazqol8H}B(?0kNA(?4|A)Ii zxEqAKVYu5JcT;e81n$nn-6goY26s2%?rz+zz}-8z%W! zYv47I{ULXN+zav$$P*!d26-jqO_0yQ2{;4c>U&5Dy z@S`AX6@_K+aH446`_GBGzbwIydpG6 z6&g$x8k7nRwh0aX78=|XbUuQvhoGAz=n4eg3_&+f(ETXr_6xc@g5F2acN6rJ1^w58 zeygCb5cIMj`U_%5LF_4r0|l{A5SI$#dO_SHi01{72?lq;U=<8uf+0>YyeSxl35ItC zLxEseAQ*lW41WoRlY-&C;BFAypB3EO3+{1(`&)whJA(Tsg8Ndzy+m-|EV%C$+{*>` z>w^0O!J~oTVG=x^5j=Ve9#aI5xq`STIHj z#y)~ETQKGe#@T}LYr*)dU_2$5f&|kmf+<-r4G~P)f~i0-Ef7rK3#L-Rv_~+V6-;*p z(|>}eS@3*b@C*|?Ulu&01kZTEGga^$A$aBso}UYziv`ag1kc|D&s~D&F~Re)(9lC@ zXcii_6dHCE8pa3>`wI<63JoU-4W|nY7YhwbgogWth7Q5YDtJW*UP*%2aKYq{3EqW*_iVv?so?#a;C)c=z9e|d zf=?5{CsgoxRq#m>dd~OLove3v!XcQ|A3zLE!XFLs{K zFLD+thyUS4T;M4zzewt6&y(&KEj7yPEc(rQ{*WyobE>O+scdn^>R%_rAwTw+l)&1` z33}%eo@4$>92P@b&xRaU=_fs~h+9^W#e&5i%@!54AagHMki}R?Y9bw|xQfOe>sSla zSKV_g(zF)kTvFkaEM#3mnr+MLX@9x2!fbK@Tcjv5THI4ewfC|9UpeWlM)RaEY+oB# z_f0IE)GNOBXWK}Ba)#X1>a3~`RFwn0)*Ih3wlzL$%r@p5Uon1Rw7BP645Uy``i=7q zn!O@%oGh%rKt$1SkoHy|m<~S8dWm zi@uBr-Oh0R4?Lt9X;TbjpYtHrhrh{m?&sKG-t|aFK1jc^ecMH?C|$V?DG}`>UCC~? zmVAajS=Dq`?PnzSfA@Se>2Iri!{X?vCp8Sqi)=jm+h5UgB2~lbMla@0P3#eD(XH|O zUt_E-|F51{Fll*+_NJupVa^OB`$DBX;~c~MMh4a-@|~n(w6i8yl#V(oNFCdrqv?;v zu?mXTFvOvwXf$L*i+duK<4dE(9=EJE8H;g|#a_C}SY&)5&}*$xv9uw5_(G|I#>pYl zH@9D4InJdb%dscwrFfPjHxOC2Jx))$lQ}#={F9nHdPgkJ(mSh_L76G0@s9e77QL_8 z9w+@`;MvYNJwH(sVzwu;xd#4@Gf~mEFJvix7Tr-QjD@tBa~uWE#2R;U-JNkYWLIbr z$G2MDEv|zx*ms50HIk1X6xWNNt*|J8#(7 zobiEV)AbYUz`iHL2DX7J{H{2E>zwU7mF_HXrOAdHSyoV>G6qw)S4ZAD*~Vf>5ogRT zzJTn^q#QD=IV#Px(Ko@d#v#TC<9M1+)ohF3AfEK0v14Eal@QYcsXB&gX$HY&K2we+ zgTi5~v&B)sW>N&w=Z_?Fj7TY339Bg=WxLv;I=T zsx5{sWPrzmY3NJ~RGO2bg^(#kp`s9{^ngKPVWiY#F$`0}Ba9>2awCy6DTxB(skro^ zy_DtDlqd#e^oeIzr5Z{)e7Ptmv0|Q2y17lscqUg$w>ms2Z%+eRi3F1#)N=X{BQ>Gj zR*OE*RVaJDk^tEyRk5H9Bk4=!v^Ns`kHup|t&!w@#YmFhmUp~nq;}9z@OnELx~?|! zo%Wl2rt>D*93--e8Zzc}6tbP7mt&6Imx^0pWL>$tLP$xEY>p$53C2g%c%>>NbtcX1 zL|&++AX|8%WKkNO3`#Fjn;o1a-$8HR-fN^7O^4V&*X_lrdrlgaKQk#}V7Jo6*cT8wViDZ-iK+@e?rDmJTL-x_~4 z(#!stD0wnd5sM=$B$M8unCta5@T8<79>z5X>?wCO{d zipvZtVzQCcN$tD!yesJ)Q>(cL5z+T!25OLMqEQx)okZSsmPeh<)V!p4S+m<>-=d#j z5osVQ)3Z=??6Zi8`ehdTdQmE7VJqlMR~qjc2dktzjBpwD)fq-R&G+EeM9fu;MW0#A z_M|W>Lmgg>I$g(c} zl8z?K8adbM?5ffYd!A_blx~`-7eZJ(PuJ(Z(c^>mWJ_k3q&Sgm&2*&wKj-<0;e)%W zbCc*1nJLqB9mYz@EU7j%n{y{IqM4MKc-4=$j|EEjp_P9=YUs?k~^t`ua{TzJumS0h-g@B zd@Pxad$G30PmK$W%$pcSTO;cqOEqZA+^wt$SyPcdE7``ACcAGke^FoDx$UB71GGw$ zB6NsM1|Z#~cS)wue=EwLIF^{H*eCZ*ow(h`H#nE*`3=#blY-2=&#R=P`2HX(n`UpU z-_~_Wn+X3Jol|FK3q`)r*+Y>KXrRsUV?D`~xhLt2uP@>iQZm^K^(9*h-iP$cpJi|A z*^kw zTFr%Wj?Lmweg;4vY+&=x(PZDk67R?MzG#(0<@xNMkyPSCsErr#rY+a~*v00x$Jmml zwpeWuRjO;@s6Z$AYY^nquxDgM~<9&}8EgtXSAsSWXv_v?p~x zlBT@Hu-o2Lp(Z|33CS5`pmt6#+lV~9PxH@Srf0i|eY`DhBEr!1$ZI@FUvpm}Ff~!4 z99Hv@p440oOUx`#)E_AUm2hO52mDci6a{AY%?wxFu_5j0_y85Vj=h z7==Id6XjXW4)L=5kDx@(WRT*1FU4}N<#UIMv;DMf%uY{ZzJQQ z0aB1n>S&-Tl0yBk)5?gLmr~=2k@Q;)eyqSTLu_Mw*+_n=@B`x!i#@oLu@>PVd)!Ec zRdRO=tEfejfT(_FA0o26-&hx;9Q>NT%AkH?3}s2g63p!aR~s3L1(aq68&3qv-xv{S zpAkx8=}xjmROFY(TK8WCk|KJoI({hGa#B=jjU$fbhzX?hul(qSxZd88hT;D)_C9b? zm1+Ap)tqz2k&JB_!v7H7dLEm)6!kpmAaoZ_nGC5opU}vn)KqmAt{6b#WKV9#*UUJn!g^!}nEzs{?Noli?vK%wwq!pr* zp)MC$mCB0?=l|+P?>jDjA42_UTFhQQZw|&$K|MVwhLjbb9$NFcceQWPk2h?(+b?DZ zw(PlU$8EpPoe~`6ewl`zBTK(_@A}2hb{bY%s9Cw}-?z~|yGjU_PjcSZ}n6mNkv3vfOF8L#pX&#+N)4c=7OA;`;LL+UZU zdn#YT>HbHD*8KJFp0f=v!651k~z>QM38q^49J9_JQmt5|9 z-*u%c#Rbb%c-qolQ8m}6Fr`4ktyz+A;bb&U>+)oy4 z%RR1tyN=t&rCRMIrF_ybX#jWv;5`C!c4L|37KJ3MH=#=eS zX85Q^s+KZQ_&<*NkKbKUqA*yg3dx}fUY`$zXr;Yo>~g(t5P(! zxB{ie_^TKo%McFq@L9f?vkw8+%jWKR%y+fRih?6rEO`Nf6?pgX3gAb^`yTVX?hCfb z9T{>5Msl9L&x(@5L~TWZ-6S(v6b`!ZK}Y7gzQ9Ii9|n6mSN_ap7Si3iGp*5OeH5G+ z>ssPE;abgKVSlSxFs`Ri!_@gRS0Ga4$&*p`9d`80!y;|2OXLLi(?lOGUGcWdgk3~A zsMSNEoGkb33|H&11J!!ymP2TXB{FeRUU2_Euc1J%~FD!j-PUbOvA)$T3lPWw}#xv*xa3rxjlgzH4zDkp2DD1h4*Qlovt7% zEqiEZ?D!v2VF*(v&(bRND}CRc4(g%r z8#3|?-5CXwQVRT(@M-_cm2HD3G!{s+k8r{z3iAt9@!$%TDiSbYqq)s%HS?I2ZH)z; zBv5nN1k(&ZP}LcjOx04#1z>e=mk>e&jfyCg0apMLY#lasa{LBPFY@HC<&0&lqr^GO zu4>)lwIaBg21O%O#^o+bfH8eJ&{;W;0vJhs&>)T~bH6$0=D}Smz7GSEz1tTo4C7zH z7|fm+OpQr_p$$7|I&=j343kx;w9^$B-LM+_HgUXkT4fFS%JCZVoO3ng(|h2%iq_S5 z_wqCir-Z{m6 zAe*?xzxIz^>)yqgVB3T2P{!QUdKB#~fQX2n%V0Ao=VH817NWX@yF45<6Z)|R21Vq) zow>$zz(o1Ol#)+*()_N#Swnu2Vy#?mf0i#9JyPf56UrlJ_M9$h1&pGi(wdq#kQY^ zFn5#D1;q**-86|+deDm@nue#VfRN6>E3VASe4=u`-@F2s;lrUa_c^}2gW!Xica|?t zcWyD^Lqj5W(P6akaQHSMG_VUuOgt(|ucx?=(c{MSZz%3Ix>Kj?#7GK=9O_UKzZ%o7mdCsxSE#leAackDbH?jD z<5Lt8=gpbB1TTH&UP|)^ARjfTL(6^HwXeOCl70ExAzRvqWfgVHi9rPUX!E8STb)3L*oQEe{Lbw@wygVS{h`+z_a zZ$#l*7+t_@osIZ*NW!<~=#wt9kt^*lI1$VYM|4NiCa^ES)&mU{NwWlBk3iQ^Lp@lk zAUvw;`IydSE98d*Xkj%jtBeXAztP2Lf2$EI zOvGkNU(!cqF&kH8ZJOhS+(-gCR5QyTOw>)M0`ro2aeW_6fgCRQ zLXN{uU9E=aYdKCze;1TSHf95#_tMBR3pe02`lu637{aooW3;7M|AZS-coNJ*8>gK7rL@i5f%EkqwayOlS4GeIK(%0 zT$SZnT(o%JyrMll61zd)H=ysQ`KJ581XQVpaI+5Z9)(}apgy4=tgKdXr~vN@FGw8? zRO*f`ZaxOkwNmzPQg94DDEKBr)j*!B>6psdLBPc)G`ilF2nfs!xl4lm%d8`i!OcK) zr*K9P^mYQMN266k?PeM1AJkDbR2uAe?+`~6GhT;%m#HGQQFxjLUlMsv0F|Rib(s7N z&=PFKPd+J;Vo|$QUGaMbfeJ;lHk%_`>=s4^V(B3l7&k4@&5epo5dQ$mCkRqa*Oj)( z)TIVb>5gi1Fc8CC^}+s7q{0z_NCX%&s1bug9TlyRer`U+=>bG}b&-T;ivs$82>Rj> zU7(5QLs7IHlOeD{vj{usZCr@^|~q67yTIIR>*q^~xFc02Sf`Od-hDA@~9~H{OgK$TW z8UvRe9IR@|a|xfdnn(RhAN%q%hDOmKt5d_5BA{4I$g!2QHmAI&-CdzPja|$5qLq9}4aORR z;$4#idD?CmEc3R}9bQ0eF{#|^4@P6SMr)#g0h3x8{5U5*csI{5%szCvNJ3MjI?S7F zMoBi1CQ7%`5w!ADRlt4_ADLy4d+>m(MVF*CYY&uauhUez;w8Ff{0{y8U=%Jg0Z@V* zLAazHk{sfWTYcPqs|?s9@dt7B@!x6y)z@j;%mRhC$nF|HO!j;F20Ieg1l-=9-J`(< z)x=N+28G!@A%=eBlQXcj2F8CWRfOlfg}plGS>W}=K@*QC#=va7((G1sam-!lQ4uxWn%W?LKDTu-4;fiVY6%l4iM_)eSLJpCg zBM>cqpjw~4MgND-h$p-)2nSp1p#RRdzP#UWU8L$-^Gx?;KB+gt;t!GM4)kXb@xUAq z(^Xh8{37{z0X=t_-?}$=LUJR{Fk2KcUuBD6MYY4`Ovk(hwI}}C{bU8Ds#L3Vr2?W9 zk|GIoR7f(|VrELlYJDPfOlu%XGN52@2c%P2*C@b!AYDu1@F+*T{BJ1U0r7*U{bn;& z1)Eiov;hQ7Tj-P*aG?WepQQN(VVb@~Y9FiEYc=qG095^cF3_xg+HW~TrKpCX*(oA- zLAcAI7)bzD&rjI+(v^O&r`&jko&|XoA(oW~OLq|LEvI1g97ggJ_iEfn7x6|~#`BGu zA1{6ij9z1~+4c*tM^tKbY3Il2n6gQ1ll!b_8m1ecmDJunz=`4!h@jhK_ECBb~ zEla7?8?-=eNc%zU0tdblkCI6da9{Qt3<|~PX7DngaFY!#p(z{zO1R(33>T=QZeR)B zlyQ7lkDs1$S&eW@EYWGe;&imrB~m#D((wJU zdR9sdy&Zmtq{S))z6hcoAZm%2(*=G2{7?`_pdf|>UZNfAMTROZx4f?!Vz=oBBQPc# z^j(tZcny&WyhDJzn0EI3MMeT>2?Mj#cDj%}o54kemn)M`8n|XU;=TL*wsi2LyKxG7L<}l}&ym0O?r(^iE)4Xs0>q zFkkr5lsHcR_oBbw{+GNdyo>zEUk*De|WVykQ@K09HCL_>2oV?2X5mOB9lco3QZd;t>aC&q(oaK+8cRM-75 zOKLD#%iS=j<1wd;VVlZ%*o+5G!fYt?2hiDt*h01k{!-up`2twOUaa z)yn8T`*pX_Bhnu*@xq(s24&dqztSAlFx`_Cy!6Ak@qRA#fNeU0V`zV>K~YN;N?g)c zlIxkfB#VCS;*`x?+GlXiUWH?KEj~yY9&}92hgqQ0U$>Qhc zc5ZQ7$rvpdG*FotAX`p0cALn-0dH5Ct_(wPjE(H|gnYze*7tz$3~X#WLD97vDMC?H{~Q56Jj#1U{#!g1H*DDULJ z=8d}yM5))VSiGhLp7mCW_XpCk1LtQ`u{C%v><09oH3;}deTKlEdL9y!F2H6VDCa}a z0I)pU;IjnA-p8OgWwzrVH&QcdY!=3RNGkXMZ7*s9|04LoRJ&TXHJ3p(-6TVVn@(WX{onFgvsCk|+ZN#&G7M2_fWB&phc z1p!hiYC>tUhrrHAWk-iM4jeZYQl7GEdC`g@@4{L2l<5y-iWb>NX@msD!CPPfT7jrw zG&)HHRq@eoFyw{ARL~Z4FC9U$R|Q8-=Sm~=Tg^Ie58RE{XqRUL)s5iMQ>4_Q>==x{ z6f|rLoD^#=NHHTs*WCs%Gly{R-LZQBj{w`9dp8*TBG2ZRtc!}#a2TGL53ul#p&8F% zur`>7tW$1`bIJ5wws*})$#Fl%^(g^|YKWWbt)GSptyO_SY$E%YXFx*yQ&}=+S?WUR z)x=A$#=t*^-5+=T^&ll0f99lJ={Lh+DT2eY+jdxxOsFe>esAZQ*YX6`{GZYux`{5M zpT3R$?4ibu!s(HerSTk7#KlVt3m9B0_XjgPV06Uruj4`c1vUT!O*VFDA{v^o!-_E$ z!@jkj6L~#;yr@>lF1$1RrO0=PLlM`OM4_#=6rxow`nv>6fmtB`XVAS`WB^^s2ziFornPsx7B{uUs6ZU!1N6!!YRlJ zG$QM2yO}8c_OVczw!-RNZDrym#XzIQPXS?Dq5HqEkb_tdY7EAy5TaKcrpg!SI1E^* zD=lSmy{)&j_{m4Z&eCRe)vF3Jj4#%#^Tj(aNim98m%hjcc&ZnwqZ1+3T1cuky2FNA zGDQX}Z&f&a<(_uWkq&ac6G9~^D7ct^tmucW5;G@(E)pQ^W>H-9VcHS@t0 z$fMv2EFtL~NeCcCwjHS%m9We)0I}wZ{TKj!(%zBy#i($;<3sq^epq}1elqA@9*k7* zMv7p^6wp4`w(s#f*P_F>qrpgK8?$c_XgqE^ae?gPP_1V>O=MD%D>Hn9czY9Ie$aV~ zv~pmUAX4KP6TJ{ChwL>|g@<&AWuFqj>FT}lDP_|P<|J&@Th2@qqEs$2!cM3Nu^tG3$>!TvBtK$Pw{1s{R4 zG^@f~E^5uDH9or8r9d1;snXGxmno25n@8nuMdx=%Yzq&)4eHvB689PfCVVlXS|A6s zZ+`A^z_E=!^)g8aOKKMxzT-?B65d@d?_(bwa0U)Z zPjG_D?zYS^%9nz0y9E#LINidx((VTgz7gZ%2JJ7;f7(3oqElYfzG<*ZoB#MtYp(x= zJ%cFREdkh-^7fPSvLOj)J2a2(meaP74j#9R;?g@2lQdfuCXli(}_71wNZh1Nc2a-{T+_=XUD2px7>6O$1 z9PsRA{@aB`DRSVo=q8eyW+IKi4#pJP%@n;VhK2(#D9kt+2|*MI)Kzjz$}8EAiuVS=&}tT&iNRts zTB06>Fr>oQDX=2&xS}7cPjn+?E|3;1b%!rkegG0}{Bq^E9K;g(K8k*3qXA0eG8u}r z-24)6wPxSvw|pivJYZQFi4ult&3uzK^NZpK-Vw-SoZKwm5P*nsSgI|YHwKlLm+7}I zv_jNXPiK&xg>{OC!X)g$#31sg^5#HcIgw2bE2qqlP@DAIFxkFznekL$vo^y@mJ+Nm z6$V?~LSsNmFns_LOi-yuB*DhSA}fUp|@V#p`$u5@lYy$1nEaS2_4g2@Lt^zj|?={~Pl4 z!~QDq5He6lIUR#Vs;qP{gP$@G(B{Waz{Q%wmm6!#?|rIFvNR_l_;JLKOw&5BKU0iB zRnjVfgKi-aQNs!btq4^mk(Va5y?@3iME>s;%V~}`m}YijNgnWx_8^KAfh8fJzRP8J ziDwscT4AQv6a+5GgQosbWZ0QO zhycs(PL}hmL2jBWMZso>!DzFCo7~7Ce~yrYbm=ZyLF=eblDy{ufQdO{RBUK6ODU@y zF{bmkbJi4Ohd)Md^22Z-4)1n8hkT&Y`Z`{Xq{)YPGcV`QJP4%~BZx6H)A-vXKM$_s zdtZY2cHU$3lPLguUjkG4T3#+Z%biTRI>Ai~@US{P{<5()c%{O>JiyL>&@4|NBZOp+ ze7=&s{P0p^gPEn!b8{*3I-cj5ge<~x`Xvf^vUv0FotQ+G+@djjwa55FE7fD&K#%Y~ z3N1E(TvyUQjdtw9ZSr^0Q%hl{FaVur>m@1l30tM7DKUDe{ z{tcAki)cdfAl#~KajW|L8U@Bg0k#WJBhet~cx_=BIAONCvGmwawQ7;5z=kih7Z1q> zB8wNrlHI|F)u(qn^ZM(a*Bf4cc86iUs~$&W6vU@=e3+Kw-M=JP4oaK{-5c#c zNo8241$I*2K`!@NGx;O_o%O&>KbNTUxLBd}>eCNA^T7R{`x_p37OE^Oymy;wJ#d_G zsF>-6170{FDXRSmxK;vQaw2%$y^x>sUdQM7g$PTTLz8L$CKVHVP!WshC-56ydBaaj z)d8wjc&GaK$@{*zeaK1wU56crm(*tgA=zF}GoGP}HFWWeKk$qx!8K|YS1aa6!2Or- z%vrn+2?pwVPKUPFqRytd2O=jXR7-=mO=czmn?~gjWH-Bi{;UYUXsfBvk``&I2oV{O%=3!O9(Z zd<3&KV<$&v$$Wr5MEkM;l*IB%FJH%(UC$TI1`O8V;`=n(`vB)6wSNX+G>Jtvn7wMC z&Vi5|^&hm;E{o^lbpu>$QgwAd+!`*M^Xoge-1*8~Q=VSE>gko=MbY2amgPP^AO1y- ztna`r4JyZkidwogE5Uu|?8n5~w4qa??NYl4j7OU!dj-p7cFx!{&y~ zn?0NAH$Ah-Ku1&}_(fHzd=K!eZ&7I>AvcV`Mv#`W+{(Ft4zzw0)z}3{PXx*o^I2G$ zdsK6Wc>;@!1vknN#0}VP2%Z4gR*8fyU?Q?IX*{9dUJveeRM+v1`1MKk07DXe0AuHT zmF9!j8KKYxW~_J*AK`EF%~(a8k7xTpJwVM0J&Da5Rl42G!NND370j_VW62hLL#fBj zxURKXHUC0w?oH}nxJ`ybf>G8=cQ$G}XJ9De0*_6`bwFM%?~E^5_AlA^q6hxls&U^0 zckb%?Om0=+7EI2xzukmywhl$!!hW~)Eb0QY6~LF-*00r{Q3vSZfpElNHUcF~h0`q4 z0)`+6Dqv3t;0-ISsEr079tCTSWz$3I^PCOq51Wsv&!w*C$Yq>2eZ>@{d*}*a+)$m` z`Ni`zsg9!RMqr-DV2yPWRY4{+NNo@ceBj&;OfCB}2s{dDgos@fU?~HtHIw0!>E`x8x_h$<3%OUW z252QaAeo(5!GH@CdTBBwLxCa|bAh@_<_*t;v_i6rbXc58A}P@17LUMVf1UR4HFUF0 z<3IJHil+_BR3Xs37A2YH2UtYlK4`zo|H|u}2>J1O;s?A5iht})Czf=qkI<&!Y~Ef1d<cg^%!caPt%uw ze7Nh;cOIWIn_r=t`T=@edFJJpo_QJ7!`z+=!!C)pdIfxvw?E11y6R;FR6{q04q^c+ zUHSLBwcSs4RZX$()y=O9e^b<2^4b)B$6V|dcLQR7joukBEUz9IR<5H9v{Ilgw0^}xh)Sz3Gm4QLG<=}K_130h* z1S|r4Q$(H_LzSPptoJnJx?Kx90P-ClmEZfOSntSzr^)j$c`gKg(SY(FsB+BoA*;+@ zjz+H4a~PG*w{s-wxA}Y&l(uNkA3X5vfH!bN|F%}5lIK>x{C`^LNT=OM+8yrcJGtKI zefE!)oj-BjsHHB>Vn^!YeIte#(zP~(gm^1zgjaIRGWPrgIl?Ft>ZF(*6!j9iwOZSD zM{dhaUc9IbJCCdaacRV-sfZ^2mDCUYmwro^Cetdfz=Cxsl0CQdC6eqPBNy zt#3x^BV{)k-@*j1spl&!P5B2hhX*+hD?wc`I-jrKYFN+d{6o2VMyq+9Vm%*THba)W z*`O{IrbKgFHA+8_iW(EE3l>qAhD@gv0Lh09gd+n;UBD8ehk==;&|!a|1@)#dgLCGk za=Kx)n*A6*c#lA;VkZ+)XZOg`MeFMK4anOD{!Fu`^U z4`=h&bSqtU#&3OyTJt#V`PW~6Zl`zW@9Lgv^9SQGrUo=hj6cq|@eU6Lqez3n@HUDZ zA`RMu-v5R6-2L}IyVP4={&d~_e)$FwG&yWRy?{_)UFhKYr00!k;J|1wraO2$lcoHB)-;W7!;4&`_t9k@;Y8|cAqxxHW5|Z=20|@YA(U}gB%|01 zQC7i`jfb{tGLZTs?<~{DMzK5>3{GxVL&*q8AmnszdA&CDXEmTCVFg-t(G*4J6?TJn zA@tC=3)!u%(0-&1h1!t#j!=2v2>RtG>WpBwRJo111G#lb9zrw5V4R~s;E>lUhop%Q zM*6cfIf}68ZGlLKx*bHPoxsQ&MC()d#zj1ZFEoVp0vc{$HAAW$fVhd@<458a;%sea z5G$>MC`g7cU&D{^oyafzV4a_u)}zGhIxO2G?;j|q)o>SO*}43LOst~|WXpA>|Ln$~ z4Ee9cqM0{w9s)PB{`xPPMk{1aX%k+ei~u*|U5xT0|Kw?O)og=vXRwQJ;#!a8grcs& z>##63YXt&aZGk*D1imc1%7Y5eM#sx=Up6d?9C($Pz@`h0ogo}l0qK-uzuz4EB;Sr) z!AySU;nbBd7Su+-QCOO$1~2{q)J6dv@1DY8RJ7El~fuzH{8bm9x)-9lW z9m3?sZWK3PXjs-0m~#f-@8#Mo#4_TG{L2EmTuey1kTvuO-3guX!FntwwvOk)0eIfa zZE?V(s$_tw(afM~*>`~D<>#obAYjw3ayy+?P(nTJ9lC)Y^~hSQ*kv5GDBiGc6T8rL z4wL~?)ESI>AlFqGu*L8%`!Vb?(aax>0!Q~lz#->!HvVRCg9in%SguVZ!o#`uW8^gX zjNnVU0_`DDlo&KN@ia%qaqL_y{WI5KZ-SCQ7hOZzKRlckYIXPQ2FO%^ir|Ai;z{eM zG8I_*)I9ci5l2Xd4lnReGFwIKDjz$oF?SEjS7hd7jGH4;Q{gT|jLgFFiARr0#Aen= zoS$@^j<{DL&<;~%m5!B%CDMf&ks&utby1{!4eT*b=&J6Hn`K|)=&Umo0f!#fNFCt_ zlq%yeto~DX(5jOLpscSLgKO4^*?7XhI?))iDbq0x^X%zeXdnn)H`k2yObVo!gI4q# zKKaQ7@^i$BZj&EeAV16&-Puhqy6mk98RJ_4q|~(q>JXWzw3_s9YGANeVn+kDArBpO z0`i>S;2dn>obfFuGPo+KEmQ}yU4AymPb_Edl9|&f<|#xyo|N}Fg>IA^J=pQM{h5qU z-Ib#&g}Mea7TcIvC<{3vx3ws;CIgrGGh)LctvDY5sg#4-uD*mF1DIWN*qJv5oW?)xvJwl!${CAyt6fC4c_jzKKz^7a2oQx~tCq z}c|dXaa?%5}uj;512o7TN>>gZI0=BrL z*&;frX{+mdpE0Z5kIL`%C(0PH@tVtQn*2BU&!doP=k|mT3y9ZTDED)OzX4=?%@x`* z{!RWyDM7In1(ha7y_=@^WCA;+wwvPZ)|x1ymb=Ze$?`|Ee|`8zim?LWgYdqF5Wo#a zivIcyAj9a#2(ii)cwa~m0GjgKTJUE1G z=}qR4$beaolHg!c{Swrg1(UEuuVW*S;V2lKNGPe(u-8ngM`oh@;0ANZ%1~Bo!J*)G zEK!Odu^h9!EHclr{X_dqY}TCJG%M+Ods52+K6@)*+qksVg;hRV@fz(W=@>v3#4L87 z-36g!H$=j<_|@JPU?%vzya#k!lD#2=KsEodit-NmJ9ewi|Nn063>^NeJV0JmskAq# zC4frUh!H}>G!kotZRjf^XRdQGMeJQdx)*_q$i2spBH@5WU3;Z;cJ}4&=EQXfsc_8V znW_HZ3CH(NUoTJ3cjkZZ^d5P7D^BmRPw&aybN2N7S*f_7*|2rXL2X36Xf}%Z#;N_BD}-4@=I9Rh$j(!JUt z*xT*ME#h!OMs?*qwqS5toq;w?n@Xz_hqj(QG}IP8#TrD+aZpJ50!SFAOjv7#e-Nlf zZ8JzRswIZiU|u4}EmEffEmSD2EYT%0Py{G+6f#s;IuI3DNzofNiNZDYRA%L^S-Xj< z;ri#CK{{dV>UzXgV>u@diH*@~S6c-eQ3W6hH*Q#sbb)AP(q5lA7>CKTccDze*Ot_? zV>1|1$~UX4cdy+y;6b3qUGfcI{Ek8D`+Y}9^B|~^0pFt4uwry*wlaYQ+gcoy4bXjG z3CF}G`a}x?WBQ_FYcd|5BnvDoCjdS#3bzHv^`jWeCM*QJ)XWj zyI^tbEt-p^Cb1eMM+{?dWUyln41WD|5vAklVwde&mhUn3^_ZiwIcdQviV@F)^vil4 z%_$d8D%O)|Llq}u_Buw*$Ur}Vp9EV&ax&DZ%ZJwvAN7b#WbVM{jK)xEhNXn-$(P+9_V^p`->|IdAtw?l5d?G;?LIgR zl8_WXoUmN=t~;+Oy8%`<@?Q`aHIehU6qH&o0+HZifwA3Qw*R#x9n@Lw4k3 zN*RVnlT0ZG@w_PpM`)Zj7gHr!hB+cB4XZ`gp3$8Z?zww%PoCVE9f@yF zKuoP78zsWQQu+3v#GwCR6?enHE{C1kj&^3l{fh318%Z_RqH#s&m<*1WZgw8WoXIsr z4A@pq=F5D-BoELXtRa|)b7ElrVU_u66{QYvv*6IQz%NH76h)ViWBQ1(UZW(GM zs;7gc#Wj8UpmruQJZjG{cJhas%MHZ=m|0y$RkL3n0q7#$I*dki$aLP_Yul9m379y5h3(AStRxO;}LXZlE01pm~Z$ zD%1C~o8Mk2^8|4@f`Ha99##?7Q-2Qck0>PLgS19?i|w8V>%FRGe{L*+r# z`N_57C9jOmb2RhKK&G^GA<%&XA-gsZB~!&_U|DIhs0tQcxJ$*pS+(1nehrj)(A z)~(%P?4VL*Q`W+bSzb)OYz*K-ejpi$CC<&_=oR@JHY_(*AV$A>@7}dGX^>nwvfu8X zGv=6^HmUSgaE!|8k&T0biMD#{bKU%upE0K^mK1x4Mn?py-J%Oh083zYV(r-O01)g_ z#HKLFzRZAAUAOsQN!5r$bfLXFupMJC-`+H_ zSjsiwot>$l19*{=O{A})-0;u6;sjkF_n}%2=U*W=1J#7_gJq>Lnq-_Y1>>zS?!#+N z-)XRV=e#R2M-9LX;^!KWkxJYdy!&_&;Q=6f3<59X z^hskLz*I)QT?02;IUc!c>lkq9OiYm`jz3_`1vq7#gjj$77Q=IEbpgmRR`cl`9oa;<^ zCA&A}9UR@C+5HYu!*GAdDw2M;6(M5LDd7%imwUe7BkhQ3j(3T!6uT|N#JH8>=Y%^2 z?*?luix|&VnK2(ld8bd0_sSgfN~={C?iFCyZc&DQY32CgaK9v=U-H_ik*?#!m9a4$GV1)fIskK{_pl)puP z_Zt!v)#zTBQpi=7UK_&jh=NMDEe@&P?r(fp4w)-@eOQL}8>ku-oj?bkfU<_+4jMQ( zB*}0LRvKqy!5}uFe1S&b0jjW|_hgDbK$Cs*AnT)mnMY7*jtjtk^>?THzy0Xseq;J4 zbY2ck^`5<&Uux8qoX!KVm-_zJXJ&g-=UgEW%Au2XJYuB#nLJOZ$fJ zWmk!*cx82AZJjr+t@EU|*2CI5Z(LjFL0cmS2l1m;-L%x;c3pJPpWk_($Z7-5`&WC6jYpezXbp1 z4IW&#;d3`{LO$?$^4UC~D2kj3>PE*v+qOR%k5Q)b#PU0Tn&-WKd3ztIuAHZ6!r%O8 zQyO|F7isWo_CIo^XU322zeASxBd^`<>nVyQTd1W^ZE0q8Z`4#g)Sxa6S{*gN8|Lsdj3j2llWWR*+;vL zSK3cDkM9I*QEwq-HB2F@Mj$5w|0^{JXhcj3WK1#(CW&&4lxDa{lSKa{(FBTTiCs*n zGh0!Rp_?sqlMQA}s0+k@x8tHH{lf7hzOj$6cZ81!?*OVLIbz_6mTgk8Cb>ZJR-#;^ zJcK_?^hAOGluZzX6Qe{Vpn%WiZA7H*sFa%*Vbg4-f$&x!UT)c!#7G3#(z05!a6V>8 zVtD2A0Mq{&ZrnCm9uB1^4`=&uq@7j-Efssl?=6oEpSnig z7)Rm8$mGOP+M12w+u_&=9l8^k!6`6~P#Rn=7^POf=!ObTG0SaO0}g)-O07h*cu6!{ zFQFrot&L)f*d|b3gYE6s8`gI521aMH*oKAEH(FclHULm-0?la+q@)g+tjJRHiOAfs zyYTEj{64;WvIMDM2!{8d`zAQ$`K|~}p3OL0jt;&-cg@0cO+ZT>q@v&hUtIFbx9D^v zYvM*Lp&oU$f?A;%93qe{H6%>O>Mqx%K8*IubnWF*+s6p>qi!eU;GBR1a;=z}-^SoC z(kEofq1+Ul*=SGI$@&CWtSeg%@pUe`o*(^-6lS)=j%MN3N`%TW4mj_q06ive5=h)C zl`g(E$*+(#fi$U_CyttJ_6}#IsD=d)sxzaY{LL*Q*qgZn!^boUxcQyfC3-`i>{~L1@*n z4{?6(MYJXonI9JFNz$!!L?&fkHWKIhP7*?0jR>x}p@?E~r=Rp&u|YWf+G#`vq)Cox zoUBi5mf+9XFt#KUztV@=r+$P4ZbvuX{vY&H=sR1Y$ljev3tgws{}ZA_D+mt*O&cg$ znqkShn*5k8*#S*ASJ?6%X8Wz!(BilG0KliIa6o%Nm$$M=Jh5if+&`8xAK0PMBMeAf;) z_^e2)3w61K6-B|5N)g8?rUr5P$jOy*$lRm5rn%|jd&v8veol9O=0h-e4cx%mkBl3G z4FeEzMY`)Ycfk-}KP|KW+TF9aOv&Y`dscU?{Nu7IY^1+;BVBpy4|licw`NVj$yqni zmGPt*)BYj5-Nq+9!GGEF#m7`E0Aj!r|^>K}an zHJo1He}^wqXzhnUwUR}OhknJ^0Xu(;!K==3yp$iK>#n490|LEV*B*6WdtYg4`hwlV z2B)iXd(L9H4X)L6x-gz@KKZBCciuAYeCJ^02`^IUCLN=jrT$1tc7q(NhAzHE>HOl; zH~tE%25h(iMfBAVvmva58qI+*m%K9SCTadG&+#;Hh4Yz4|J?h~0GFbeiHPm$vX%_iZ2Wyt{4td++>q>4L3@4Rv*c?8Hkm z4*eT$(lm}f3e1RI+R=5dEG+Qc^1y?I@W0@?$XfaTmfC91yS}TgedzXEjowAGw@)K* zL|yXb(D66@Q+w&W1+t~O&-#t^4UX=~>SxE1Fh_6DPTND0fK|(%6hw)2j0g_B* zLC&vKn)Md>{zfPkO&(Klh&LJTPo`A+yLA=(-FbBBXL~>hJHp?f-fb?c+G9Vxvy#vE zvcI5@runff23_0#0S1b?`+$_O~ykY2XfCPV-<1padJI+>B!Ihg7Z) zo)0kke1#tg_R#`?Y^HK+GbI5a6bSCrhc3}w9q!O)v>@;qW}Wqnu4!)T0&^BJ-}=NK z)k$HlTvw$&p>l!G&QP>j>2)Dsg#rmf6-pBDN>K_Ju9+Hk1NI7{*plAVI2U%f3ewkI z9-wDd3+jA@D8*CkCn50k$r|tx1tie9lxHA*Qyt7i5SAKCpz@pGp>T?Zplco=jZQ>1 z5xf7>khx?a3R z*IIAM%^I_l%j@|9YbRePb~5NtuCacnuo|59pC@$Tgs%TMp$#Xrg-_T4T?os#8#OM{ zTSjWf5lQJ_Mw@383)n1xCS{`zX(E!V}8_KXhk(FfD}qL)5AE;v9NM7^2Sq?rCif#WBUFgq5g>WpA7rcOdV%tB(o||BTVo$u6Eb$VoYR|3NKvzKzhHL=Fk z-`+v zbOms6B=D8%j&=#D!@h#oSU*Z_iddmq*HAimkwqQNx9X6iIYiLg!1yWAoiHa~8jkGf zp^W7Q7pg#B!G?+ua~JwC2`U(QX2aZn2AN%-B2jKBBrnmCq<+C5{_|x zvw^tq--0{p=`lW{zyvu00Z|Wr^f&2xb;Vt4Zky*hd;FEXzaf|Lin^S>aMR-|%$fpB z6~y)jCG|Sc%UMWLNaoA|DqCxy{t9?+1=qozL0}Stqs0)(R^2Q*;Q_kc3RJt51oBS= zN{>pBCsqbFPf@p}l2}<{E zfc;KcyTA%3Qz+_rgukGFfO2_lJ%|b(R!HdLZRvd0>du6->gHHj-FyXggG=3oST=@Y zvAz6*IAJrA*N4Dr{>BnpT$wi4$g4j>RI>6hzjy-yh&NPvxaAZmp0b{(Zz>O_`vLT|Qh%zDk1V(IGI4}fu>>iL~Bk^{~Dh9W+{7I#4r+G0y{G#7_ z6W`xND7cQy=bLLD>7@l)l1{9;H_-!9T z9$-}i&V|R!w$WrR4LYH|kR2)e3SnI#i?reg)Qdq&a-fkCRWPqdXm>{~25l-`XJv2O+|0sd=LxiE^C02I4nLmW}M6 z198yk@43VG-@bg!o&d;OfKWD@+{4q#A8Oa}ri(8zPnz}dZj6LDa zY>6!*U*eac)ymV$pLwvtgFs%x5#?=^D&2Mu610)9UJ5{Q4Ed3bkOD|oYlIyE8gvXF zgp<&oLN4Nq=Rk@m24EpBM#7V*-8ma`86~r&z-DoM#BaK=lt4OSiqY5td!67egg{YN zZ?0r#J$DCJQcV3vAb+F3AoE;cQY0cZ5&6N5h(aY|i4?@rQACMNZWKAXZTHfM9> z2syzvo6gY+C!R(^PCRvcxjzu=-V9r1(*XeYO|P!&N%nxBJt+XCmC`i{9pLJfVQW&cdZWi&H6lRwX$aB+PG8? zLS%_}2i-e%)Nj~nY(+?J-Rc$fE4+xS93_3{hLH^;eu~i@6-Aq|_)*Iqk)v!pSicP! zvVgLY^3=O*>AH1G5qham_Mq0_z)VhBRlj0w7LwFzLD3O5=}}~pvWN7eC_d!mGYCer zJ~M36+XqRouaRDN6=BxHb!*ZPF%`P52q3@OoZNlGNBi~-gY8~}HjB2scNqYVpk#Cv zCRyFtNw!@K37Gz8tRduMSr>{Bi1Ge3MyLk$0Cy=PRHPcvZxwD5D!3Lfx}5Bs157E; zZ^;}Zs3-&yBvOK&JZzJ(L3*!*m@u2bg@?J)Kmx>Rqu@L`h}j-OD1si7_IUu= zuaQ#YXGlUwho7!!CjTo)AD)j4PJa!#yZ|DiWZEQ@TQQ!X4pOtqDhx*X6SSa?T>K*< z6KbXbaymu8HkZky#uC%%Mwm5qPHsL*QLml);(HwHr-aYwf}=FUyEX{ly&0i|c&P2| zc$5Oz8?9KD00SCj_^_Qy?KhEv+#fsp1R>3yfuqOs4ee_j4(1pcU3SJ4&4$hs>A=dq5Qf+BQP5x(gt@4FLn z>`vt4=^P9Gkh}0#BE7se9cu0mfv|79Me!0@(|r8 z-YDP;{TA3xMXvVh)34P1*7&gX?Y6@>IN>W!MIvcY`rXE{lIz}x^Ty39ySdo^$kz&c zU^y-jZR&fkbiMj#>Ei!UpHSgmzvidUJ?x!z^L@9J`d9p2VXw3=#U^#%*0*;Y^1imM z_KBCJ`FdENu)@s-Ed(R@LKtxggpfU|{yw>Zd~dgH_~jOZF4gL4malu%d(Xq$|LO-< ziy?K^dR=?U{qw?~zrzWlitj{00j_^_J#97X6)XXRBM#{k9s zMFuHlDR097pLYGClso+oP!s}_!9$n_U#r6z|NQaTGAG}HZWM6!(kI zw4n6w>EMmP*$qsgNHYYI=ku1WhxKkM*^h!TXyHBAD-aPp(`NUlFV~!Q| zURnd|CYo|y!4(1sHX^<0L7r}%M~hJZJi3Zp^mCna8;wesW)93uOqMH}< z4|MgPD&rfRB5@VMyT z12qyOEn~H9b#-roZmXp+uk8ko!VQG60`zk>bmN&pjO0iVyCQ~8uet1?IaW4e1b<+{ z*g^AB1kDE!G|$2$kU{fIJ7}Kt{h)d5xBE`*H>Q0|5ew;3fJbNgzxv4kqmRG2mHcu} z;)1ktJcKSU-pu~kTYq%3@zugh`#BNda_qusH~UZB9J>!H$M79M>>TlQryWlpz+L|% zo*r(-c(h&q3h?T?XnXiq85pRrYGshSRU0+N=#ZwDJdx_DXA!FwWO7Tl8RPa-SU%E?ncQbDVw%ZQc_Y{TH4Ac zC7ZNbx@n$!=iHg^?|JS3+UNWIJ=(>&=bpK9@44r^&->5o{d!|T*4xFbnr7RW1uRYz ztJea($`KuYUR^$hWhP7<9(yRG*Nrsn8-d4U^-KmC$KX&!Q&FQ(oFr!`6epD4%Jmrc z>Y=6)XzXZpSVb#HJi%6~sWVlFf;yb3yuLazRO9aJ@71X6%99S31M8hA-h@ah2ubwW{0Es-)v@Pj8wmZI`DP5vf`Qczo1CcoyLe(hscUC=J0`9^ z2i%XH%xp}xi$^FaZDs5;U82EUktD8xj8UF;DEMD-awigIxZ=$y!vsHwWL}0OBq111 z`~>Kn8NU*RY>1PG?G*I!-f@8XYr+}fOe&nHx71-4_{2}&Anb;U`^9D6eOI^OV}=vC z+J-|Sk^sReY>?JMkp|kfmZc}28zU~4>4$>Iui?9qaM!5xEx0%AT(UGf*}1UpTJX~$ zw~46pWa@3^;(0zQiz6h_1(n{_GX{X52Arsh@~=wEdO;}OebdC z&Pz{`sW={$#ivMSFaUG?;x-Y$e7WZRP;>?;gfSjFlU-#ex^EB66wPLJaEs@ex@VtB z+CmO^!P*_fo~!&@x4g7!Q)o6gtHtvlteeihJ{$k#!r7#2-|QBxm!dDd=za6A_yn{;xJY=42;U(K|Ng0PJ`d5rnJ^hyV8U0Tg&P- zL3WerXHtT!66RF9lH@9)E($$c#B$DnJk_j3vBz?^aX-vtfuAYzw}!0G4DD^Xz0Q6h z+G4*PZsDV<;yKs-_p2{?^?W~5x0Efs5f47q5X3S{9=e1#@JV2w$HbFE0%0<^(2=-O z>`u~EYV6|OY6_c&6*nD7HguQLZ6UMU(5S^$C%=xqaX(qUU=%y+%qtAaF}!j^-V4AA z8~Ksg&y?{qjiDu?o)ku6(1nJl3#VTcj@}f-4&5!=`#;4Q+D`4%PXdsKnk9I(I?ST| z!I=PHBZa)`G`oU3!I*Lw#~GkX*@Q{~{%9lmo0cP}i`@TdJGS0-uu!VcGBrdA)+2^% zvoqtn>^Ai;l^0_3ce}mOnZJN4hxGReFN~e4jde9^RhL{ns+yVUj$4TNbWk5IdUWY3 z#(lzV;l%KX$HkLR%J1B)%YSP)_?}>Kk})D0pjKg1IiQI}yi*|GsCDq*AC?84C!wxg zES^L;PbANFNeG|Re^(LQcj`8*75#Ti>?U8ighUqmt6AlarP3&u z55>I)8#%5~$GB0QPRIe}0W(1d@dPM#JVIP?!1y`A^{O+x8DX9y2mNjZ7`zqIW?l_N zKew@^(KgEvF~orip>lvX7g*>dU|^Y&tk6aSr~yWZpVIg*`Z!laB?nG2o2nTW*Wvu=6(cE9w_+5o^^ z-K0FOtZUCSrx{+^wX6y81zUd07tSiZRvgW*<>$h~?W z@z?4k6-lbz$99?fSuon_k-6KIq*_3XMh$8srLwA6C_2~;Rm-bJtQfX$!oG1MA#nw~ zK4J2zrE`MQ8Qr;?_svmgX#5<9n7~8FDqj{3;uv4L-6y_)%V1_f(2ixRn=?NYUzlf^ zeGoak=#&yrkH|`}>V2wG5;fOLWt-SNA!xr3BV(IK{Je>1OuLzr1Xsy!-_3}X1hWDn z0}^Z<&p7CeaJz5n@ADVrKkhZ>L;Wvv(N|ho=PEz6BZwz3B3_Vd%@NlGN#DX(;~+b&VmrS-_pcod!*OtjRXxZU&Vv!A~3!T)$8eO9KAux9?At%%W~ z+s2V}YcsM-K9&K(7I%|nSrbk+l&`-@mEah_gDhGV6oYt>Sfccb5X*FMGEtcTUo^z5 z1GZy~m~}in=#J@#(TJ=zhgmm=3tpCh!cTc^)LDlRR9+0d>LjR7@?^@qSxcV7R4Vr@ zSi57vdPQuWizI}fngyB8YTX^0DS{p(3+8Jj~%+ zvG!{Yslu{kkeKmie4XJfu=$t4M7lx`VwhDbE+VLi<6E?J?c(+ReY-aHY!1oCJhE^- zKbgH_%X7@8BTLBOSXBG?0Uuml!R z!2!fru1K4-V%wjTQ;32UrUDp5Hhmp1*M2Qd;;VZM_c5P1!*ls{AN{N6qpe>#?od@& z$SW_Fmmu#>5~G#Z20-RTzQ`#`bA24mb#$GWjOKa)UKQ&U`MA+Hq|oZEzQA)ua$ z+qn<~N+P5eh3Z%iV`dicnPZ{AKR1dg>O15nAY=!C8_%IK0^A6S`?Q}oeGjL7=)F-S ztR9s&Ox4B7EDZQ(5(MaZihxx$Y&oP~_s=;*!gLa%X$cnA)ZUNqO0MDeTUp(PO6 zMtLq!60=yOZW<@!UUK9tL})!?uRfB+laMDq*2Q{VwCKSwdPKf%ZO5&6bkF;}n?f%t zeJdxNKpe=UO{}oJSuVR8WphR6$x^QdF?HJD+dN>r_Q)$=jI_usxHZuH|>$z>UIk%qvO+)J9mbgS3<4{Rc$$wh$FeW%~lQ&teJj%44jZ^TY(g1e1t%lcfGw5_({_EHSf# zuWM#DIkzQj%nQ+*vgE`cC`7K@B&p)DB%-r5I1}4(`j>b__N4tIaWdhZD4#$D;RPyR zqXi#GqT>fv|F(qYXhKe^K;#ABipmbTslf_nVH>#X^5_>MqbG(kC4WzfD*{2d0H zIu%qUKrH`W_qC{Z;vR;Jlwj~DloP75`iPaADqPq^z{zYREmLU}Fye<-`*uaI^N4T4 z8IU~LL!<5Pap63V+#5}FGJt+;f%lbsGc*M9ggg zn;k2?Qt=sVCMi&DBmFIHN4rvNIvU3vG9SL*y| z*xFQqCzIs!I0C@2TxT=g7_xBi2#7)7pwWAYQn-OME0+S%T$M$Y%R_G5x^3z5t-(1k zwJn-6YY{4a##sDl*=q6r)zIJoxk?0(8yAP<#oCxf({CH)PoB~xyuS~LKN4UE9p!%E z{f~b3fBnH-;~PWbVhsU$;a-RbZltdFujCD&Cz8abe$c=t;!I7>d{LY&hl$@gxozQW zvd(4YB-G;ikO+Cizs2n$&m1PcOxofh><{1-6;!z?3ZZq0%=g@L+35KxD94^3_Ah<; zn-CQM6wIO)9uwJSXw15z^#}HEU7shDgOfe-`tkBH*7+66aXp<*sxMuxSTiOenupmg_CL0 zH}Ya})0|*sy8GjrmOso&Dk*y;FZe6~?)3VvKG>%cCK4>KO5y)Cs2vN`j^S=oanZVn zN1npmfTYvw9fsOX1`u%nWKB-Il|^`}yw8s$P22-*4e=j!s@`*Z{p_a|-ChZ1@2Qf2 z*iboipaXo!^&Yzd$(g}}ED#s`S6sG_0O>!)1rr!&HjU8d;#c2=oc$qYw?>p*nyWki zpph$r8d2zD(rN{k7moNel4Dgt5h7pl;ExH28CF-!1YT+knYmau?~v)fiwkmLj7XWt zL>}drS5T>WxV$wau6@+K_k(R;2F1wLaQIyBhcDzTh$n6fMf~>jYImx$?=ifG-VR{d zHNDLqWWNdm-zmRYQ&U&}c<@VcrX03+v>fAp5MAIkOO z1GR-z*q8dibF3pew62bY_-9e=w$BlUdA16)&!#U{pFr(MLx**RBnRO5U?HeW5{4v91J zgVvcIar(y!Q+uUfv>d>GZl%~^KE+8;@jxkyOMbpgYFmSmt32}8dFNg%;nG~mrck4V z_z8DhDR&dF9w*Lx?}s0Pk$n6YMV_+{iNFnFlAjZ$&fN-sKvvZ)kOB9x^Q8X+Il<3; zS2%a4SnFF^W28Hakw>o_zAYGe0P3sU-(D`qs9%hC&`gHbGK@#?vb8nI%g*fxfYb##xo$WO4*>pTIkaH{>SLUCR#rrICy*5Kb$GCMp}Wmf#t>(VWI_+Fr4Z}@g~ZrUksLNtoc%lH zD(r}KQ8qIu&trNxImjxdY+?W^ACtbO0cr*)&cr}8A=VI0h#hkx)?gd`4XkdyV#O={ zG68^-xEzR+yqrT+Xv1@#&wPQnxx7U@QYT*|87Gpadg4U?i_bbu6YrWMWk+4Qyv1#= zQGS8L;WW|V`>^G!503>uOm4ZnAZf}x*z)I5-plT_cKWt%*tCHN)34tfD-Vd9LhJ~$ z&jSm0POOYr0?4n0_(Nbl7U!IgsE-$S1OaeN>)0oL?ccI_dftYR8X-5BZ|TB-^@Cyf zEun)4WnxJ1NB&k!kuw#jA#Q|>L*rC>PdtE#MA(ihP3nRe19;07Gbb!qFpC(9=ebpD z>nQ1&x+jksiBU4CI?=4Ck-~pDDoYdhcRtV=3`CnOV-m#E9jy<8)!pJ7GsRK+CZqOk z9y5}9@VF2`9%L$i1WKUe;K?9Q8EDHg(#{fjLKp<%RAO1oE53}qOfe9V+9neEUE48d zxEfBT!oA7^KsJHr=v~U_MvFO$G+@oR5yA=)MT`MSk!L1|`^6_1P{~$Bap?I>yW3s4qNx`>-Rd03Bt)ROuVDp-S%OyICXM@G2~X2P_$p%!KP9qdOp|9N1&Ux zZ!x%bb)ER0l{dmpf!M$TG#96eG8{Fm9BMBno9CF@4fofidDgJ9E7|-Fdw6u6TP@f8 z350omHez{YXm;Uzd!>&EXfkS1xyT=}S7vVtF~>=v%ikLIt!F^7dST2rUo=c?H(YJibrI(A;&uXuvS<2OwI^;Or|6KrTQY+V;Dr_Sex!@L`3o;-=dec zEC5SzfjH%Jp?wi*kQcf^KU0hx{q9ap>Qjbi100<`XUTKZsjlO7^6d(6V5sSJ*pBnP z`ccz$xV93BPuOV$BUH2^LK0?8Y*$N&`$$0}(0^)QYr`qSIW&_9(xP zoZ&McA%Wu&5;%5}z_HU&yRD%n5I!3TIvt+dcObL6MLe#&@1=O(<5_LB_%-pq6IUrf z0;b^nuik?NhnY8?by&t~!yDMkMqm!t#8015V0EiFoFp<7uCW5NCYB4ES&iJez+n_E zT#5jJt=BI)_o6D+hd_|ahH<=xuAo%N4duj1fooWcAmL#5tBX`A`>CtWe8L!v?rTMEv?mBSQ0K3ZXbw za~#-`bP-QU84UY+o}HnJmKj!$NE=PqKYZ9Xa@vMn2llKLS;`5g72le5N0vX_45cwv z3iQSNC7xM|4U7Qo}Mui_(`{ z92_AN)++&^mD;PrRG5gAJ2RBFWYtz3&f@1wLCCI%wJ#%VX=hLtjQ=ya$#$ZsV-?@4 zQi!1*<cq`vtK0fXqb{aa;M==( z7Y54su~$vMX2Qe43EKD-(?8puBqy^~`^1s(3~?kngTaZ8GKOrsGJprq`;>}xdt_ND zdh@PGDoIYt?ecZcM;{+|yLe7?yRg7P$WbsOQfjyWQDf4E9gNUtkqdlgyV-8HYh>?` zE~Ro_8lA@q*RyMufO$$bw*&w8nA_3hQtckO-KldHq|TYBc8OoBP=<9_NvVdIl*&U& zJ#44gn&E~xeD(Ozn8F=?;-V=mz}7vX{WveO){YUo-J*QTHdcEH_=yb+Rr=bH`70y* ztUXfvo;662FGpmeK2bA-J;ReI7T9S@R<@b-Hdl(t%4)mVuoRq_B^yW8N3zP@qHFI4 zG~p)7?QUQ>mP`rVgu8QrnZ{SdM!UhR7j0W9fEJPuekkU+Mduz~SGDZ++pe)pno5 zc;>0^HydU)-)H95m@$?B<oF>3TiLjMq5-gBiV}f)_WDs*@XA(9D zbqURE<_0MWW^$0?bwrXYK=(DEGNquc6Vu~K!)?fOMKCcW!OC!oX8cxPuJ5HHv$=Z! z7@cZ(w)>)oBQ2s7U~@qPF{|0BE?Qb?!TU(eGqxCa<_4NHnUq?HMSPM<7oV`%c^_mM z;!|#&D~pK!XYN(=F>J0^Ve)X372|ARV}I1}Uhnw+#0RV%C23|nrANoeE(MY6&vaBT zryDivPAB{nE;BqWd$@b97dOmQ^c6+G8m0`Vx^2N{A-um)sa$fljo&MrOJ;>I;B{e>VqLqBgyGWSR2Sb@RjBb_hd5&)8CDz0N-F_!v_0tCA(`j_zzbs~l}}9UF%{_a zRvHR(PspG`q-rtM5_KV>$tI`EhT6oZ84z)uQIf%h9jekR3);a zBLq9D9MGMYdh&{ZYy6_|lg9Y%-D5shh^^RGWgn82C$28^kd>C<+qG%WHjz$I2nbuS zDYBLMRDocD(>*mLSIl$Ec8n}60>Y!Ju4x-^L@Hs(o<+goi)F&B$+Omq-HB)pB$$KA z0qi=-?q-8DR0MXVZ*2QDM~}S!$=+`YKOKI~O}Q5b|DyjW9}y`mWMYgZDvW9?PO;($ zp(;ypikZzeLKKG|a?yobR?-2 zL$GkfouLTK9eDWjjz7UMP$F`)@0=TR<*8{`e)@Azo~1!)c{*_09C7m3YqxI-PTcgb zS>hDMmUKGbofe|U+1a_HM+Jkvwr2ujls-@Sk4a3kml1yUuxq6;jnnY* zrFxeyty{7@1SEtZYZ5(4VwpZyxs(;QkP>gf{S(l{64ptd@RCdOmUZ8V8^i$REvZ_ zXrGl1Q7|})3~aD+?ka*YFABWR}Y7a8_zM00y6Ei}oms zu+&Nwr4hEzI?)#HA^0SdBPrD~?qMK&g;t6zu9Jn4l=}&UqUm& z$2y(-^Kd6_Ba&~F<^vTEd6JMCq0)I3LnXOySqcbGDifZ2?!k3<*YSe5YMm}~^0ORN z*dREp&R(LD9&D{kJfQBvrPgcRHS&J!8D$clWVlKGT_NHRv4mk9%a-x`F%(>r=FFWL zTuwN6`D+_q+T!1{YW8HcGmK+;Ul_~1wD^Sb9aajGs9PjzlA5rzlkkhyWdo~ zxRA3fMKz<4?I;22Lu^f+b+t+h5^d{7(C1)w|7K z4T7!Je)-r_x*R8mL!^K%U-d5Q+>lrG)3h*y9|!33xOk&ZtZ_U-WW?MHPtLt=`!qE+ zuQ(mw(8LXN%%S7lI{7M})Qb{F+lZ|G ze|J(*E#KMlWXd)8<>$D{J*a6QY^jPcl1Tyc_3d~VAij|w<5{>|{OO&~o?o^O=5f!W zxp&l3J|_N}tzxocnh`t3^4R5A^BDt-Kc+R|gPRM$LB)q?B=1uFwtKn+IJLg*&x%9xJta!WD^)jPCX3HBd9j_$or?_qf#R+If#k7>?Y7U?tX}qb z9;iPIbo_zrOOc^&dov7Sx9R3V6Yk=2`yfwGT8qctmU4s-}v~w|M+A3N&I26k&#Bq6^JMF=rJ;ip3x?boK2wp ziX;IM3ff$eSfWRMOPQD7%e!P21?-nA%$AwK7jD(;EY$uiyD+3WvtcQb zOeWNsv~TlPkrLddG3THZA(DL2aN(9Wei#y$b{(YWS*j#+BNFZ)I~9sXx1k%{#7;@f z*tv;V4icHpxDpeoEd`R7i`@}m*=1xpJ>Z(k) zcvPM#E|$OlG9*g>B~C*~PfilOps7lo^3Y13ELX#q;*LIG6+%!DhM)i*qNUn(X?HOI zm#e|#J*F5#%C6EU9TLNI5~lS7Vx}UUU~4OG&_Ukc<`CE%Hk-mbp{Y^63FWvOvhtAr zz4LX53`+GFuIL~951jxIKad`>R&BY57x01v0Ubd+<1e}J5kBQ-rOx7 z;MRyr#9Ov1GLJ4`mf&9kf`}$iLY$^W2?M)CWvtpIsOIGYFnvQ9y}4r#0s;rWvYkLD z+4az=;^B~4V=;a^Ld(ti`5xIZo^i`@UbGdjiW*mp|Sae8RV_z`m? zTs}l14Sj)6j+fVG$OWP3UF_LgJ*6Lf`S1?ExRYch7cSOcO*$w~eLJ-0?RR(lq+C+Q zVR>C}wcYMJ_=Un>X!!;5H)HbGtSb$fjUI8%zSg}5KQ6p1ebyAI2XBymM=dhbc|bMa zL@GJ0_vz*V`IYInXT2XJ+EOha^w_fsTP+W&90uZjw1y@Ih>Q59NgJ_j$y&sd&EMu;(V(b0r_-wyC^gjPFcC zBYL`8{z{WyUMX*r>+SR;dz83Mt`lEgsq(&73%^I0|KKX^=ENlP8oWI3N%J2;Lr!t= zy>m1<{ht>wN$QeBU7vVBOy3h^*^#E>5syz1r{J7_IZ3`OPhnelypZ2ic6zcgq|yiB zNE$m~xgUpa!f34c>7rnj=g^k5dtoi%y;HT(zXdmNB!y|Qe*=3T9KT6q)>UKqO`4rI zd3;cIs*Q0c&goL}J0eXARb7Koyc2lw6}!X*&=+5DKxB;c zxf^<059&0|PPtNj8~=)z$*+9l%8^qYGT9~jP-$Hh(LI#$y z;#$NckxFv!w?TR4H)6!K;%WlN_>J?;gpir)LB5m$+=Aq=g2Gw*x!G#iGSOgxQB zWgrTfZFukeiy@bp zwEsaId_xJ$YiXPLDE6vX6KH z)Ih_FLvg1MyUq0uJX4`KoYdk!|{GeB!`MFGfPmVe(T48_Yv`#eFx&J9Yd(}S0o(S7=Mv+@qnFZ<-wIk6`6oF0(a#qPWgRL2dC>}mS z;UU>7{-KMXklR4Rm{e3qC;ePNeuinf@^8FI z#d_LieFr#lD)2t-b!AsyXK1J5+&|h)GOdWadlYe!)$k#ikz6P&^CiLx8NTB*R?-)s^8c5ZNlySL;OjRFGuhut<0Kn6)xYW^7#~C8BcoA9jalfXQIx zw^$c@#AD)V>x$?|dnm!iR7s$v&amz`w1a=u&0|y_F~3lMIw?WI)1e2S(2j0Ap|}JFsq)V!e_w5V(hfCI*#z&)nDN zOiG$GW!A_=&JwUzt_p}TUH?IDV?4ERg*0iCk=(?*YYO%`VHCJWQAIc6K8Jb$fi#pG zY)6DrV2&r<}TWtal@z7mu zFkH1%)n?yJ1oS=5gYp`W`=&8CH(acdfLF{&u~a|OH${uNE0kOcjP>6^>WhKnx7Hb4 zsAC^HO`LH?8jTAB&o8XoKtnPK57^I-tB@Xj& ziosel3&ifmz|H_H)aoXa0^E}08u5m0RlqIZIvCBNwy4z?&O}TXMU2RFx1q7ML4xl@ zDn#ZmA}9mbx~F^gU8=E1#9hGGQ4@?_G;8oCQUt)CYk6hn^l3DH2_Bd z9zb(t7E)(JDQ2Q9#2A&Sd4dMMfKe%gXW@TOm4+ZSjqQSA%#(QL2|KE5fr98Ok4af* zCWr%`JW;d<6sZ3*ox(jcJtL=2Rx}Hy^9n6Q z*uZIU@I$rf2GKkIilDseT%4nqli!Z`=sBK!(Botu zRFh3IPEI%+661FhEDMNxlIWx)SjTde=_9gd?wcg3fL$ZYCOg>&N43_8R73MX#$#Da8r*-Nl)P%tteu7xZftz=F}#7IPVv%RG9lx4-+bt5h28U zWP~h7^b%k1qj&`wAH9AgCfxd1eq?#r@o3A9D9sTgT*a!bF^jB3Q5Z>t3$8{KMaer+ z`)#D~_%_UTi?NcuMmP5l@A!^$99CF?g+zHl>2 zs#YkzWipcCGIlfuGr3Pb_A6EAqZY(77JV#crLd1GW<~s~78!_WQWfFwA{ZW*&#bg_ z_C%^8*>=VVTu_F!(qng+=}W8}M9H$nW(RrW!{lx|f3aO3F=XWuu^T1^bV9h7Uo+dS zG|@asu3!sgT#q^`R1=69nK4s*sqbS=G-Y`Hd1Vb{u8XK4z%RseQw{RZLsC3X#@ z5_{Jmc5T^-*tK-9Yv}{nwOtCkMi^N8-K?zA%lzRkuxqN~aKe7{WGc_>kQJLk!&l|K zv@L10mP47b^@!Z>g_Mdg|3R;m)0&n=j>WTyYzORkl1H->H#qo5gx zQhUl;s(seHdEK}EP3srTTkqgYtY)#1LR7?qH<))&JNp6ow6yIKl?DVqLcF=qszLqp zST*pYFN~zyJ!mRvcE)4{aWVl}m+_zN2d#UC>{{ zEHxNbA%Dchr0D#^a9`s?56t;iJQT7Xl4CpzFLi%>^Mp6?0bNI)%Y|}&2-B?s)A3S~ z_wQ|gdH>zu^&aWVx=RkZ=HgXfQGN&_-ds0U^KNG^PaY28^w8WICBuo_LbpJaTb;y*w}SSlttHk9guqx41I) zTSvpn(=Mxzh-`px3t>}fR~erTL<>^H!Vv(;m5+3_U8By9lsO!#WRy0=j8YH3NQzu| zNaU!#%$dlwhDJ3<*Y}r+i=Ki4js0g_e`M3s=9Bqb3An;wcd5A0-_v<(YG|IA{11$5 znee?N#BetQb*cP2K6CpjL-ij%N?a=6^5g71hl&K(go?!ERh}RBzr8OgR&3|hP4^3hUP&3kgNF|YEnRisb z$UQ|7AD{YmzWK=yKek+R6}(m&PN`Fv(UbV^WQ6+2V0eaon(A@z&>GcaG|(P-$}u1i z6Xhw%)X6r&#lv>4`Q+e_f9t;h$c1Bkd!lqXr#=6QO!Dpgn^>pEzA-Xrm}SFuwy1`y zRUaBW?U5Pu`Q$+CH=MgTnY(a)#JP+9Upa92P4z43>NcsMLx-zzzdN@%&GtK&7<>@t zHl62C_rbFwJO80roF5h6k*sw!8qYMj3Fqu4+_P?q#jcYR8^wNES@*o$PmF*E0Cuwp zJnSYp7X5OnSSPM_95n!G3{RDB!*PO<$&(eq2&pI_h~PFZYG3{Ngcreh|#^jG2%pU1O(g*$YtH z1>36Q5=Q5$h-sP5R*(-HvWQ#1SF~&niXKI_3Bjl0EURD+_hOSftRD_Kp5m3LSE6_i z91k*X@-*2rnH4$~IUP@VYywEtSha^S7|Jmu(dOY)E?ppVCdo9vEFQj3kRYmjE{#y6 zoXah zJtQA^H)zg>M{OYD)#kBR+qf^XMGdQQPu_5uFloB1offj=#uKQZLZZ6kDg@F|j9PWa z^^n@d?l{l6V`@bcWm6aiU{9MUY;l>mSUm53yy=zN)&3(p-|BiNvNz-_o;-ypnc!trGI!!p2A@+ z1s>r5Oorvpoc!0Hnp4Et_GEQfrjkE%m0tFW5#u2Hdf2^z|3t_C{}Gu*KRTh`by3W( za){SQ!R&~T|2@e`qvYKuvX+f-$pOh?~;o>1w)vsxB%1 zu8XgSslUUbS3+?X#nO%loOO{o_BK_(D1ib-^9KqTMgM8Pfwz#F+Q(r`c-DCJO+wWe zQ+kn_b|?i73HLd2!`on*UPsYo7jY=`#pNE*LJP&Jnc{Z8gV@Ajg&_)yg|v5tWc7wI zn*hi-h|Lm=g*YIa%vR#MNOA>7b&0<5LD4v6N1hxCMRz#EX3;7hxj3TPQx%U~(g2TK zQjAB=zUS;#Cj+zZ1Nvu+ne8;7M76TnKj<^=&WE+HyR4xo#io`BN=Xc*xm9zmUA=-R^JwU;mKf2dtyE@ zCO#Gzf=4Acr{eA_#ga}#6yOtsQc<&OD1Af*iP9gru4_LWWp(@#^w!NwJM5_XC;F<63+xN;5 zaoQ??--G;4%U|0RnjPbJQvP)KoiZJMryZ>H>#mZse~@oeN;2j)4D}I3^8yNd+V;x} zZ5No3*EDhW`(o)n@qgHX4Ns{{{2#G&jJ*4Ob;@)VqJ>>(Kkb~We3Nf$uZU;$I)FT% z`yx-u+pH&9eUW#a!#WP@ICM@L;WOlIhWiJ#PY-nwVEq(cuUDA!Xy(OA&i2n^v`?#m zh`s{l%~b(?c~AxPhZ4|d_#G&KsiC~zX`lOY$o$y4OL_65q(Ic!i=8`xjo^eEQAdOK zp@<3wZ-dokVPGB>MCa6Jm#U7KePq8#U%zP6oNb{r@t}D|_+7agQz26E_#Kb8$ZD&C zLo*@z)^Pcxdv4zR=`)G39U2V-#1yg2x9)%b(b5-e8MXZ8lB78c=FXfof7Ketb!+Af z3%?6tcl2F1{03m6nxbHZQp0WT7zo`NgbvZ?1L3ps$rqn|F}T0EtMiDTMM~w?Q;OoYc(#H$o4}9F<|IAPDvJ z1q4Lke(2E+pOCS3$FpUP_bXPm0yqvPZ{CkRxq%EMWX>F|py>QtMxYflwuVAsREp$7 za21iL;b9vQ~Jc1c_HgT0nogYFycZcXD#UG63CTjs%jjSEQ-$Hyl@5( z+8x6oD_&qf3_@hpx8I16bNNHFe6p9lw^H#4v-m2BrM=`)UMO}eID-*!Rgyqq!!S_> z2Q|BY_I_M%Wr|FvTv01ie0mJ+lx^W=%`~&A%>hQ)W{ZNOlTQ&hK>xj22E{K1vlbazQI=CvDK|;)gBO*Dp)O^?@ub7u{ zv5eidnH{dj!%J5F08&`RV$|zt)9mTiIp%2dM%hxw?H?U2J?=1mF(-pxSTL;#N=hR} z%z;a&#D0#;6)tyxvv~CUxl5K{mLKOV-ov9;li~(vaUCS8Sqf51&J}{t$-zQW@%Ram za-Z1axnjqmTScOu*hMz@ncX4ig2=KZw$dceIp^l|tBBeC+6|`_OvhF&>8-M05=u?3 zbfv$u^QNGAs;9gC-yOp37umbmwF(?X#_Ggcc}S&}nN*(R9T(%HDz>`;6+mb%l6UM~ z`rPZ(fAlP#KYh_$|KwS(gK;PBTZ$*NRIE@4A#^e=>sTzh)o@%H6fa0-#f)B~F-HYCA zu6e^xt*3J;`Bs#}Ks;t_Y^MjIvP%L_(jU-`RW-$m{% zfA3hm-!Jq}u9ice3E7Y4Y4Wb4fFb4u1zL)y^s|FCp+@ngM|vJ9x_+d(-$cXvjBjT7 zou$FW|JCZBs;l>Z)4Ai@&=oJcV~yrmxCegLYHRCi{TE+<`NiUUeT1j~DC-iA$a%O% zNKgM)cd8PI5pcfqeAY?$bVta*r{Xg`moW7R5r~}RWEBpOn>d~n6G{~XeZ_!Z#ld=u zL?6!a+*yXJQ-SSj(BG8yz8m3JCMrUED4P(0vD2rta;2(=kU+`Wm}w~LDCsb6^L7>G z?G#o;rnpzV#fK#?R8GBU;=Jj<3!11Xyzh%VfBe*a1@{3bG7$whD?|Q@y>GEXt24WAkizkZgV!cEzSK-0m-FDZQ%g4O>?c=J>7bxfi z{$GYuvRA5^-Es*Yv>UX?|$;}MNcg9&z;xw zLCAbZUhG+LfqVP(tN(@<;}(j2T_G2#+b%=orip1W?%UrKekDR`ATr)REE2wYf7Z2Y zg7Pg-e%Z9rOeTU2qqf&)p9Sv0taOWE_E#`#>mK`5`yRIpnumB=`#NLDt3I^!w={c< z`IcK1m4egzP0bub!6k96+T_<7-hcb{zvb|VPh~w7dc^z@ee#mwS3wsZbg=0T5%}Mr z3*WGMmzsf7omw?hpHcPS-*E5Qvg4l$tTaMu-^ueXI&bz3R|mUO+^g1Ye&r+ohb^-w zUNHF<>AQ+qrtB^}gBHdNL`F=Pa(UEG>5paXa|_AaQHf1n_^EM&xA}3mP{UJt_wq&i zzvQt)Jf!~G?nzwWa~-|>q-i8FYQA5#Pjj|dLG6%LJi z)m*Zl*j!X`8PON32t($U+wQ{GQSZ1Fj~YW7U(h2phG=tCJg4^IS2Gb&y2->e^pZaZ z467|NRD=R^oR1=2eV`Ulqt9+ctHlRKUWZQ(H5;L;GJcL5*8fqWD8(AB#(_2kEQt@0 z3^sR;nN>IUbqLJTkgB18JUZBP>c#;76BRBTL(02G?JoYt^S8u|rwCuMUBcgZ8!G>w z0;h^^aYts#tZs}pAPkEFG=?cv1w+Q}Xm7MH+#Bu-_qbI*@v`b_r_t3_YxasC@x8Xe zXu!YjY&&gHfDX=vzrDZMY%@VaEqu#kC_js{d}&DPNxWYO&0Y+URo>m zaI0ZK->=mC1cM5e?o4(`9E6FY;xpY|2#Xc~HG>_a9=2???}e+auJB5*f9zG=qM}~M zQ&oXw-3(4AUmUe7H1V8H^s|i@>#4B1pVuQR43T@TK3q@HN8&E7u(oIGkxJv|mJ{2G zXX>(m(LSNg?4gk88@inhQ}hYV;Y4Ey)eR#J#?Pte>XF|Yp8vYL{?@jwCuw0|+}dk8 zOM{U|4ReSa1emwQR}na5*A@n15i0v(uA#hk1$Kl5pYkx<$@b?kN2n zJ)NE<;oNN9BEs7;*kbLRsb&N|=Ygiwa3(iu$o$K7ip+Ua!)e@Uj@{dTXti;xkfIJ8 z)^o2bWQB9+DY80v5&3rSEqW18nPKHpT0FwZx=$ASzSvTouIih8-#q69%eyU-` z9dF4erRWXaTxp2IgN=|?s0x(CvqkDS-So&gkcHp4Cb)6!>svnOJzf2mf{mp?IeCt} z_WV(DuBaTBxFsOI&^?jBwm0c=_A6IbfOum7n319nXm)2-&oH-~PQW7V5`zD=~f zPP)vr7EynexQJi{na4!wF4h-#q8#_6)RH=?afn zxI~{W3m(-usvx@gu)fIdQ%6ULixul;i(IB68x2-DKa$Rmr0R-wGR45DfER|Er*%tNIZ=y3+W$?}UC~9yf8KKGqO@ zv5qTsk!LS=wMi!IUDna-}h=+OVWuh~0~H5Ms3q3;ac>WY^A zzq-Dnn`Wf7zpJOuJUT;v-8k0ln;j4ttS!&AhP!(h^NJmM&JmHmNmMNnIcK3wK&47; zhr8scVi^pY6HW+&X^n=vXf~J$s=umb4%8*(Rh?vdvuj||ASJ@vAJI{fk99a*!fav; zs%`L{6FONHS5m6P5G770E9)M(@C>tbpvRkVooRAp%JrlUdDO6P(M~-#utd9QV&#OK zXY~W0@A>x^;1)kUBwXuoBUWuqJUcKjxf?BG2G4GYTIbqk-z)km!>k{;wBb#&x|GCl zfm!R}DOxRqiPa$+n|W1fhU?%XIsquF$2k{f7vc8j*v+xCo@&gUNR_x7m!?WAyu-d7a2FhgZ7Tb*yp%h*q_g-Y@v% zQM*maMQitL9rlRTd``D;LH4%mV5FK^bJga?M|1)p&FYldLQ?odod8ISIyFg`kT?f4 zdD+?5ppnHts|)v!--%Q9hW@w+^&eUQz z2feM$QAes>9yC1mblv(;RWc|Su%u@#ANWorf#7(oihR83ILeO@uMHn`n%Gss$?O%` zcJIJ`f?O%MNw=#FnRSu=g#MoXv930nNQwF}q)r=+PO6P&R!d6Ca|x@N71k>Ij$gv; zeuWnjEskA*Z*3zzoBJY%NjCO3dMVKp7AUKv|48LXIJ^ei{LtN*35pawTTt$}@Cqfrd~g_t$1mF##!(I$K?`jh$}b@3Y< znLEvFWKD9!<(q+}1XJbcfpca#$_%4_u1>oR)kn1&57SCxA=N6OapF}(7ow%n_V!=J z&}@qrE6nIok&j?;x0*ITlNrr=T^E?rYv|& z&kUT}tA9>T=17?*c2wRW#{k?2?9l(X!7bi2$aY9>h<+{mo8I?EAg1HlJl5ozkR;X=nLor z5{DruXJG9k8U3BnMN)Bp_b=7Wc3Z#hV7QOY*0;&k&Y@NckqA4D7tLdEkK%i--3Y`) zyScwpxZZic(~NNL3B9Z=N3XN0?56&H$|b3Eh;}1fa6-p$uQLs-%zk}FDk38 zJ-Au9dem@`mMnUm*1Uv*|U20KR)|xD^c9{#TqpJ^OJZW6?ui;rGBsSgv5`) z6_%<*g2EYre~4y)=YUK1gdY!JS@M=9) z8G8hByd>7cJbVv8Cc`Q@p~q0(TrrZqzsCyR{9(hY9q92Z6if8QFbYAv7z+{t@m_lq z97j3POy5O;)w&qNW0Zt*Q2A<%pNj>LqjVXBM2`Wyrcz(2{}~-!v>002?Yg;4?k;4; zVN+$}G8gCTe*~Y==bU4P)bi0Ar(}JF9%(lVZb!cNIBg4c!hGrq^s2-^7H(9los2t! zfI<81{AgRW(f8ZHW%_^V;@N1H{H*WSFAEql)2vqC^0;Kaa{+ih&A6Mn@IurvLV}m; z1pCbE`|mSmOQeP&7s}M%M1c2dr;2o4T%&$CMa6a0J~UWw-jn8(Lyjc`#$;hX&A3vw zCkKRESIdW=FA}!8qaxj@=xkN*C}I7`3U&)#`!C*WkyU1BD{j|WbKz_Uu#F*0#BkZ| z`W80aWjt%4mF9E-4J(a{^aW`6=)@WiIz2M5fv$P;xl+XogIuX{|{eIwwfLcSZ!5-Xrh>; zTTR0@^FY5az}Vi>Fpkj0a(%+X+5d;44;aK?6I-I&RR+0$BL`po@uW`?;@2t|6K~TM zdX&ATTRg&gJZx5=%3Pu2n=KFyc8PEoMHrphqTvb+Q`Ks_E+GDm`WJ1!PKjYr%at&f z7lutAl)mOy;dIf?5|5_CU&dfwpxHk~vqf8-*<|fr&fmyx4(xqlm>FL}xG0ELg>{rv zDb1W{Wh|h$6!9;)p094y>>LI5tE0e9ADPvCe6;f{D0e6DMXfTNZFc#%(Zec~^>n}p z0|@481&}S&v%(7K6yJ`J6cslH$c1&3nju|=x0*zfGIsnM1L7zejh1P+`e?$6Ld9^D zoKsP=Qh8Ca{eMs+`qf55FQ+F@5IbX*@_ii@rDZ%*U}&UQX#z1_!f;n{jxjEtp-1A_ zO;0d6%+6PI(PNm+F@pm=%sWE|r_-lYyd#D;_XTJlq#>Ya>}LD1oD_7KZebHOrUOaA@_h8 zKew`#Lwwz8s^ zZgzvSXI_;Xu5#Jw6Y0aZ4qqO8ew|yq`m*?)IPViY;e#fJeI-VCyQvoiZm=^?q1 z2`PT1KQ&m$*m@9xvcZ>TxX(3)R2=7#>eJ=fhWXHdfO={m4FT_8_>y0KYuNyshW)4^ z)(?C`ZD6Ta>ftsV*Mt47Y%HpDEUJNCPaV(W3BU7y-B0;(20d}n33r1OGu-u<)NOKg zzZkruDC>PpadL&@gruF-!&e0Wlg5!GXPg&QB!rjpIDB_1`z7byNY%dxWM+|RzIr9Mh zr@zT?qZjv1)+5QsyBV%F+VT{0>0rNb_BJvj@x={ZEIf3Zek}&r@jiwNY-4jQYm)4d za7X`dP`)_U{I(vUxzuT9vcx?#93i@SE$jIwP+q})ocU1S)=9PWQ}mA(_pxoQOzdnn+JNJTxmVrarQtD z@abBYN;sV~&;@^;YT;HHCv_Rk-0&8E6AWu;raF>cuOUdP46}(t&-rgVLt}VxyQ%ZB zhCD3OqJbXrV>KRVN&`LQKh#hdLo#DMv_fS?IWq;SY>Bb9fZr(uVXtNix>WdJf0NoWm=H|dOu~$To_Ftc6IWSA)3c|cj zv$vM#H`_M%i!E=h8h~)}l!4=SVj~bfIM~B!VF=vi$2-LaAzXUAQ~xNq^N)A>{%$rh z+1js_W{15UN*8?RUo;mCG{XqEdX3U4RZ_x2X966xcV4gbvNUXva(#0oM;+m?(K;sU z(_-hW436^1`HY=3Qw^;}y>^+?|6Q~`8m`sFvi`5f8AIx0>j-FVgSw*0m^n>v>+|fx zwDi2rz;teA`|FY2j7jX3-xHGGxZVj4dHfnZReq@$j%y&mz)4#?9FEG=NcmYgl5CV zgB_i$7W9d|4c7{qSqQjyPwWm!ht{LUW!f+MW7(*776rEZ@h{*@s8(yEH(J~;%)M|+ zvOK)`(XN4(SH%OdB{C%Oc(+(1BcrFC&{Ll7tQ2p<2_2>843i!|*iXwu3y!^dco%jm z?Kx9fF1&j?A(G=9qxw3p->&ZO5I*co0O{@TVDEVIgsyDIjzD`-C?R&VfjY z-QZj}ylik15EMF0n`fhJdkw_V6lc%zCJQXwYM#useV|2FIgj9K8E6n`ck5&`wceu4 zrto%aCleaw-f)+o<~ch?lf51N9(^CXI=)J$ow_O80 zTpbt^>K#Uo4)k#?bDFNzA${w=j(deMq_%&bD7Nck7k5|nH?m9M^Pth=+Vhsa6-ka6 zrwqI1*Oa43bUKHZeBr!U1Xcfery)-%egi$^U)3AM)*0v_UsPjZ*@HdA>31{Rj`iHE z%VNV5r&he@5~1C#&vF{kkF=F)c-T)%c|lcrq%hhzu$dy>J0H>`Y^G^W6RILJwYf@P z66r>CbC}I*e~9owxR+xjty=h1IO-y817a52fos_LhV-f?);X3~LzO;U7CKS|IkNhp z|BtpefRCa$AHR3+Ztsq}5Thm-bDO&;K>`Gbf)E206cmIgQ4mm~qC|-hB^8t?L1IZY z3QCkHC{$^of;A#l6e?6uP*72*QouqB3KkR;D#+~JY%cG2_L30L{{FxB|9M}QXL2_? zH#_^xGtWHp%rnnJ;~H|VqlVhpVDMc5FO6ok8fWaNcy~P*=x2(;Q@Qyuzf+UFLXL2V zCtBpx)sWJV!*}Ix?huhuc%^z-w%Rnh6AlcTzC=&svQ3$$2T5d$iU^Hf zjB^Cd5BOPj6I=L&P0U~10Y&QH*ekOm3Y%8z4^e(;<~UOvXwFI~I_J zYq%MmVih(^#5L-6bj76R?@h`~HCC8iI97XzJ;oJwy(6ZsH+?JEH9IDkIkOGZa(+oB z0hgyZU+1&%yggI->~;$GHU0Gp=M7m6V^szQ7HwAiHzzesm9*Z8YrSDtX_auQw*p^% zas(o5rKmUkOktliI<>?=z<+(Crf0Fv z_ms0GUSZceGS`{we&5=;y)vy`RzjJHe72A7NS%}@TP&BEzWHSc2Q0VQ^EMnN)M_Gb z;soLVqE*x9R?~6|pJ1)I%pw2S#)e{N@-~gr@)9M_(4g-|7B!z5cjBjp{-3N_kyh#9ko`I0`8~%`+xjLM7*((z#Cn*ib<_>S{LEt=PmISXX+yzhf71c zF=s$eSd3mPp~yK?lgEbiXil3J%T(2YZ11YC*!O;$h$ER2+cN;;E6q_1Sp=6WYIF!Ms-^VoLzWimmLm;{AQN=}E)mMVDLE zS&S0#B;8%t%9;t%h}N-jRm0A;DRY@KhA7>)X%s;TY6G%)bEWkjNsAH;WodLQzs5>y zMJr_~2Q4?^qU`EGgKbxdtY6y9;kgL~{E*D$iG3Z0z3JJ)<}us6Snc~zek2?_p4#YX z*12IgrOqRBIz~$q9WtGboin`?I2%3A?#}5%cUj<~%nzCkhfoo*l!nzdRGQI^>?fGb z>c8B;<(c0E`eZg)CaH7MrZ>yN6^5fFM3H2&rKnCXd&{h~4+rFYGwNwE$?%*|+YL1j zv0ewS@xjVhYn3{MfyWQ0o107+IBOiu+r$85V}cO$7(O_b4eFdSCI|F@#ZrZ8#70x> zOA~3Cd6{CMBKa(4WXB9;k12|r{THkieAe^q@p7K*Y}D5*!EhaW4}-tWqS&GS7!k3> zQ>Gkcwqb*`a%5nri9Nk@MEul{#Ws;JC8r~dO~v+shV=L$b%&!JAc9n>pNrYDG7QNK;J~%OuZ^}V0WtweQ#P+lVJTQ%VnKU9GCcSaW$O>c} zN*#kl*=-3Niyblj)t5tYCIM!gH&s>%Y+G7A&FBdAqMSxLhVoKXjdoFWDCfyI_i)S_ zs2u!R{zNaTnm1EuQG7d{xrfdEY+TJ8!A(kEwu5eD4rZJ55awFjF^6*)gxX=-Wh#lI zVJ(VSHGZ*hsT#}1Hn?gkqDCUEu`LWLof2cC%f<#&?E37M-34p?!^-R~>SH*=bW z0kxml%oGxP0__YLWGJ`di zRIz8qsk=0hs>oLvWvEVFA^R6*+Uv!wEnIyHR)z7zym;F5?l2B}dHj24%Jh}T-ux_J zFEK^8Rzw^l!0YEPDSc72TN5EGk$(gp|91!MI`gOPtqQC4gpYibFJgO3X~NwE&3~}O zsO1z=tJ0zvtCxQ$-FS3hOJU|5_}|V%>Ec$U)r9BchALissyLei!TcQ*uQNqOtKzYG z1lt_}iCtYqOX=w8=FO+!lRpcv&1(hJ`l>9}&mkS* zH>1fd6E7B>o)t}2O(MxWx!NfTpKbEP$?mvV+q$#?J|U?nyQwRh%IHPl6R?ncWb!m-SLtVW+x;}EAI$+ z5oH}zCj^eKT14AZjPI29?9a{EtBEdXGFegai)4ZQJ10}w{LT9;5W^y)TMI*t4RAW= zAbr!!QrXru4c-xK$7;;z_Lj0(^&~K^f$>(QVOk2~R=Oz%wiHH;a?p;rmEEeW>1DJt zd{yD*eFkNr$kK{jo6>z-mo~B;+#|!uik7M|ja6eBt`i;Is_^ON_^rK)x5CRAX5gnI zh~TE!1nj}gQG}t~CDCOVd9$m69l5xWDXTh`h2aavLxY>{uf(vX!m&MXx-YWIyFVno7u+5enFM9N;!Al)C=v2XjB!ewq_ssZ6^W+@$EjzQxBJZk9`$N-8 zP@1wboW^KRm3K8;8Fo+16vd`|s>ST1P06XF5FZAPD=WKQ$^acIX*M1Fj!cTR9H3|^ zR)UfK=w>7RM5$KKY%Uh-lXxsA6`CH~RP=P?$>!pwr=khvEH7hy6Af+p1=cuz?Np{&XF3F8stC|WyCkytDB3Vg>X)%G~_U8Cgh9H9s7CjN*v-8LW$1VAseGHtHkc> zxQ&W!i}D)Q}W=Y$b!Dm+PYA~CiCKL8lwX2~)O=HSPt zj#EPH57>ufdBa$Q>S_*_IT8wXjp$O8a3VjH6;1azovH+9-?pP^;!zB<@cQ_THDYMk z{)C^t?-NfyPrTZ9U-!rN#MX=Rl%R=S9uqI*h#j+!vZp4ptv_JRDSrx|-E-=5UjpG|GHUb})oX0v5 z^I+R$_qTGQ#iBeuxWU7@xk6Fa&=()fllA)8y~H)~|7jivK&?8~?~oj(x;O>wbKU8S;64 zv=(EnW!5gSnI8pH#5(2BAmOFeJ0hXkWR0e*d=FpQV!30TYrC4plWClDhS`poY{sH3 zLyJ>J{mnLi{kg|#0*H)hsw3LN^ba8z%*PEu^sh5B*QVkYlN z6yr>c8AO&{-E2CH{N2X%e=sr7Fw7KvTD_NY5lpst+Kl#T^)jPP|BsIb@Bl87TNPGf zqL+Mu&%orS(wK36(G}KCzQM-?-QmdCKzDo#4Feg==yxg>Y zXfBDG`7Niu&GIHCzKB;$??)2@%j7LedWp_=>bOxps_tPw?LGNu;8OX7V^SC+!XfVx z{nV6wTITiW^G;(}VuV^v>u?*VqUg=0Ol~Rb?6#@~jif;>r8zl3kR>X%E(3R`9Uido zF0O7|B_C`#KVZ>$PTk@|uyaF3v!^Gg0~7@}}m2_1i?B{5jrwKynlz zQSC|jX!9t>dy`Y)<)*y1W$b#VSY)F_o5{+hy>+9qxb~)4tXf&9+uQ6sbtk!%YAYcH zHmjX{InfeM&n&{g5cd#BEGwgx7#wm4D6NNM&$ctO;ns$zGnHoqdSt$nX@8ek0Pf6` zu7-+|02Xj6`{_9GSd^A@F!Il6v+20l|N4Ap_NlXE|C^J6zC+Q$G@AoC)y;>(Xn8I+ z_q$XU?KpMxOZbT=V~Tl+nRVqR!g5npB`6!5?{(4No56F(WeRK}gNd=hX^bPyF>LLdP3zNU!bdY3U1A12 zV_TOVVES*Y4J6{aomRSO$+XX|=0UAjOciW7k(IcQ17we*!ERMT>@s8holKtCa=J~e zFA^HyU$Pu!&qe7QC2Ojc|Ca`&n31Yea;P+8C(mq$b~w1bS{=irea;|xb{ZW^Os4s?;roa1OQKV+G1r!;M%aU81b3J#Q+F?2u8 z*0Rmo95Sb%czu*hco4(vCC)Li zhDQ_Yvz7y7^7BN7>CGdcLjY}&*nC4~b1^vKdXCxIav6r+%|)H#W}W3|NH@Ld7@BxP zeN{IaHampVa>q_}zAJ6<<|{x3?!B9|#WBvQaGbTU$)Bjw$~(rc_z`MQ`j5%8ut)RO z7}gu+Nk@9G&U_zbY%_ARVj3GCMRrOnv*)~f@xmIfPMAF>4r;_7ZhpU3$JUy=C{e_| zP&NLvb8XRgRLG~M8rCP?p!K;oVcKdahz`Dwm-CJfHRCcY{!F{lU zmT4!^XxPCSzo5~lSi)()V4~unTyN82eaEIH>~GP?K*MVDr}9c?H-l~IXqCewqovIy zs?f(SGfxgYtwc0i4aU}|xIAch9M&$RB1yIYmNg3KeC)@u#7oGPnM04Lhj(gt;Suyy-RHHZB@IwF?G zoSHbLS1IZ+>{BN_tz!)-&ByfAE>^t26pyKQIQ_gIo;;&Ywkjk4Wm^7{GfIdn%@~D<)$ccCX!Y~`E0g>Xv?Zh1bl6&C0BvYWZmPT9rQNICoO$~RA~ z_m7#@l?^vK)v%uR*HR5W;JtF6Da)qK;t-XmPS(znd)WHo>ps&nU(TL|{)^pQBETNt zA&b=?Ni6wFZ^Oe)PfyU0okGN;rs$RGNTDpHG3-lnS7Q>}EX!N&mOqSD2>Ukb?&#bW;C!xTpn%7A^*)Z2KG3iOW6M-e&Wx(L-$(|RIt3NP+znx!u0SdVkg zvEjKy;}ZAf%g*f6a#t28cHOk#PVjEr8K#=PJ(pvWZG8&vi64dk@lIkQ`@H<(hlpU-d^vd=jpxmetMBUM!!QZ)ywq<^%?q1 z{V{!+{<^+OU!(8PkLnGsKCatb(_FJ%b6wB5R=BphcDufE9dv!?I_gewr@Ak8=esX= z4|ET44|k7ok8|JUp6q_uUG1Ljp5vbDUg2Kn-sIlu{-^tp`?$NoEP+@ zx!N<_bF1fW&m_dk=Yk@SgC-d~RPGUt3?HuiW>l z?_J*x-?zS~U-u{b&-Z8fJNhs7=ld`BU+pjQkMiH*zsq0dzu#Z!f7bt+{{#OH{~`a$ zHoi8gZL->QZPTkw|29{*DQt5?o15F*(Pl!M``WzSCLZV)cqmX0^Ra_%gPns{2X6^Z z3O*353C;;F2rdh*3Vsm$G`K7Hui$sVpMrLhFDWG{BPlznTT<_&UnO0YRG2g(>87OH zlU65fOp3L=pzT#{uWvi0?bB^vX}i4b`)xmO`&HZjv~5WCC#NQ7C3i`_EO}t^u;h`+ zW0NN&-All$OaD#!s`T&9Kl}WC=TAI;{`u?A z|1RU4jLR~{W;~j)G-Ff7p->>yB~%!?JM>uSkD(2ruR_v%JM)^%UE!Od{ok@XWIvd_vBOy%Ztk$4!^Vq(7Y)1UnTx*YnAUMr z$N3#U&q>L-E@y1cl$@HJg*hv7Hs6}g-I^}mN>{Q(8-cFBns_V40(>t9$ z?X<7c@y_1P=XcKS+^_Quo$u`YKHZBNLEVySe}SS4b#m2TyWMg7E*-lA`q$@HMC z*ez@4$O^yQhtEV}a^S}{_c)PSVyV95wD=((!BMl?i=xAyESUEuL6&?orw*SnF4VjG zVv!w*9ioiPQw>>psv&l*Rl+)NDeWf~Y#!~OY853in8MjFN$#GRJoLCsVSskWOHO)3 zB&k4vhgG~8`lJU=GPS9)@0-J9N&1Y%Tc_;~(Vw|E(XQIh?cVQQbNs~npYGi^0{lCO z_m4Pv`P&^dO#wnbc;3ESjzABtyhhj-QLSUsX=UQp}# zLOGLh0mn-e8cQKVUTGj+QLS724dhhw@UBc~Wn3Gj%BJ=ZS`WXtM)F zbHJ~nyy%J`LBpw|y!U=^q2bOJE2ct`-I2I`1ed~>?h+z7?LoIuMduKR{X6Ls7ZZqm z@bw*=1F~S2Zr^BFB)SGhnH_rXwO#UxmO)3&I!2;!oX{yCZ!c-^l zlL+-ZLWRkxHiEqq7*a!$D4t9rR?kS#TErXWM9rYMk=4QcS;2N4AcWaJ82@?U#QP$W zfn&_}$K@;G-$-zf{N24*TwU~l%$ON@k|2%HEh~w3P4iIDE+Zn{9;^Q}crE9&436-p z#S0l#b?~)CEFm1k_?_|UQ{&C_ZH5)f^=#(jYakd+f4q!me@$oNPmQcBxk9;~uEx{w zd|3odU@V1a-MXQM$Q{3RP{$02Bvom46)OV4S;KMA*oQ$OYbN_1$rK}yt&@E56Ad+K zIQq?jjjsnuxtJ+klnI_-?KwCs8H<#igV+5L#Kq|eF^q+`ViQh`t#(IuA6D^}c6aI6 zrH_hn?&)*zFm$DSYhj6cN~_4Uu?|Iq}xb@M2#$<2s`2M|6nAT%I(Fh15uHmr1x6l+tmvr=YpWJUa z9^jJ(8DMCGNI#wt1j`j*vl6Gx&NgMx#=kKkTL*G!Vv#kL*Hxa(n$^{+r_AWesowY& zLKYaZnr5e65M)W`x~99TLcGuBfV?GN7sI|kI3GHEX04q z6fPAdX>|LKdL6wvEWI}mxL5`=WC@;(Sg~>q1SPos!@K-nGSkKk8#6rIei-47Lo$_E z7eqx9+9YGmrga2R&|dAL++wGyaj!+-irb+&ubr?S^*AfTL)(kP$Yb_K> zFgUNBL!$_TR>50UsJB|F_+^O~^G0@pS9{}xz*VlQn+s6Z&PA~0r@?6q)=vV*Md99c zk;OTAe_-UjyQ(+FoJ)~fIHW17s4=2FV8YZx(?z?W7n16p0#^l_;N`_61) z=xpZ7W-8exknVow1uj`RSS!p79^JkB=;1!QJ9g>auVcsEeU3(g4`tpF=&hU~tTZ`0 z>{<3I5;5_%nN%yq&OjtMO$;=qO&T+GSg6nB*Ea>D?EV)T4f|mB`+PyPOG-}~Y}O%* zgMl>V{4waWP;d~RZl$aY!mv`pL}QdG2m@HeGjXgOM@WSca#tvb&lXIZ;fk@%W^}C~ zsu}2hv6`5G%fi9^!?(6?KWb2qa8M?KICz7^VRS@WNL;ZEV>MD|a`aftHbha-+VfFn z@H5C=Nk1ycOsTA}Qz8S1GLF~kzG6NEl!p^!oN7B>x+=4J-G0OHuo(4wk$zA-8d^XU zLAz(eh_ttT>tFfXs{JA1|6~B6Ne1;%gx=>1k;??_ErApDRC@_QtDKp8HM5R~m#w#_ zL>l@h=D`YYY`e$8QS&|og@LfLS}G`#dm=V*c;L;ranE6nsv&xH4iS9SjJ1sxvVcJT z{o$eerxSZ5Ds0%@kNNEYy zvs0eQ49X-#@-7LHJjG#eiM_2L=5TCnLkg^i9L=2Cw8KnAEm%x%Huih5&1u1SO0-V& zR|qP4i8%Dkd}T!G+v-Ci$mNaE*2z3Nsf4wU3eHw}@XPwO?}z184@hr;{7q;vUhakV z$$sHEx^s}s4qxgkzUSJKJ|X=1?{?;f|6A*;N96*Xr`QEJoeJg$5w^JmV?+{kJuYgj;CtmzF9UdFy`PTzuv0p zXAz%=FaR*J6UZO6h9PfRnfwjAL}50bg(id z3Z}*IJEIPRz;hvE44(2bquC99u`EcS^FeY%q#=t~Z$${&1Sphw1BeJPA4+B42LBN4 zR;bB)AEckK{(zO8z`{s<@vwZsdav(oDzZW$EYe1Vt`pjV@LaEa;F!2cW{9^#9|Yt) zc{!nY-nt_a`}bGIZeO!TLf$X?bs$!H_+NhcVhAxRq20hnyHMn`LRFkq`age1 znD-mRGogmuhGmXhSPWA*yw_rj!q{0N^E>wLL5RdcV>he7tzvXYJV*4^yXE5fk@#&Y z&?+&NWjzb|eT0|UYz+=?@L8u3GJUQ3v>m0pZ_qIGGO9ozVJd?N#-0%v29&$-bgIVD;L}=JAkJ8P_i7claQmMEl`!a9ZqT)#@=|wDv-~@0!5g#9Z1t99{8Pns^7vx@Yh1 zQk&d+?!3w2sj!J@>sCFsLB+GkA)ZBjM4&`5WY1MwL343v)26wL*F|m>5DN<54`ld2SDoaj@*ke&Yo=E#Is{#fE?uflIca$8vAhXFw zaWM7`Gu*S8@o$*!h_z)J)rd)z4Rtoq%1PWQh0#|d9EpYXJL(^=*fo`CF_m^!$TkTo zQvp7gIi$Y5dqmU{yn9(6k={=hW+1kgAv~;L1e76eR}#pCsI3PU!w@U1!jQ$<6zm@$ zEED19?eyajSptDA`9h`~75R)FSg#TrXDbSn<*$c>(Sa-?WbK=(*Q}BZk>|7egTXSf zma9mX+5N*Zk0|VpkWq76SXM=QLVR!f#C6cBA>I*hJ3pF_C}S%Z`b1{2?fL3Q9M|+> zGFZeYmG2A#Ia*mRs?R5MVN+Tb}^Gsh0@AQbHYLPU*OP2aY$_5 z4;QM95D&7pH=nl9OWCY~^QM8irLVvF>S2~1TU7vIZA>4T+Ht_^2U$i`cxCZi7?WR= zDB@0KIWrokXq>Z=Rec6bo-r}9RFoT_tEeH@I|vpKOxy1}I`8P4j6=UPcgscL8Pacv zq=Qq3j~YHrrau;$BL^B{(WJEAqXrNh#~k&=UY6l7Z0xL)Kxi%0m4qHMD5lG^MGtxZ zuCTb}D`KczDhe|!+$9szWuWb${iX7V3g8L)`lIhE2hXWsw~+C|ljX`VeN6Cp#jM9N zHc-kkMUQm^mJ(L&2rj6V$&ZL)4|JQvQ?t2R{-QL=R{82LYgoJ9i#S+>dX4!Qk|7}R zSmd1)=KJ{!*?cB=c<51r;iVtlG_3cqas6P%nws?e1j>zW_o=1%6r`plNa*Vii-D|O zUV^{Kx;eBaNmhke@o6G==dcLVd%7X>53|NZi4#K8wT;k@S&^XVe~AdlUu_JFi?-}l ziq#AV6fG)bzJ*rwS5Z3=4O3_W(#qJKsxxKE(B86`2;p*yHCgMTHy3t&vC zA3Sh!PsEz~1`*>TmLx#-i+E+jQK^dYa`uhQk?7u2k?78OuQ?Lkjd}8HHQWZGP+G|J zx=`AXMJk?SZKf}CkSMkL$}GbgA*T>?58YtaAX#eVOVdEm$`V?4dW-$ZgGe^mLLWva zgNaxd6&O6F-PU#Mwr<)qYS5rzqlOI{wQg%T`Q(B9Cw51y;OkvWsx}gO>sdc?B9f^ z*dB&KKW7JFC&Pdpg#IX%QWUY$?i3<_1-(`hblRVoqFcaJ1(C|hbEPA0_J*&afFxZ&HeB8A3vtGkOR*W)&hD`oWq+ZPeopoxpSdUU~ zsn05fne1c5M`&K6vX+N~TiIY=MU1pftYNHc#Wh60&V4e1k4Pn{Y~~d$Yjrs26GP-# z2MJCzOt$SL&kujgdwstCy+23hOqg3%cQ2~ia;wJ6lr|ead(2K@D@KE4rZ7xb97aTD zHFBGhjh^+&9>p@Vr)|UKA;%1qMe`yr`ow^D2&Ci}FJ=(rwpi4_ zQX9qw(=HgwhZ&U{Gd66R z$yB`s#xao4Qz((P%N6k=-)(f^fJyR3H4szxij9#dyCrxE!+}MeTJg#Jhi2J*nihVa znbDIlJ0$|)u10&w$1%!SikLEszs4~Zm@$nR4i~XRttJ#%Z+6B+YI_6iYwAH*c0Ss9 z7157{Z8gI`AB?Pqlk|tuMnu%woP}ozL{bFrN~hnagySVjA$^yUujk`StF&QJ!&;0kX1>EDsUTT(eT6eOcuBiDd4Nrik@~+Z|ySkKuVRoS`__ zkHj#uke(U7N&98qPFXzFFV|0m#%4=91JjAYaiZ@UU(&7BcB-|ap(@g+0e7I)0c2s^HBGOCIDT3rIfV6vES$XfZ;b6+`2&%zJ5KkA7Tzmbk&&<0k9DB$2{Ohah-Y2HjVV=GvLYK7@a7t8P@4i(%V|h6K zu5ZTOw^xq}F$Y3mOO!%l3jrAsh0{g_Av9?&m5J&<`%g`~v6vr8zNc)Wx*M~SxyRRc^zdm9}M06DQ zvWq8)-D(_$W&CQLEaFI#{MYyLMNuG!MxY_$3a7@Z(yV117hcIc6B1|NdByQ?!%t?c z(dZyDuY*0-;2k{g#Q^JvbKcl_VK{mcbAIEv41XkVluu+NryUhJ#!3#31vG%UCu6-B3H8f%!jh$nB(*70R>Vga;wro(bO+_`tS#VXn z#%otv{^79BO0jS^O-W)>-)%_GDCX8ASrLL1%-uvVo8vpmPPHgqia_wX*t}J+!dZ`= zuRo(|5xC0kI3_#;M&#lBbD^?&!0gSi8!YpO%fiXwjx*$P`>ayMBYQH_u1D|~DYGt@k*+8@$6fM?JS#MG_{?#`Bd^jca~I565ZbV2qRfxP zH~V5`(fMg|OM4oyO!mzFK}3dxqh6oL+VcHT@vD$navaKC5(!2(wqu4TPB^XVaghki zqBRlG?Zbb;>C6l`En~_~3FEaqmWPaOdaN|DP3cAbgLtuY$)Add+~$oU7NtqEV;?4a zI}Z&yrHhaDktVW>8O!oPXQrb@%R_4Mh{`aFdX!?^!Ig3)V(xZu(qoG_?}xBF?~v#` zL<|j)S0{>4_o%WpO||r-mi}C+&9yK^4jnYE3mu{nQEzgX%|s66~#>V0D6AT~>rj)#ZKd_$BD`UC=* zk|FDT@|rcs2H8DPT=yI!FOfqtINEHdbk3hzdR5qZKgxQ*CO(U(KaTRNT=g*$b%lILj$~S?e=H*A&mjzX zzIZy6+|Jq(-EPpx!cU;(5gE*CtUB${Y_wF$wRRF3{v!4&QjYxVrR9GM+wV7QFi^=< zDW=hr$|}S|1eqQv>*pZGJthZ0w@-&;eS2uLTuG)$tLVVhR%Hl{>K62=nPl?2O4+Z;#qUDWVz!dm)@jUm*VK;DI!Bf-w+F)DfH!`NOQ^2?UgY~PRGQrF^VW*6K<7E4-FkN zbK=m*I%J=@^In~^IJ9Ba#J`r-Vj3bJab-TotR=Q z9Xe+2(2&gTK1vq%h{z2MSFnf60dgP8s1>Gkd*!UvXvjv0Eg8`=xuT(r^{seQzG8K~ zHEjPztgwFLv+`Hd%vY?j%_Zcg@>i_T7APk?97bJhZA)V%p2S+bgdXa@Q&fjzHL(6F zrJN~2gC*;XhE#J+tlne(>{USg@qgZF?9B zdzgR<#cHI%&Y4{@(KH?M%0p%h7Za(O?W|fKy9?=i1+;LD_r)@!;Xh(Ubf@pNjRr3D z5tI=d*GKGHrt(@J%c(li*X|px^jeE?K@qK(WxX8t7(qGAE9bvW`S|NKh*gj%sDbrB-BVxnH;^bh~+S^5?wb9xjKM~XIN9IJL zMbRZ}*O{@|vNHA;U&9p*bp~tY%|2$Tfmko~wNvS_!N_6YRKH2GOkzOD!4xtP<|0{9v-pKFdL_-B_Wha&pwVn@91#A`3 z43Uyhha5p2vJG**O3qKHL-H0lOZ**~wM_3kOtKhTxf|1MRv4vqPJ=y`Ec(bgGpjE==BRj(; zH2#R}E$@_4)~RToY_~s>nuR>(bM2Jf{y%z5N+qf01>L~p5fpEG)MD>4VybW1ZOT{eq$}xqa(8mO18ap zQ{fzueZHtZAU;y6tUB;iZ~9rHD&rRH zR!kP`^B((VazhzQH`e64)DbbdXsKGPjC+6(=pZL51zG>hRdZ(QGG# zhdg27bm9cp5thhDQ6ixvyVJnH0FzQRJB`9i9_Gq#Qa~gE{Oe0$GC+UhL7NuP* zmmF!02n834EMxB76P}?bI?I$iN!O3-KA_2TtLOfM3DYgd1e5W5$^tXkZr`W7zCHBm z<-IPureC+N*L=Af9Sn=(JVc54TuQ9PJ_M7FL6~%G-P@wE4*HnY>p<^nt~z+>b{6h( z;6Z-dQz>2YjvGBhI#{rom1 zR3vJG%FYPUXLGaYjvitqvTQn!8I3_sHVfCFn7`(WxeKr}Ec4BrH2$&4?8!JGl-I0# zZ074>Vk-v^Zr!=};GnJDd-ogEz4y+3dn3V54PlX7ryQ;#lT3<%Ig z=Fp?n7=JvLE-QBWEaHocZPCJ|k=KGFULU)4>x#GE-*DHeL4(HMHar~cy&+-X;_QVF zS9{?hdw#+?waIjLSujIX4}$(T%8f&z?`l~AUPo9PdD1}C!Gxqn%Z;C=eSF;pg|AS4 zny`zjiIu0BCovkqMW8nsoeSYB4zV@7BzlN1%5VoOS~yQBn-;m)6{-+z&HJ{{3Vd`h z0^DFQ#e;$r^@q{nAc~YS;oCv6(7ufL8eXwn#0{nQWjZS6szI>eFWnAhT~a|;_(e+ixKE^RQlCUhaK>=3SiRSW zsykJbTI+*joK1>}Ge?EmcYIY8M}lE{VH5=p)Z95U5)2*uvlEf`dcyS%BO)&vkU+^a zukdA>KjEW*DD<(lMtp5k9C}~Si8$>9s16gLI%qsEr}zjg{1D51?={C%9(D&J7us>4RnTJSs;A!{XQ8 zpVoaVE)Gh6k%N74E!CKCZq8pmYMk;RO7AZ064nD(WCp9D)Q|*Db$-c-} zC&a%wZ*l?$d3>3zZpR0!jnb;%X=e$+f@3h3Bk0t(0`4Hi`5;E?t|V zO(lJhOXon#G}>6HRq?r6`z`5X+H<7ywHHYjX-i38(f&-jQhSSZwe}wAMlN0ZkW1G# zYoC&C7?-ZawMI=>|46;Mmo%V* zAN?%-9MV)B{OIX=I;p9fq+vZwnx$uvX6xCco%BwmUG%P`-Ss@u9y(ak`{;d0FW146 zK1jcobeLX5dV@ZkbfgZhIHYq6=~(@C(sBAY(mQo9=DN&PK-$N3jplX@b&Vi>!1Vy> zgRTcP4+nRqara5rQ>1fTwd6nTdYb%aT=V!m-!-4l&%0jW^8(ibJ}-1F=JPVwE0q7U z3rxD+aJ@m!TducA-*LS|nZLUJO8&d9clo^DwVw2S*Zbsr>iU#2e{=nf&%0b-lJ0fw zB|YpqOnS_9jJrR&1gYf$tF8vOS981DxZ7yDJHwqpdZD{LX}&w3w7|`Kx%;{MkzVD# ziu7vt)s!FXhKk(RxQqBa+&!Fhq;!e4gW;!>{JL=aTcB`#Ex6aDyNBBKIQl|KR=u z=^x#HBr?00kHC*nw zoX`C{{m8$6M$+_QiKRFM2z&r=NW{^|m0rQ@Do_Um+@0ri%7d+tE z^E=P)xcj2#MLxge0q36Idw$R7C7vaufAai^oHsr1@cFME=+Lvy1Li#+c|PLvr=Cwq zcX)P??)L1a=6`zr$>(o9-%{p#&-di~;Q4`^W1gSLLGQ)qsG(_Y!)C3}-x>ch4w8OrK+ndHUU;B4>}7m;tG$0Aec$^NY20UMy3glJCQb20 zNH6fg4}HCT(6g_v4{ZCc@PT39ARle^ZSid({mi$Gbi40s(r^5;;5LdgYw%w_@V~;< z*Yzvc<*t6N{;n%rSGoqc2D+|tUF{m=8tl4;5zp9WOwV=Ixt?{+QzP2-JJ*Y@mt4Ph z{lT@^^(Le5N7r%J3D-}qlP=-b+`8N4cDp^iw%0w>eXaXCcaeLv`*x1+FPq|kMbEs0&x@o>EZoVo@>o(wq5u{h&a0ThL!wN~SyJ95i z4a2S_9dW}@QcY`YWG+>G=hEC0@4W9`E%lz;@1w?hCf+kq>+IYi;gF|OLh~^1din0s ze9XRWwA87K<}CUBb+4wrRq%Fr^V?hRaOlCM1^O_zz&AWp{k?ZbL2f~=FX^1M1rO(6 znSW)$*Xr_Jmw$tAtnZ0FF5ilRl7bT7hXp16JfJ{*E11CbRKZjJ!TDv*ca^6u=eGr4 z`ycl2D)>5oC08tQ6-@BQ3nsJ~ec5l?yxeAcpjTl2WjCuU|AxSya8>(VL3P22f)n|L z`GrAG+abY>U{*nO@S=k1l&X}ff?NCe3vMmAHCP-hR)72W`}iqySFk$xT*2mo&B5)# zf2sU}3RNy?Y}+B~Then$%aXn>IMJ4xRNd+~ZHMH)+jJevKi0PBvck&>xm(fp0j}A} zu7bd2rDvs{b$LPHtPy8DQ4rwiFQhEu2;|yxpExIWuIJn*&Rw1Qe(JWga9T}z-*$m^ zhYFrLFZsOL>3z?OrT0z0wdtx!uStI)edGCof)nTGo`3WCOEQm~|L+VfV5*qeDI>+O6^QEB4h-ET--Ewq=QJ4KaTm(@GepeW+jeAU0|f&#cIoGU;*w>AT{6*dDj`%L}~ z1=VLl9~U&&1U&QBmglOG@KnL({IdM9z+J#IP4`uqTWR}=W?(G5+X7IZbHy$zblO}& zdKz5zo6AahkHBU1iE&c!a6z?`r}BTJ?l|pNBkqLrTkfkCs@AAH^_kI*d;%v>b3hWD zA(`XdJ}p&C(}Kw0=~`Q)@C@xN&D64x&$G3T-06h;eZJNm2|N>y)dR`=QY|0ZyZ|Y@ zgCm9KB83lvI}Oo>Q*NX-3Mu_2Z7g#79b5yn60U)c6n>R9foqUf#x+>G7m55D?SAbc zZ7A~hbnSX%@ZVC$V;nEPNt>-br4=KI&(m(xp4VQ`Zg*tyameD!k>yt)k^fqI6PbLn z_O|v8wYK3|B0ejJ%UrrFve-KD#<#kxl~v?aPv4{9$Xk)Nf#s;41y*XtMQ7i(*gvwLcr z^J|D!+CMlR|ETs){c-(q?JIq@{*?B$UaQw?-{{ZibG3i#&+5->hx7&d0_}VK zclsjj2YrdYMEgY z{agKro}vGspJWwc>9*d{1wrY#F8=9VUF;_7-CTZG2fe$ildH3St?L%oE&4FyT;o!` z$hge7U7u`>Gsfu)jXRAy_1_uejq&=6$U_tKmy9xFvcAZ8z?h~lGo~9g`f}q5;|cv8 zW419{Ut>IFJf*KSYK>a`uf|;CkNUgDQe&z9H{%uK75#JLRij@2!q{&7L;t(+qj5st zW1KXi`d&kNJ^FsFtzO&sqyB8;4t-wZetmx9a{c+n1Nw`NH|uXTex&bgd`;g^-eEo; zX{^^zG%hmI8t;bohcF&yLp@IdPia;EZ)$OB@Mxut+w>=S)>~RWb^nMou)48If1I4z zz>|$TY0(aSLE}668;$oBoVe_&*5O>?CK=K~o)2rz+6APhu+EZ_p*LZCg64RmnU z%tLseXB$~N9Wf3Uq7Y;V>N$6w$*Z&sN0T-sRW zd9|_1NQ+CY9eky;_C(_@Fn$B0-PE52Z@&XeFHy^KF!eU@7rw6n{z~3DzV8RV0}k{3 z2!9(Jce%929WI@}p2i(UnwH~W^EmB!jrJS|-}T^WDlN^?SJD0>a%_b`8tG#2yhF+6(=&n|WujrFeg z8gJIl)oyF7)&AJHO{?d5Pc|+BC%d4;|3HcV;Yknhltnz{657;@S}&&7xlJ`bt^d%t zhW2#;U)!kt9W4lLd;8OX+Xm=<3;18_S_#oi?o3 zUgdLrV|f#WeM~L=sbwwgIpB%PqBV9euVby z;|Ys+!VpHt|4&bGp5UR4Yk4b$VKqYc!F0BPv1h?(TMZi23V~~Z>w%HLDBkgKqJ)tP zea!{_04xE%I3uzeg#|(^aBO}w=n)HfQNu1T8=?kqXTde&=I&A7z_*nMgunk z#lUo62Ji@Q5@^s&uMW7W^K{Hz4_%G~MgfPxgzACZ#@Z&#)q=TNFjosko^8z2{@l2a z5-Y&(F5cniJy7nHI!q5VmHNeA0GISdbKfOep!%=**G?c0XWojI8!J6MQyCZ zmEM9|>}1sKXFMNn+zGYrGTI@@=vo~;*M_!ytiQ)NdY>`80r-&5oA|q#ar6;zv~edC z*Q!nY;()>cl2!!H^#bGXNqFY7@T&R1^T3PRaK`5@#%DeKIvuV!)8R}BuC#;ptf4(S z;YzAaH#25-=-<=kqm8dMam9MqMOu!lqt?ll19Sp9Yn^F#XJj;ACAD{ znd7E2$4zI>ZrwYHH&XM*YqV5J4X@FXt)w%b~jE#(9lT8|lFLKn4&3avMvH{`|cX7zj*gTm$V) zFcvkw!)#Fs&nq?l*f`f%3cLcm+E{38=iUxr7w{$bf8=+P_a4AlZKHh_-^X}uqaEOl z4*}mnP3iFkdIqz0h`%P%R%T?E<{FXPhK|PFQQyWAcyar_}dxi z0^|ZS;WE`gLSpT&Kf~v_fTEX#6cu7@_W*lufxWl%j~mnUEx>2MHs;m80iOe3P}g>( z+`sd82Y+`qwr8C8V4U}0ocExY`-AOLuw4qaOTl(2*e(UzrC_@hY?p%VQm|bLwoAcw zDcCLr+ofQ;lsWCÌ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

Nzaal2C<{yG=cwh27S6-Zuc;FJz7L)#mlIN7 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 J#$$c?e*uM+N2>q; literal 0 HcmV?d00001 diff --git a/sampler/src/main/resources/assets/fonts/index.css b/sampler/src/main/resources/assets/fonts/index.css new file mode 100755 index 0000000..5139784 --- /dev/null +++ b/sampler/src/main/resources/assets/fonts/index.css @@ -0,0 +1,30 @@ +/* + * Note that each font-family have to be unique. That's because unlike web browsers + * OpenJFX CSS parser doesn't support `font-weight` and `font-style` attributes + * in the `@font-face` at-rule. It just silently ignores them. So, the font variant + * can only be expressed via font name. OpenJFX always uses font transformation, + * even when corresponding font variant provided explicitly. + * + * See, CSS Reference guide: + * https://openjfx.io/javadoc/17/javafx.graphics/javafx/scene/doc-files/cssref.html + * > Although the parser will parse the syntax, all @font‑face descriptors + * > are ignored except for the src descriptor. The src descriptor is expected + * > to be a . The format hint is ignored. + */ + +@font-face { + font-family: "Inter UI Regular"; + src: url('Inter/InterUI-Regular.otf'); +} +@font-face { + font-family: "Inter UI Medium"; + src: url('Inter/InterUI-Medium.otf'); +} +@font-face { + font-family: "Inter UI Bold"; + src: url('Inter/InterUI-Bold.otf'); +} +@font-face { + font-family: "Inter UI Italic"; + src: url('Inter/InterUI-Italic.otf'); +} diff --git a/sampler/src/main/resources/assets/highlightjs/highlight.min.js b/sampler/src/main/resources/assets/highlightjs/highlight.min.js new file mode 100644 index 0000000..d2220d1 --- /dev/null +++ b/sampler/src/main/resources/assets/highlightjs/highlight.min.js @@ -0,0 +1,340 @@ +/*! + Highlight.js v11.5.1 (git: b8f233c8e2) + (c) 2006-2022 Ivan Sagalaev and other contributors + License: BSD-3-Clause + */ +var hljs=function(){"use strict";var e={exports:{}};function t(e){ +return e instanceof Map?e.clear=e.delete=e.set=()=>{ +throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((n=>{var i=e[n] +;"object"!=typeof i||Object.isFrozen(i)||t(i)})),e} +e.exports=t,e.exports.default=t;var n=e.exports;class i{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function r(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function s(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] +;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const o=e=>!!e.kind +;class a{constructor(e,t){ +this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ +this.buffer+=r(e)}openNode(e){if(!o(e))return;let t=e.kind +;t=e.sublanguage?"language-"+t:((e,{prefix:t})=>{if(e.includes(".")){ +const n=e.split(".") +;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ") +}return`${t}${e}`})(t,{prefix:this.classPrefix}),this.span(t)}closeNode(e){ +o(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}class c{constructor(){this.rootNode={ +children:[]},this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const t={kind:e,children:[]} +;this.add(t),this.stack.push(t)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ +return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), +t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +c._collapse(e)})))}}class l extends c{constructor(e){super(),this.options=e} +addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} +addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root +;n.kind=t,n.sublanguage=!0,this.add(n)}toHTML(){ +return new a(this,this.options).value()}finalize(){return!0}}function g(e){ +return e?"string"==typeof e?e:e.source:null}function d(e){return f("(?=",e,")")} +function u(e){return f("(?:",e,")*")}function h(e){return f("(?:",e,")?")} +function f(...e){return e.map((e=>g(e))).join("")}function p(...e){const t=(e=>{ +const t=e[e.length-1] +;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{} +})(e);return"("+(t.capture?"":"?:")+e.map((e=>g(e))).join("|")+")"} +function b(e){return RegExp(e.toString()+"|").exec("").length-1} +const m=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ +;function E(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n +;let i=g(e),r="";for(;i.length>0;){const e=m.exec(i);if(!e){r+=i;break} +r+=i.substring(0,e.index), +i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?r+="\\"+(Number(e[1])+t):(r+=e[0], +"("===e[0]&&n++)}return r})).map((e=>`(${e})`)).join(t)} +const x="[a-zA-Z]\\w*",w="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",_="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",k="\\b(0b[01]+)",v={ +begin:"\\\\[\\s\\S]",relevance:0},O={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[v]},N={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[v]},M=(e,t,n={})=>{const i=s({scope:"comment",begin:e,end:t, +contains:[]},n);i.contains.push({scope:"doctag", +begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", +end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) +;const r=p("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) +;return i.contains.push({begin:f(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i +},S=M("//","$"),R=M("/\\*","\\*/"),j=M("#","$");var A=Object.freeze({ +__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:x,UNDERSCORE_IDENT_RE:w, +NUMBER_RE:y,C_NUMBER_RE:_,BINARY_NUMBER_RE:k, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const t=/^#![ ]*\// +;return e.binary&&(e.begin=f(t,/.*\b/,e.binary,/\b.*/)),s({scope:"meta",begin:t, +end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)}, +BACKSLASH_ESCAPE:v,APOS_STRING_MODE:O,QUOTE_STRING_MODE:N,PHRASAL_WORDS_MODE:{ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},COMMENT:M,C_LINE_COMMENT_MODE:S,C_BLOCK_COMMENT_MODE:R,HASH_COMMENT_MODE:j, +NUMBER_MODE:{scope:"number",begin:y,relevance:0},C_NUMBER_MODE:{scope:"number", +begin:_,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:k,relevance:0}, +REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//, +end:/\/[gimuy]*/,illegal:/\n/,contains:[v,{begin:/\[/,end:/\]/,relevance:0, +contains:[v]}]}]},TITLE_MODE:{scope:"title",begin:x,relevance:0}, +UNDERSCORE_TITLE_MODE:{scope:"title",begin:w,relevance:0},METHOD_GUARD:{ +begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ +t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function I(e,t){ +"."===e.input[e.index-1]&&t.ignoreMatch()}function T(e,t){ +void 0!==e.className&&(e.scope=e.className,delete e.className)}function L(e,t){ +t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=I,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function B(e,t){ +Array.isArray(e.illegal)&&(e.illegal=p(...e.illegal))}function D(e,t){ +if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function H(e,t){ +void 0===e.relevance&&(e.relevance=1)}const P=(e,t)=>{if(!e.beforeMatch)return +;if(e.starts)throw Error("beforeMatch cannot be used with starts") +;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t] +})),e.keywords=n.keywords,e.begin=f(n.beforeMatch,d(n.begin)),e.starts={ +relevance:0,contains:[Object.assign(n,{endsParent:!0})] +},e.relevance=0,delete n.beforeMatch +},C=["of","and","for","in","not","or","if","then","parent","list","value"] +;function $(e,t,n="keyword"){const i=Object.create(null) +;return"string"==typeof e?r(n,e.split(" ")):Array.isArray(e)?r(n,e):Object.keys(e).forEach((n=>{ +Object.assign(i,$(e[n],t,n))})),i;function r(e,n){ +t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") +;i[n[0]]=[e,U(n[0],n[1])]}))}}function U(e,t){ +return t?Number(t):(e=>C.includes(e.toLowerCase()))(e)?0:1}const z={},K=e=>{ +console.error(e)},W=(e,...t)=>{console.log("WARN: "+e,...t)},X=(e,t)=>{ +z[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),z[`${e}/${t}`]=!0) +},G=Error();function Z(e,t,{key:n}){let i=0;const r=e[n],s={},o={} +;for(let e=1;e<=t.length;e++)o[e+i]=r[e],s[e+i]=!0,i+=b(t[e-1]) +;e[n]=o,e[n]._emit=s,e[n]._multi=!0}function F(e){(e=>{ +e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, +delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ +_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope +}),(e=>{if(Array.isArray(e.begin)){ +if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), +G +;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), +G;Z(e,e.begin,{key:"beginScope"}),e.begin=E(e.begin,{joinWith:""})}})(e),(e=>{ +if(Array.isArray(e.end)){ +if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), +G +;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), +G;Z(e,e.end,{key:"endScope"}),e.end=E(e.end,{joinWith:""})}})(e)}function V(e){ +function t(t,n){ +return RegExp(g(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":"")) +}class n{constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,t){ +t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), +this.matchAt+=b(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(E(e,{joinWith:"|" +}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex +;const t=this.matcherRe.exec(e);if(!t)return null +;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] +;return t.splice(0,n),Object.assign(t,i)}}class i{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n +;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), +t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ +this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ +const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex +;let n=t.exec(e) +;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ +const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} +return n&&(this.regexIndex+=n.position+1, +this.regexIndex===this.count&&this.considerAll()),n}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=s(e.classNameAliases||{}),function n(r,o){const a=r +;if(r.isCompiled)return a +;[T,D,F,P].forEach((e=>e(r,o))),e.compilerExtensions.forEach((e=>e(r,o))), +r.__beforeBegin=null,[L,B,H].forEach((e=>e(r,o))),r.isCompiled=!0;let c=null +;return"object"==typeof r.keywords&&r.keywords.$pattern&&(r.keywords=Object.assign({},r.keywords), +c=r.keywords.$pattern, +delete r.keywords.$pattern),c=c||/\w+/,r.keywords&&(r.keywords=$(r.keywords,e.case_insensitive)), +a.keywordPatternRe=t(c,!0), +o&&(r.begin||(r.begin=/\B|\b/),a.beginRe=t(a.begin),r.end||r.endsWithParent||(r.end=/\B|\b/), +r.end&&(a.endRe=t(a.end)), +a.terminatorEnd=g(a.end)||"",r.endsWithParent&&o.terminatorEnd&&(a.terminatorEnd+=(r.end?"|":"")+o.terminatorEnd)), +r.illegal&&(a.illegalRe=t(r.illegal)), +r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>s(e,{ +variants:null},t)))),e.cachedVariants?e.cachedVariants:q(e)?s(e,{ +starts:e.starts?s(e.starts):null +}):Object.isFrozen(e)?s(e):e))("self"===e?r:e)))),r.contains.forEach((e=>{n(e,a) +})),r.starts&&n(r.starts,o),a.matcher=(e=>{const t=new i +;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(a),a}(e)}function q(e){ +return!!e&&(e.endsWithParent||q(e.starts))}class J extends Error{ +constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}} +const Y=r,Q=s,ee=Symbol("nomatch");var te=(e=>{ +const t=Object.create(null),r=Object.create(null),s=[];let o=!0 +;const a="Could not find the language '{}', did you forget to load/include a language module?",c={ +disableAutodetect:!0,name:"Plain text",contains:[]};let g={ +ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +cssSelector:"pre code",languages:null,__emitter:l};function b(e){ +return g.noHighlightRe.test(e)}function m(e,t,n){let i="",r="" +;"object"==typeof t?(i=e, +n=t.ignoreIllegals,r=t.language):(X("10.7.0","highlight(lang, code, ...args) has been deprecated."), +X("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +r=e,i=t),void 0===n&&(n=!0);const s={code:i,language:r};N("before:highlight",s) +;const o=s.result?s.result:E(s.language,s.code,n) +;return o.code=s.code,N("after:highlight",o),o}function E(e,n,r,s){ +const c=Object.create(null);function l(){if(!O.keywords)return void M.addText(S) +;let e=0;O.keywordPatternRe.lastIndex=0;let t=O.keywordPatternRe.exec(S),n="" +;for(;t;){n+=S.substring(e,t.index) +;const r=y.case_insensitive?t[0].toLowerCase():t[0],s=(i=r,O.keywords[i]);if(s){ +const[e,i]=s +;if(M.addText(n),n="",c[r]=(c[r]||0)+1,c[r]<=7&&(R+=i),e.startsWith("_"))n+=t[0];else{ +const n=y.classNameAliases[e]||e;M.addKeyword(t[0],n)}}else n+=t[0] +;e=O.keywordPatternRe.lastIndex,t=O.keywordPatternRe.exec(S)}var i +;n+=S.substr(e),M.addText(n)}function d(){null!=O.subLanguage?(()=>{ +if(""===S)return;let e=null;if("string"==typeof O.subLanguage){ +if(!t[O.subLanguage])return void M.addText(S) +;e=E(O.subLanguage,S,!0,N[O.subLanguage]),N[O.subLanguage]=e._top +}else e=x(S,O.subLanguage.length?O.subLanguage:null) +;O.relevance>0&&(R+=e.relevance),M.addSublanguage(e._emitter,e.language) +})():l(),S=""}function u(e,t){let n=1;const i=t.length-1;for(;n<=i;){ +if(!e._emit[n]){n++;continue}const i=y.classNameAliases[e[n]]||e[n],r=t[n] +;i?M.addKeyword(r,i):(S=r,l(),S=""),n++}}function h(e,t){ +return e.scope&&"string"==typeof e.scope&&M.openNode(y.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(M.addKeyword(S,y.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +S=""):e.beginScope._multi&&(u(e.beginScope,t),S="")),O=Object.create(e,{parent:{ +value:O}}),O}function f(e,t,n){let r=((e,t)=>{const n=e&&e.exec(t) +;return n&&0===n.index})(e.endRe,n);if(r){if(e["on:end"]){const n=new i(e) +;e["on:end"](t,n),n.isMatchIgnored&&(r=!1)}if(r){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return f(e.parent,t,n)}function p(e){ +return 0===O.matcher.regexIndex?(S+=e[0],1):(I=!0,0)}function b(e){ +const t=e[0],i=n.substr(e.index),r=f(O,e,i);if(!r)return ee;const s=O +;O.endScope&&O.endScope._wrap?(d(), +M.addKeyword(t,O.endScope._wrap)):O.endScope&&O.endScope._multi?(d(), +u(O.endScope,e)):s.skip?S+=t:(s.returnEnd||s.excludeEnd||(S+=t), +d(),s.excludeEnd&&(S=t));do{ +O.scope&&M.closeNode(),O.skip||O.subLanguage||(R+=O.relevance),O=O.parent +}while(O!==r.parent);return r.starts&&h(r.starts,e),s.returnEnd?0:t.length} +let m={};function w(t,s){const a=s&&s[0];if(S+=t,null==a)return d(),0 +;if("begin"===m.type&&"end"===s.type&&m.index===s.index&&""===a){ +if(S+=n.slice(s.index,s.index+1),!o){const t=Error(`0 width match regex (${e})`) +;throw t.languageName=e,t.badRule=m.rule,t}return 1} +if(m=s,"begin"===s.type)return(e=>{ +const t=e[0],n=e.rule,r=new i(n),s=[n.__beforeBegin,n["on:begin"]] +;for(const n of s)if(n&&(n(e,r),r.isMatchIgnored))return p(t) +;return n.skip?S+=t:(n.excludeBegin&&(S+=t), +d(),n.returnBegin||n.excludeBegin||(S=t)),h(n,e),n.returnBegin?0:t.length})(s) +;if("illegal"===s.type&&!r){ +const e=Error('Illegal lexeme "'+a+'" for mode "'+(O.scope||"")+'"') +;throw e.mode=O,e}if("end"===s.type){const e=b(s);if(e!==ee)return e} +if("illegal"===s.type&&""===a)return 1 +;if(A>1e5&&A>3*s.index)throw Error("potential infinite loop, way more iterations than matches") +;return S+=a,a.length}const y=k(e) +;if(!y)throw K(a.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const _=V(y);let v="",O=s||_;const N={},M=new g.__emitter(g);(()=>{const e=[] +;for(let t=O;t!==y;t=t.parent)t.scope&&e.unshift(t.scope) +;e.forEach((e=>M.openNode(e)))})();let S="",R=0,j=0,A=0,I=!1;try{ +for(O.matcher.considerAll();;){ +A++,I?I=!1:O.matcher.considerAll(),O.matcher.lastIndex=j +;const e=O.matcher.exec(n);if(!e)break;const t=w(n.substring(j,e.index),e) +;j=e.index+t}return w(n.substr(j)),M.closeAllNodes(),M.finalize(),v=M.toHTML(),{ +language:e,value:v,relevance:R,illegal:!1,_emitter:M,_top:O}}catch(t){ +if(t.message&&t.message.includes("Illegal"))return{language:e,value:Y(n), +illegal:!0,relevance:0,_illegalBy:{message:t.message,index:j, +context:n.slice(j-100,j+100),mode:t.mode,resultSoFar:v},_emitter:M};if(o)return{ +language:e,value:Y(n),illegal:!1,relevance:0,errorRaised:t,_emitter:M,_top:O} +;throw t}}function x(e,n){n=n||g.languages||Object.keys(t);const i=(e=>{ +const t={value:Y(e),illegal:!1,relevance:0,_top:c,_emitter:new g.__emitter(g)} +;return t._emitter.addText(e),t})(e),r=n.filter(k).filter(O).map((t=>E(t,e,!1))) +;r.unshift(i);const s=r.sort(((e,t)=>{ +if(e.relevance!==t.relevance)return t.relevance-e.relevance +;if(e.language&&t.language){if(k(e.language).supersetOf===t.language)return 1 +;if(k(t.language).supersetOf===e.language)return-1}return 0})),[o,a]=s,l=o +;return l.secondBest=a,l}function w(e){let t=null;const n=(e=>{ +let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"" +;const n=g.languageDetectRe.exec(t);if(n){const t=k(n[1]) +;return t||(W(a.replace("{}",n[1])), +W("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"} +return t.split(/\s+/).find((e=>b(e)||k(e)))})(e);if(b(n))return +;if(N("before:highlightElement",{el:e,language:n +}),e.children.length>0&&(g.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), +console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), +console.warn("The element with unescaped HTML:"), +console.warn(e)),g.throwUnescapedHTML))throw new J("One of your code blocks includes unescaped HTML.",e.innerHTML) +;t=e;const i=t.textContent,s=n?m(i,{language:n,ignoreIllegals:!0}):x(i) +;e.innerHTML=s.value,((e,t,n)=>{const i=t&&r[t]||n +;e.classList.add("hljs"),e.classList.add("language-"+i) +})(e,n,s.language),e.result={language:s.language,re:s.relevance, +relevance:s.relevance},s.secondBest&&(e.secondBest={ +language:s.secondBest.language,relevance:s.secondBest.relevance +}),N("after:highlightElement",{el:e,result:s,text:i})}let y=!1;function _(){ +"loading"!==document.readyState?document.querySelectorAll(g.cssSelector).forEach(w):y=!0 +}function k(e){return e=(e||"").toLowerCase(),t[e]||t[r[e]]} +function v(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +r[e.toLowerCase()]=t}))}function O(e){const t=k(e) +;return t&&!t.disableAutodetect}function N(e,t){const n=e;s.forEach((e=>{ +e[n]&&e[n](t)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +y&&_()}),!1),Object.assign(e,{highlight:m,highlightAuto:x,highlightAll:_, +highlightElement:w, +highlightBlock:e=>(X("10.7.0","highlightBlock will be removed entirely in v12.0"), +X("10.7.0","Please use highlightElement now."),w(e)),configure:e=>{g=Q(g,e)}, +initHighlighting:()=>{ +_(),X("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +_(),X("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(n,i)=>{let r=null;try{r=i(e)}catch(e){ +if(K("Language definition for '{}' could not be registered.".replace("{}",n)), +!o)throw e;K(e),r=c} +r.name||(r.name=n),t[n]=r,r.rawDefinition=i.bind(null,e),r.aliases&&v(r.aliases,{ +languageName:n})},unregisterLanguage:e=>{delete t[e] +;for(const t of Object.keys(r))r[t]===e&&delete r[t]}, +listLanguages:()=>Object.keys(t),getLanguage:k,registerAliases:v, +autoDetection:O,inherit:Q,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ +e["before:highlightBlock"](Object.assign({block:t.el},t)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ +e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),s.push(e)} +}),e.debugMode=()=>{o=!1},e.safeMode=()=>{o=!0 +},e.versionString="11.5.1",e.regex={concat:f,lookahead:d,either:p,optional:h, +anyNumberOfTimes:u};for(const e in A)"object"==typeof A[e]&&n(A[e]) +;return Object.assign(e,A),e})({});return te}() +;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);/*! `java` grammar compiled for Highlight.js 11.5.1 */ +(()=>{var e=(()=>{"use strict" +;var e="\\.([0-9](_*[0-9])*)",a="[0-9a-fA-F](_*[0-9a-fA-F])*",n={ +className:"number",variants:[{ +begin:`(\\b([0-9](_*[0-9])*)((${e})|\\.)?|(${e}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:`\\b([0-9](_*[0-9])*)((${e})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${e})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ +begin:`\\b0[xX]((${a})\\.?|(${a})?\\.(${a}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` +},{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${a})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};function s(e,a,n){return-1===n?"":e.replace(a,(t=>s(e,a,n-1)))} +return e=>{ +const a=e.regex,t="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",i=t+s("(?:<"+t+"~~~(?:\\s*,\\s*"+t+"~~~)*>)?",/~~~/g,2),r={ +keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed"], +literal:["false","true","null"], +type:["char","boolean","long","float","int","byte","short","double"], +built_in:["super","this"]},l={className:"meta",begin:"@"+t,contains:[{ +begin:/\(/,end:/\)/,contains:["self"]}]},c={className:"params",begin:/\(/, +end:/\)/,keywords:r,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0} +;return{name:"Java",aliases:["jsp"],keywords:r,illegal:/<\/|#/, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, +relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ +begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/, +className:"string",contains:[e.BACKSLASH_ESCAPE] +},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ +match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,t],className:{ +1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{ +begin:[a.concat(/(?!else)/,t),/\s+/,t,/\s+/,/=/],className:{1:"type", +3:"variable",5:"operator"}},{begin:[/record/,/\s+/,t],className:{1:"keyword", +3:"title.class"},contains:[c,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"new throw return else",relevance:0},{ +begin:["(?:"+i+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{ +2:"title.function"},keywords:r,contains:[{className:"params",begin:/\(/, +end:/\)/,keywords:r,relevance:0, +contains:[l,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,n,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},n,l]}}})() +;hljs.registerLanguage("java",e)})(); \ No newline at end of file diff --git a/sampler/src/main/resources/assets/styles/empty.css b/sampler/src/main/resources/assets/styles/empty.css new file mode 100644 index 0000000..4d8db7d --- /dev/null +++ b/sampler/src/main/resources/assets/styles/empty.css @@ -0,0 +1 @@ +/* This is dummy file to clear user agent stylesheet. */ diff --git a/sampler/src/main/resources/assets/styles/index.css b/sampler/src/main/resources/assets/styles/index.css new file mode 100755 index 0000000..8574e3c --- /dev/null +++ b/sampler/src/main/resources/assets/styles/index.css @@ -0,0 +1,84 @@ +/** SPDX-License-Identifier: MIT */ + +.root { + -fx-font-family: "Inter"; +} + +#sidebar { + -fx-padding: 0 0 12px 0; + -fx-background-color: -color-bg-inset; + -fx-border-color: -color-border-default; + -fx-border-width: 0 1px 0 0; +} +#sidebar #search-form { + -fx-padding: 12px; + -fx-border-color: -color-border-muted; + -fx-border-width: 0 0 1px 0; +} +#sidebar .nav-menu { + -fx-padding: 0 6px 0 6px; +} +#sidebar .nav-menu > .caption { + -fx-padding: 10px 0 10px 6px; + -fx-font-weight: bold; + -fx-text-fill: -color-fg-muted; +} +#sidebar .nav-menu > .nav-link { + -fx-padding: 6px 12px 6px 12px; +} +#sidebar .nav-menu > .nav-link:hover { + -fx-background-color: -color-accent-muted; + -fx-background-radius: 6px; +} +#sidebar .nav-menu > .nav-link:selected { + -fx-text-fill: -color-accent-fg; + -fx-font-weight: bold; +} +#sidebar .nav-menu > .nav-link > .tag { + -fx-background-color: -color-accent-emphasis; + -fx-text-fill: -color-fg-emphasis; + -fx-padding: 2px; + -fx-background-radius: 4px; +} + +.page > .header { + -fx-padding: 10px 20px 14px 20px; + -fx-spacing: 10px; +} +.page > .stack > .scroll-pane { + -fx-background-color: -color-bg-default; +} +/* wrapper is used to center the content and also guarantees some minimum paddings via min-width */ +.page > .stack > .scroll-pane > .viewport > * > .wrapper { + -fx-min-width: 880px; + -fx-alignment: TOP_CENTER; +} +.page > .stack > .scroll-pane > .viewport > * > .wrapper > .user-content { + -fx-padding: 40px 0 40px 0; + -fx-spacing: 40px; + -fx-max-width: 800px; +} +.page > .stack > .wrapper { + -fx-background-color: -color-bg-default; + -fx-alignment: TOP_CENTER; +} +.page > .stack > .wrapper > .code-viewer { + -fx-background-color: transparent; + -fx-padding: 0px 0px 20px 20px; + -fx-max-width: 1000px; +} +.page > .stack > .wrapper > .code-viewer > .web-view { + -fx-background-color: transparent; +} + +.sample-block { + -fx-spacing: 1em; +} +.sample-block>.title { + -fx-font-weight: bold; +} + +.bordered { + -fx-border-width: 1px; + -fx-border-color: -color-border-muted; +} diff --git a/sampler/src/main/resources/images/20_min_adventure.jpg b/sampler/src/main/resources/images/20_min_adventure.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cce3a6350f7b55950371eeef2230c18cdfbac774 GIT binary patch literal 40339 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 I)c-8}4?tdJwg3PC literal 0 HcmV?d00001 diff --git a/sampler/src/package-scripts/app-image.xml b/sampler/src/package-scripts/app-image.xml new file mode 100755 index 0000000..02ee1ac --- /dev/null +++ b/sampler/src/package-scripts/app-image.xml @@ -0,0 +1,20 @@ + + + + assembly + + ${app.build.compressionAlg} + + false + + + + ${build.package.appImageDir}/${app.name} + / + false + + + + \ No newline at end of file diff --git a/sampler/src/package-scripts/args-app-image.txt b/sampler/src/package-scripts/args-app-image.txt new file mode 100644 index 0000000..7f0be24 --- /dev/null +++ b/sampler/src/package-scripts/args-app-image.txt @@ -0,0 +1,5 @@ +--type app-image +--module "${app.module}/${app.launcher}" +--module-path "${build.dependenciesDir}" +--runtime-image "${build.package.runtimeImageDir}" +--dest "${build.package.appImageDir}" diff --git a/sampler/src/package-scripts/args-base.txt b/sampler/src/package-scripts/args-base.txt new file mode 100755 index 0000000..96576ca --- /dev/null +++ b/sampler/src/package-scripts/args-base.txt @@ -0,0 +1,5 @@ +--name "${app.name}" +--icon "${app.icon}" +--app-version "${app.version}" +--temp "${build.package.tempDir}" +--verbose \ No newline at end of file diff --git a/sampler/src/package-scripts/build.properties b/sampler/src/package-scripts/build.properties new file mode 100755 index 0000000..01db3fc --- /dev/null +++ b/sampler/src/package-scripts/build.properties @@ -0,0 +1 @@ +artifactName=${build.artifactName} diff --git a/styles/Gruntfile.js b/styles/Gruntfile.js new file mode 100755 index 0000000..7b8d158 --- /dev/null +++ b/styles/Gruntfile.js @@ -0,0 +1,29 @@ +module.exports = function (grunt) { + const SASS_COMPILER = require('sass'); + const CSS_OUTPUT_DIR = process.env.NODE_ENV !== 'dev' ? 'dist' : '../sampler/target/classes/atlantafx/sampler/theme-test'; + + grunt.initConfig({ + cssOutputDir: CSS_OUTPUT_DIR, + sass: { + + options: { + implementation: SASS_COMPILER + }, + dist: { + files: { + '<%= cssOutputDir %>/primer-light.css': [ 'src/primer-light.scss' ], + '<%= cssOutputDir %>/primer-dark.css': [ 'src/primer-dark.scss' ] + } + } + }, + cssmin: { + dist: { + files: {} + } + } + }); + + grunt.loadNpmTasks('grunt-sass'); + grunt.loadNpmTasks('grunt-contrib-cssmin'); + grunt.registerTask('default', ['sass', 'cssmin']); +}; diff --git a/styles/assembly.xml b/styles/assembly.xml new file mode 100755 index 0000000..b81ec59 --- /dev/null +++ b/styles/assembly.xml @@ -0,0 +1,20 @@ + + + + assembly + + zip + + false + + + + dist/ + / + false + + + + \ No newline at end of file diff --git a/styles/compile-scss-dev.sh b/styles/compile-scss-dev.sh new file mode 100755 index 0000000..3cb130d --- /dev/null +++ b/styles/compile-scss-dev.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env sh + +# This scipt compiles SCSS directly to the sampler classpath for hot reload (CSSFX). + +PATH="../node:$(../node/npm bin):$PATH" +NODE_ENV=dev grunt --verbose --gruntfile=Gruntfile.js diff --git a/styles/pom.xml b/styles/pom.xml new file mode 100755 index 0000000..eb94f16 --- /dev/null +++ b/styles/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + io.github.mkpaz + atlantafx-parent + 0.1.0 + + atlantafx-styles + + + + + + com.github.eirslett + frontend-maven-plugin + + ${project.parent.basedir} + + + + run-grunt + generate-resources + + grunt + + + --verbose + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + assembly + install + + single + + + ${project.build.directory} + ${app.name}-${app.version}-themes + false + false + posix + + assembly.xml + + + + + + + + org.apache.maven.plugins + maven-deploy-plugin + + true + + + + + + diff --git a/styles/src/components/_accordion.scss b/styles/src/components/_accordion.scss new file mode 100755 index 0000000..0287bd6 --- /dev/null +++ b/styles/src/components/_accordion.scss @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; + +.accordion { + + // make the rule more specific, otherwise it'd need to + // be placed below '>.titled-pane' rules + >.titled-pane.first-titled-pane { + >.title { + -fx-background-insets: 0, cfg.$border-width; + -fx-background-radius: cfg.$border-radius cfg.$border-radius 0 0; + } + } + + >.titled-pane { + >.title { + -fx-background-insets: 0, 0 cfg.$border-width cfg.$border-width cfg.$border-width; + // there's no such class as 'last-titled-pane, so we can't add + // border radius to the last accordion block whick looks a bit ugly + -fx-background-radius: 0; + } + } +} \ No newline at end of file diff --git a/styles/src/components/_breadcrumbs.scss b/styles/src/components/_breadcrumbs.scss new file mode 100755 index 0000000..1dc44de --- /dev/null +++ b/styles/src/components/_breadcrumbs.scss @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: MIT + +// .bread-crumb-bar { +// >.crumb { +// ... +// } +// } \ No newline at end of file diff --git a/styles/src/components/_button.scss b/styles/src/components/_button.scss new file mode 100755 index 0000000..5ebe26e --- /dev/null +++ b/styles/src/components/_button.scss @@ -0,0 +1,257 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/icons"; +@use "../settings/utils"; + +// basic style is shared with Button, ToggleButton and MenuButton +@mixin base() { + + // buttons can be configured via looked-up colors + -color-button-bg: -color-bg-inset; + -color-button-fg: -color-fg-default; + -color-button-border: -color-border-default; + + -color-button-bg-hover: utils.saturate(-color-button-bg, cfg.$darkMode, cfg.$color-delta-hover); + -color-button-fg-hover: -color-button-fg; + -color-button-border-hover: -color-button-border; + + -color-button-bg-focused: -color-button-bg; + -color-button-fg-focused: -color-button-fg; + -color-button-border-focused: -color-accent-emphasis; + + -color-button-bg-pressed: utils.saturate(-color-button-bg, cfg.$darkMode, cfg.$color-delta-active); + -color-button-fg-pressed: -color-button-fg; + -color-button-border-pressed: -color-button-border; + + -fx-background-color: -color-button-border, -color-button-bg; + -fx-background-insets: 0, cfg.$border-width; + -fx-background-radius: cfg.$border-radius; + -fx-graphic-text-gap: cfg.$graphic-gap; + -fx-text-fill: -color-button-fg; + -fx-alignment: CENTER; + + #{cfg.$font-icon-selector} { + -fx-icon-color: -color-button-fg; + // Always add -fx-fill when styling font icons. There's at least one weird bug. + // If you set stylesheet to the scene without '-fx-fill' font icon fg will be + // applied correctly. But if you set exactly the same stylesheet via + // Application.setUserAgentStylesheet(), font icon fg won't be correct without + // using '-fx-fill' here. + -fx-fill: -color-button-fg; + } + + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + } + + &:show-mnemonics { + >.mnemonic-underline { + -fx-stroke: -color-button-fg; + } + } + + // Button calculates its height based on the internal text font size. + // So, button that has no text (or icon) will appear lower than regulat + // buttons. There're no workarounds, but you can set escape char like + // \s or \f as button text. + &.button-icon { + -fx-padding: cfg.$padding-y; + + >.text { + visibility: hidden; + } + } + + &.button-circle { + -fx-background-radius: 50; + -fx-padding: 6px 8px 6px 8px; + + .text { + visibility: hidden; + } + } + + // toggle button + &.left-pill { + -fx-background-radius: cfg.$border-radius 0 0 cfg.$border-radius; + -fx-background-insets: 0, cfg.$border-width 0 cfg.$border-width cfg.$border-width; + + &:hover, + &:focused { + -fx-background-insets: 0, cfg.$border-width; + } + } + + &.center-pill { + -fx-background-radius: 0; + -fx-background-insets: 0, cfg.$border-width 0 cfg.$border-width 0; + + &:hover, + &:focused { + -fx-background-insets: 0, cfg.$border-width; + } + } + + &.right-pill { + -fx-background-radius: 0 cfg.$border-radius cfg.$border-radius 0; + -fx-background-insets: 0, cfg.$border-width cfg.$border-width cfg.$border-width 0; + + &:hover, + &:focused { + -fx-background-insets: 0, cfg.$border-width; + } + } +} + +@mixin accent() { + -color-button-bg: -color-accent-emphasis; + -color-button-fg: -color-fg-emphasis; + -color-button-border: -color-accent-emphasis; + -color-button-border-focused: -color-accent-emphasis; + + &.button-outlined { + -color-button-bg: -color-bg-default; + -color-button-fg: -color-accent-fg; + + -color-button-bg-hover: -color-accent-emphasis; + -color-button-fg-hover: -color-fg-emphasis; + + -color-button-bg-focused: -color-accent-emphasis; + -color-button-fg-focused: -color-fg-emphasis; + + -color-button-bg-pressed: utils.saturate(-color-accent-emphasis, cfg.$darkMode, cfg.$color-delta-active); + -color-button-fg-pressed: -color-fg-emphasis; + } + + &.flat { + -color-button-fg: -color-accent-emphasis; + -color-button-bg-hover: -color-accent-subtle; + } +} + +@mixin success() { + -color-button-bg: -color-success-emphasis; + -color-button-fg: -color-fg-emphasis; + -color-button-border: -color-success-emphasis; + -color-button-border-focused: -color-success-emphasis; + + &.button-outlined { + -color-button-bg: -color-bg-default; + -color-button-fg: -color-success-fg; + + -color-button-bg-hover: -color-success-emphasis; + -color-button-fg-hover: -color-fg-emphasis; + + -color-button-bg-focused: -color-success-emphasis; + -color-button-fg-focused: -color-fg-emphasis; + + -color-button-bg-pressed: utils.saturate(-color-success-emphasis, cfg.$darkMode, cfg.$color-delta-active); + -color-button-fg-pressed: -color-fg-emphasis; + } + + &.flat { + -color-button-fg: -color-success-emphasis; + -color-button-bg-hover: -color-success-subtle; + } +} + +@mixin danger() { + -color-button-bg: -color-danger-emphasis; + -color-button-fg: -color-fg-emphasis; + -color-button-border: -color-danger-emphasis; + -color-button-border-focused: -color-danger-emphasis; + + &.button-outlined { + -color-button-bg: -color-bg-default; + -color-button-fg: -color-danger-fg; + + -color-button-bg-hover: -color-danger-emphasis; + -color-button-fg-hover: -color-fg-emphasis; + + -color-button-bg-focused: -color-danger-emphasis; + -color-button-fg-focused: -color-fg-emphasis; + + -color-button-bg-pressed: utils.saturate(-color-danger-emphasis, cfg.$darkMode, cfg.$color-delta-active); + -color-button-fg-pressed: -color-fg-emphasis; + } + + &.flat { + -color-button-fg: -color-danger-emphasis; + -color-button-bg-hover: -color-danger-subtle; + } +} + +@mixin flat() { + -color-button-bg: transparent; + -color-button-border: transparent; + + -color-button-bg-hover: -color-bg-subtle; + -color-button-border-hover: transparent; + + -color-button-bg-focused: transparent; + -color-button-border-focused: transparent; + + -color-button-bg-pressed: transparent; + -color-button-border-pressed: transparent; +} + +.button { + @include base(); + + -fx-padding: cfg.$padding-y cfg.$padding-x cfg.$padding-y cfg.$padding-x; + + &:hover, + &:hover:focused { + -fx-background-color: -color-button-border-hover, -color-button-bg-hover; + -fx-text-fill: -color-button-fg-hover; + + #{cfg.$font-icon-selector} { + -fx-icon-color: -color-button-fg-hover; + -fx-fill: -color-button-fg-hover; + } + } + + &:focused { + -fx-background-color: -color-button-border-focused, -color-button-bg-focused; + -fx-text-fill: -color-button-fg-focused; + + #{cfg.$font-icon-selector} { + -fx-icon-color: -color-button-fg-focused; + -fx-fill: -color-button-fg-focused; + } + } + + &:armed, + &:focused:armed { + -fx-background-color: -color-button-border-pressed, -color-button-bg-pressed; + -fx-text-fill: -color-button-fg-pressed; + + #{cfg.$font-icon-selector} { + -fx-icon-color: -color-button-fg-pressed; + -fx-fill: -color-button-fg-pressed; + } + } + + &:default, + &.accent { + @include accent(); + } + + &.success { + @include success(); + } + + &.danger { + @include danger(); + } + + &.flat { + @include flat(); + + &:armed, + &:focused:armed { + -fx-underline: true; + } + } +} \ No newline at end of file diff --git a/styles/src/components/_chart.scss b/styles/src/components/_chart.scss new file mode 100755 index 0000000..1060dce --- /dev/null +++ b/styles/src/components/_chart.scss @@ -0,0 +1,541 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; + +.chart { + -fx-padding: 4px; + + >.chart-title { + -fx-font-size: cfg.$font-title-4; + } + + >.chart-content { + -fx-padding: 10px; + + >.chart-plot-background { + -fx-background-color: -color-bg-default; + } + } + + &:disabled { + >.chart-content { + + // prevent opacity from being applied twice + .label { + -fx-opacity: 1; + } + + -fx-opacity: cfg.$opacity-disabled; + } + } + + >.chart-legend { + -fx-padding: 6px; + } + + .axis { + -fx-axis-color: -color-border-default; + -fx-tick-label-font-size: cfg.$font-small; + -fx-tick-label-fill: -color-fg-default; + + &:top { + -fx-border-color: transparent transparent -fx-axis-color transparent; + } + + &:right { + -fx-border-color: transparent transparent transparent -fx-axis-color; + } + + &:bottom { + -fx-border-color: -fx-axis-color transparent transparent transparent; + } + + &:left { + -fx-border-color: transparent -fx-axis-color transparent transparent; + } + + &:top>.axis-label, + &:left>.axis-label { + -fx-padding: 0 0 4px 0; + } + + &:bottom>.axis-label, + &:right>.axis-label { + -fx-padding: 4px 0 0 0; + } + + >.axis-tick-mark, + >.axis-minor-tick-mark { + -fx-fill: none; + -fx-stroke: -fx-axis-color; + } + } + + .chart-horizontal-grid-lines, + .chart-vertical-grid-lines { + -fx-stroke: -color-border-muted; + -fx-stroke-dash-array: 0.25em, 0.25em; + } + + .chart-alternative-row-fill, + .chart-alternative-column-fill { + -fx-fill: none; + -fx-stroke: none; + } + + .chart-vertical-zero-line, + .chart-horizontal-zero-line { + -fx-stroke: -color-fg-default; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// ScatterChart // +/////////////////////////////////////////////////////////////////////////////// + +// solid circle +.chart-symbol { + -fx-background-color: -color-chart-1; + -fx-background-radius: 5px; + -fx-padding: 5px; +} + +// solid square +.default-color1.chart-symbol { + -fx-background-color: -color-chart-2; + -fx-background-radius: 0; +} + +// solid diamond +.default-color2.chart-symbol { + -fx-background-color: -color-chart-3; + -fx-background-radius: 0; + -fx-padding: 7px 5px 7px 5px; + -fx-shape: "M5,0 L10,9 L5,18 L0,9 Z"; +} + +// cross +.default-color3.chart-symbol { + -fx-background-color: -color-chart-4; + -fx-background-radius: 0; + -fx-background-insets: 0; + -fx-shape: "M2,0 L5,4 L8,0 L10,0 L10,2 L6,5 L10,8 L10,10 L8,10 L5,6 L2,10 L0,10 L0,8 L4,5 L0,2 L0,0 Z"; +} + +// solid triangle +.default-color4.chart-symbol { + -fx-background-color: -color-chart-5; + -fx-background-radius: 0; + -fx-background-insets: 0; + -fx-shape: "M5,0 L10,8 L0,8 Z"; +} + +// hollow circle +.default-color5.chart-symbol { + -fx-background-color: -color-chart-6, white; + -fx-background-insets: 0, 2; + -fx-background-radius: 5px; + -fx-padding: 5px; +} + +// hollow square +.default-color6.chart-symbol { + -fx-background-color: -color-chart-7, white; + -fx-background-insets: 0, 2; + -fx-background-radius: 0; +} + +// hollow diamond +.default-color7.chart-symbol { + -fx-background-color: -color-chart-8, white; + -fx-background-radius: 0; + -fx-background-insets: 0, 2.5; + -fx-padding: 7px 5px 7px 5px; + -fx-shape: "M5,0 L10,9 L5,18 L0,9 Z"; +} + +/////////////////////////////////////////////////////////////////////////////// +// LineChart // +/////////////////////////////////////////////////////////////////////////////// + +.chart-line-symbol { + -fx-background-color: -color-chart-1, white; + -fx-background-insets: 0, 2; + -fx-background-radius: 5px; + -fx-padding: 5px; +} + +.chart-series-line { + -fx-stroke: -color-chart-1; + -fx-stroke-width: 3px; +} + +.default-color0.chart-line-symbol { + -fx-background-color: -color-chart-1, white; +} + +.default-color1.chart-line-symbol { + -fx-background-color: -color-chart-2, white; +} + +.default-color2.chart-line-symbol { + -fx-background-color: -color-chart-3, white; +} + +.default-color3.chart-line-symbol { + -fx-background-color: -color-chart-4, white; +} + +.default-color4.chart-line-symbol { + -fx-background-color: -color-chart-5, white; +} + +.default-color5.chart-line-symbol { + -fx-background-color: -color-chart-6, white; +} + +.default-color6.chart-line-symbol { + -fx-background-color: -color-chart-7, white; +} + +.default-color7.chart-line-symbol { + -fx-background-color: -color-chart-8, white; +} + +.default-color0.chart-series-line { + -fx-stroke: -color-chart-1; +} + +.default-color1.chart-series-line { + -fx-stroke: -color-chart-2; +} + +.default-color2.chart-series-line { + -fx-stroke: -color-chart-3; +} + +.default-color3.chart-series-line { + -fx-stroke: -color-chart-4; +} + +.default-color4.chart-series-line { + -fx-stroke: -color-chart-5; +} + +.default-color5.chart-series-line { + -fx-stroke: -color-chart-6; +} + +.default-color6.chart-series-line { + -fx-stroke: -color-chart-7; +} + +.default-color7.chart-series-line { + -fx-stroke: -color-chart-8; +} + +/////////////////////////////////////////////////////////////////////////////// +// AreaChart // +/////////////////////////////////////////////////////////////////////////////// + +.chart-area-symbol { + -fx-background-color: -color-chart-1, white; + -fx-background-insets: 0, 1; + -fx-background-radius: 4px; // makes sure this remains circular + -fx-padding: 3px; +} + +.default-color0.chart-area-symbol { + -fx-background-color: -color-chart-1, white; +} + +.default-color1.chart-area-symbol { + -fx-background-color: -color-chart-2, white; +} + +.default-color2.chart-area-symbol { + -fx-background-color: -color-chart-3, white; +} + +.default-color3.chart-area-symbol { + -fx-background-color: -color-chart-4, white; +} + +.default-color4.chart-area-symbol { + -fx-background-color: -color-chart-5, white; +} + +.default-color5.chart-area-symbol { + -fx-background-color: -color-chart-6, white; +} + +.default-color6.chart-area-symbol { + -fx-background-color: -color-chart-7, white; +} + +.default-color7.chart-area-symbol { + -fx-background-color: -color-chart-8, white; +} + +.chart-series-area-line { + -fx-stroke: -color-chart-1; + -fx-stroke-width: 1px; +} + +.default-color0.chart-series-area-line { + -fx-stroke: -color-chart-1; +} + +.default-color1.chart-series-area-line { + -fx-stroke: -color-chart-2; +} + +.default-color2.chart-series-area-line { + -fx-stroke: -color-chart-3; +} + +.default-color3.chart-series-area-line { + -fx-stroke: -color-chart-4; +} + +.default-color4.chart-series-area-line { + -fx-stroke: -color-chart-5; +} + +.default-color5.chart-series-area-line { + -fx-stroke: -color-chart-6; +} + +.default-color6.chart-series-area-line { + -fx-stroke: -color-chart-7; +} + +.default-color7.chart-series-area-line { + -fx-stroke: -color-chart-8; +} + +.chart-series-area-fill { + -fx-stroke: none; + -fx-fill: -color-chart-1-alpha20; +} + +.default-color0.chart-series-area-fill { + -fx-fill: -color-chart-1-alpha20; +} + +.default-color1.chart-series-area-fill { + -fx-fill: -color-chart-2-alpha20; +} + +.default-color2.chart-series-area-fill { + -fx-fill: -color-chart-3-alpha20; +} + +.default-color3.chart-series-area-fill { + -fx-fill: -color-chart-4-alpha20; +} + +.default-color4.chart-series-area-fill { + -fx-fill: -color-chart-5-alpha20; +} + +.default-color5.chart-series-area-fill { + -fx-fill: -color-chart-6-alpha20; +} + +.default-color6.chart-series-area-fill { + -fx-fill: -color-chart-7-alpha20; +} + +.default-color7.chart-series-area-fill { + -fx-fill: -color-chart-8-alpha20; +} + +.area-legend-symbol { + -fx-padding: 6px; + -fx-background-radius: 6px; // makes sure this remains circular + -fx-background-insets: 0, 3; +} + +/////////////////////////////////////////////////////////////////////////////// +// BubbleChart // +/////////////////////////////////////////////////////////////////////////////// + +.bubble-legend-symbol { + -fx-background-radius: 8px; + -fx-padding: 8px; +} + +.chart-bubble { + -fx-bubble-fill: -color-chart-1-alpha70; + -fx-background-color: radial-gradient(center 50% 50%, + radius 80%, + derive(-fx-bubble-fill, 20%), + derive(-fx-bubble-fill, -30%)); +} + +.default-color0.chart-bubble { + -fx-bubble-fill: -color-chart-1-alpha70; +} + +.default-color1.chart-bubble { + -fx-bubble-fill: -color-chart-2-alpha70; +} + +.default-color2.chart-bubble { + -fx-bubble-fill: -color-chart-3-alpha70; +} + +.default-color3.chart-bubble { + -fx-bubble-fill: -color-chart-4-alpha70; +} + +.default-color4.chart-bubble { + -fx-bubble-fill: -color-chart-5-alpha70; +} + +.default-color5.chart-bubble { + -fx-bubble-fill: -color-chart-6-alpha70; +} + +.default-color6.chart-bubble { + -fx-bubble-fill: -color-chart-7-alpha70; +} + +.default-color7.chart-bubble { + -fx-bubble-fill: -color-chart-8-alpha70; +} + +/////////////////////////////////////////////////////////////////////////////// +// BarChart // +/////////////////////////////////////////////////////////////////////////////// + +.chart-bar { + -fx-bar-fill: -color-chart-1; + -fx-background-color: linear-gradient(to right, + derive(-fx-bar-fill, -4%), + derive(-fx-bar-fill, -1%), + derive(-fx-bar-fill, 0%), + derive(-fx-bar-fill, -1%), + derive(-fx-bar-fill, -6%)); + -fx-background-insets: 0; +} + +.chart-bar.danger { + -fx-background-insets: 1 0 0 0; +} + +.bar-chart:horizontal .chart-bar { + -fx-background-insets: 0 0 0 1; +} + +.bar-chart:horizontal .chart-bar, +.stacked-bar-chart:horizontal .chart-bar { + -fx-background-color: linear-gradient(to bottom, + derive(-fx-bar-fill, -4%), + derive(-fx-bar-fill, -1%), + derive(-fx-bar-fill, 0%), + derive(-fx-bar-fill, -1%), + derive(-fx-bar-fill, -6%)); +} + +.default-color0.chart-bar { + -fx-bar-fill: -color-chart-1; +} + +.default-color1.chart-bar { + -fx-bar-fill: -color-chart-2; +} + +.default-color2.chart-bar { + -fx-bar-fill: -color-chart-3; +} + +.default-color3.chart-bar { + -fx-bar-fill: -color-chart-4; +} + +.default-color4.chart-bar { + -fx-bar-fill: -color-chart-5; +} + +.default-color5.chart-bar { + -fx-bar-fill: -color-chart-6; +} + +.default-color6.chart-bar { + -fx-bar-fill: -color-chart-7; +} + +.default-color7.chart-bar { + -fx-bar-fill: -color-chart-8; +} + +.bar-legend-symbol { + -fx-padding: 8px; +} + +/////////////////////////////////////////////////////////////////////////////// +// PieChart // +/////////////////////////////////////////////////////////////////////////////// + +.chart-pie { + -fx-pie-color: -color-chart-1; + -fx-background-color: radial-gradient(radius 100%, + derive(-fx-pie-color, 20%), + derive(-fx-pie-color, -10%)); + -fx-background-insets: 1; + -fx-border-color: -color-bg-default; +} + +.chart-pie-label { + -fx-padding: 3px; + -fx-fill: -color-fg-default; +} + +.chart-pie-label-line { + -fx-stroke: derive(-color-bg-default, -20%); +} + +.default-color0.chart-pie { + -fx-pie-color: -color-chart-1; +} + +.default-color1.chart-pie { + -fx-pie-color: -color-chart-2; +} + +.default-color2.chart-pie { + -fx-pie-color: -color-chart-3; +} + +.default-color3.chart-pie { + -fx-pie-color: -color-chart-4; +} + +.default-color4.chart-pie { + -fx-pie-color: -color-chart-5; +} + +.default-color5.chart-pie { + -fx-pie-color: -color-chart-6; +} + +.default-color6.chart-pie { + -fx-pie-color: -color-chart-7; +} + +.default-color7.chart-pie { + -fx-pie-color: -color-chart-8; +} + +.danger.chart-pie { + -fx-pie-color: transparent; + -fx-background-color: white; +} + +.pie-legend-symbol.chart-pie { + -fx-background-radius: 8px; + -fx-padding: 8px; + -fx-border-color: none; +} \ No newline at end of file diff --git a/styles/src/components/_checkbox.scss b/styles/src/components/_checkbox.scss new file mode 100755 index 0000000..202de87 --- /dev/null +++ b/styles/src/components/_checkbox.scss @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/icons"; + +.check-box { + + // applied to label + -fx-text-fill: -color-fg-default; + -fx-label-padding: cfg.$checkbox-label-padding cfg.$checkbox-label-padding cfg.$checkbox-label-padding cfg.$graphic-gap; + + >.box { + -fx-background-color: -color-fg-default, -color-bg-default; + -fx-background-insets: 0, cfg.$border-width; + -fx-background-radius: cfg.$border-radius; + -fx-padding: cfg.$checkbox-mark-padding-y cfg.$checkbox-mark-padding-x cfg.$checkbox-mark-padding-y cfg.$checkbox-mark-padding-x; + -fx-alignment: CENTER; + + >.mark { + -fx-background-color: -color-bg-default; // mark is hidden + @include icons.get("check", true); + -fx-min-height: cfg.$checkbox-mark-size; + -fx-max-height: cfg.$checkbox-mark-size; + -fx-min-width: cfg.$checkbox-mark-size; + -fx-max-width: cfg.$checkbox-mark-size; + } + } + + &:indeterminate { + >.box { + >.mark { + -fx-background-color: -color-fg-muted; + @include icons.get("minus", false); + } + } + } + + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + + >.box { + -fx-opacity: cfg.$opacity-disabled; + } + } + + &:selected { + >.box { + -fx-background-color: -color-accent-emphasis, -color-accent-emphasis; + + >.mark { + -fx-background-color: -color-fg-emphasis; + } + } + } + + &:show-mnemonics>.mnemonic-underline { + -fx-stroke: -color-fg-default; + } +} \ No newline at end of file diff --git a/styles/src/components/_color-picker.scss b/styles/src/components/_color-picker.scss new file mode 100755 index 0000000..3a9df85 --- /dev/null +++ b/styles/src/components/_color-picker.scss @@ -0,0 +1,222 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/effects"; + +// combo box +.color-picker { + + >.color-picker-label { + -fx-padding: cfg.$padding-y cfg.$padding-x cfg.$padding-y cfg.$padding-x; + + >.label { + -fx-text-fill: -color-fg-default; + } + + >.picker-color { + >.picker-color-rect { + -fx-stroke: -color-border-default; + } + } + } + + // ColorPicker.STYLE_CLASS_BUTTON + &.button { + >.color-picker-label { + -fx-padding: 0; + } + } +} + +// popup window +.color-palette { + -fx-background-color: -color-border-default, -color-bg-default; + -fx-background-insets: 0, cfg.$border-width; + -fx-background-radius: cfg.$border-radius; + -fx-spacing: 10px; + -fx-padding: 1em; + + >.color-picker-grid { + -fx-padding: 0.5px; + -fx-snap-to-pixel: false; + + >.color-square { + -fx-background-color: transparent; + -fx-padding: 0.5px; + } + } +} + +// this is another popup window, it's not inside the .color-patette +// also note that it's applied to both palette dropdown popup AND +// each individual color hover popup +.color-palette-region { + // color popup window positioning, + // transparent is fit both light and dark modes + -fx-effect: dropshadow(gaussian, transparent, 12, 0, 0, 8); + + // the color over which the user is hovering + >.color-square.hover-square { + -fx-background-color: -color-accent-fg, -color-bg-default; + -fx-background-insets: -2, -1; // border width + -fx-background-radius: 5, 0; + -fx-scale-x: 1.5; // magnification + -fx-scale-y: 1.5; + -fx-border-color: -color-accent-fg; + -fx-border-insets: -1, -1; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// CustomColorDialog // +/////////////////////////////////////////////////////////////////////////////// + +.custom-color-dialog { + -fx-background-color: -color-bg-default; + -fx-padding: 1.25em; + -fx-spacing: 1.25em; + + >.color-rect-pane { + -fx-spacing: 1em; + -fx-pref-height: 16em; + -fx-alignment: TOP-LEFT; + -fx-fill-height: true; + + >.color-rect { + -fx-min-width: 16em; + -fx-min-height: 16em; + + .color-rect-border { + -fx-border-color: -color-border-default; + } + + #color-rect-indicator { + -fx-background-color: none; + -fx-border-color: white; // circular indicator + -fx-border-radius: 0.4166667em; + -fx-pref-width: 0.833333em; + -fx-pref-height: 0.833333em; + -fx-translate-x: -0.4166667em; + -fx-translate-y: -0.4166667em; + -fx-effect: dropshadow(three-pass-box, black, 2, 0.0, 0, 1); + } + } + + >.color-bar { + -fx-min-width: 1.666667em; + -fx-min-height: 16.666667em; + -fx-max-width: 1.666667em; + -fx-border-color: -color-border-default; + + #color-bar-indicator { + -fx-border-radius: 0.333333em; + -fx-border-color: white; // rect indicator + -fx-pref-width: 2em; + -fx-pref-height: 0.833333em; + -fx-translate-x: -0.1666667em; + -fx-translate-y: -0.4166667em; + -fx-effect: dropshadow(three-pass-box, black, 2, 0.0, 0, 1); + } + } + } + + >.controls-pane { + >.current-new-color-grid { + >.label { + -fx-padding: 0 0 0 calc(cfg.$border-width * 2); + } + + >#current-new-color-border { + -fx-border-color: -color-border-default; + -fx-border-width: cfg.$border-width; + } + + >.color-rect { + -fx-min-width: 10em; + -fx-pref-width: 10em; + + -fx-min-height: 1.75em; + -fx-pref-height: 1.75em; + } + + // top spacer (between labels and color rect) + >#spacer1 { + -fx-min-height: 5px; + -fx-pref-height: 5px; + -fx-max-height: 5px; + } + + // bottom spacer (between color rect and settings pane) + >#spacer2 { + -fx-min-height: 1em; + -fx-pref-height: 1em; + -fx-max-height: 1em; + } + } + + #settings-pane { + -fx-hgap: 6px; + -fx-vgap: 6px; + + >.customcolor-controls-background { + -fx-background-color: -color-border-default, -color-bg-default; + -fx-background-insets: calc(14px - cfg.$border-width) 0 calc(6px - cfg.$border-width) 0, + 14px cfg.$border-width 6px cfg.$border-width; + -fx-background-radius: cfg.$border-radius; + } + + >.settings-label { + -fx-min-width: 5.75em; + } + + >.settings-unit { + -fx-min-width: 1.5em; + -fx-pref-width: 1.5em; + -fx-max-width: 1.5em; + } + + >.slider { + -fx-pref-width: 10em; + } + + >.color-input-field { + -fx-max-width: 4em; + -fx-pref-width: 4em; + -fx-min-width: 4em; + -fx-pref-column-count: 3; + } + + >#spacer-side { + -fx-min-width: 0.5em; + -fx-pref-width: 0.5em; + } + + >#spacer-bottom { + -fx-min-height: 1em; + -fx-pref-height: 1em; + } + + >.web-field { + -fx-pref-column-count: 6; + -fx-pref-width: 8em; + } + + // keeps the text right-aligned when in RTL mode + >.webcolor-field:dir(rtl)>.text-field:dir(ltr) { + -fx-alignment: BASELINE_RIGHT; + } + } + + >#buttons-hbox { + -fx-spacing: 10px; + -fx-padding: 1em 0 0 0; + -fx-alignment: BOTTOM_RIGHT; + } + + .transparent-pattern { + -fx-background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAIAAABLbSncAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpCOTBEQkE1RjJFMjA2ODExOUExMUM5NDhFOTUyQzM3MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRkE3MDZERThFNUYxMUUxQjU5RUNFQTE3OTA1RDFFMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRkE3MDZERDhFNUYxMUUxQjU5RUNFQTE3OTA1RDFFMSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1LjEgTWFjaW50b3NoIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDk4MDExNzQwNzIwNjgxMTg3MUZDMUExNDFCMTYwNzkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjkwREJBNUYyRTIwNjgxMTlBMTFDOTQ4RTk1MkMzNzAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz71FDCdAAAAKElEQVR42mI8c+YMAwwYGxvD2UwMOADpEoz///+Hc86ePUsLOwACDABC1ghwV8TLOQAAAABJRU5ErkJggg=="); + -fx-background-repeat: repeat; + -fx-background-size: auto; + } + } +} \ No newline at end of file diff --git a/styles/src/components/_combo-box.scss b/styles/src/components/_combo-box.scss new file mode 100755 index 0000000..434f4cc --- /dev/null +++ b/styles/src/components/_combo-box.scss @@ -0,0 +1,202 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/effects"; +@use "../settings/icons"; +@use "../settings/utils"; + +@mixin _arrow() { + @include icons.get("arrow-drop-down", false); + -fx-background-color: -color-fg-muted; +} + +@mixin _combo-box-base() { + -fx-background-color: -color-border-default, -color-bg-default; + -fx-background-insets: 0, 1; + -fx-background-radius: cfg.$border-radius; + -fx-text-fill: -color-fg-default; + -fx-alignment: CENTER; + -fx-content-display: LEFT; + + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + } + + &:success, + &:success:focused { + -fx-background-color: -color-success-emphasis, -color-bg-default; + } + + &:danger, + &:danger:focused { + -fx-background-color: -color-danger-emphasis, -color-bg-default; + } + + &:focused { + -fx-background-color: -color-accent-emphasis, -color-bg-default; + } + + // input group + &.left-pill { + -fx-background-radius: cfg.$border-radius 0 0 cfg.$border-radius; + -fx-background-insets: 0, cfg.$border-width 0 cfg.$border-width cfg.$border-width; + + &:focused { + -fx-background-insets: 0, cfg.$border-width; + } + } + + &.center-pill { + -fx-background-radius: 0; + -fx-background-insets: 0, cfg.$border-width 0 cfg.$border-width 0; + + &:focused { + -fx-background-insets: 0, cfg.$border-width; + } + } + + &.right-pill { + -fx-background-radius: 0 cfg.$border-radius cfg.$border-radius 0; + -fx-background-insets: 0, cfg.$border-width cfg.$border-width cfg.$border-width 0; + + &:focused { + -fx-background-insets: 0, cfg.$border-width; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// ComboBox // +/////////////////////////////////////////////////////////////////////////////// + +// .combo-box-base is only applied to the ComboBox, ColorPicker and Datepicker, +// it's not applied to the ChoiceBox +.combo-box-base { + + @include _combo-box-base(); + + >.arrow-button { + -fx-padding: cfg.$padding-y cfg.$padding-x cfg.$padding-y cfg.$padding-x; + + >.arrow { + @include _arrow(); + } + } + + >.text-field { + -fx-background-insets: 0, 1 0 1 1; + -fx-background-radius: cfg.$border-radius 0 0 cfg.$border-radius; + } + + &:success { + >.arrow-button>.arrow { + -fx-background-color: -color-success-fg; + } + } + + &:danger { + >.arrow-button>.arrow { + -fx-background-color: -color-danger-fg; + } + } +} + +.combo-box { + + // customise the ListCell that appears in the ComboBox button itself + >.list-cell { + -fx-background-color: transparent; + -fx-text-fill: -color-fg-default; + -fx-padding: cfg.$padding-y cfg.$padding-x cfg.$padding-y cfg.$padding-x; + -fx-graphic-text-gap: cfg.$graphic-gap; + } + + &:success>.list-cell { + -fx-text-fill: -color-success-fg; + } + + &:danger>.list-cell { + -fx-text-fill: -color-danger-fg; + } +} + +.combo-box-popup { + >.list-view { + -fx-background-color: -color-border-default, -color-bg-default; + -fx-background-insets: 0, 1; + -fx-background-radius: cfg.$border-radius; + + >.virtual-flow { + >.clipped-container { + >.sheet { + >.list-cell { + // reset cell size, because height is set via paddings + // to use the same values as ChoiceBox + -fx-cell-size: 0; + -fx-background-color: -color-bg-default; + -fx-padding: cfg.$menu-padding-y cfg.$menu-padding-x cfg.$menu-padding-y cfg.$menu-padding-x; + -fx-graphic-text-gap: cfg.$graphic-gap; + + &:filled:hover { + -fx-background-color: utils.saturate(-color-bg-default, cfg.$darkMode, cfg.$color-delta-hover); + } + + &:filled:selected, + &:filled:selected:hover { + -fx-background-color: -color-accent-subtle; + } + } + } + } + } + + // placeholder is shown to the user when the ComboBox has no content to show + >.placeholder { + >.label { + -fx-text-fill: -color-fg-muted; + } + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// ChoiceBox // +/////////////////////////////////////////////////////////////////////////////// + +.choice-box { + + @include _combo-box-base(); + + -fx-padding: cfg.$padding-y cfg.$padding-x cfg.$padding-y cfg.$padding-x; + + >.label { + -fx-text-fill: -color-fg-default; + } + + >.open-button { + + >.arrow { + @include _arrow(); + } + } + + &:success { + >.label { + -fx-text-fill: -color-success-fg; + } + + >.open-button>.arrow { + -fx-background-color: -color-success-fg; + } + } + + &:danger { + >.label { + -fx-text-fill: -color-danger-fg; + } + + >.open-button>.arrow { + -fx-background-color: -color-danger-fg; + } + } +} \ No newline at end of file diff --git a/styles/src/components/_custom-text-field.scss b/styles/src/components/_custom-text-field.scss new file mode 100644 index 0000000..4284ff2 --- /dev/null +++ b/styles/src/components/_custom-text-field.scss @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "sass:math"; + +// space bethween text and custom node +$text-gap: 4px !default; + +.custom-text-field { + + &:left-node-visible { + -fx-padding: cfg.$padding-y cfg.$padding-x cfg.$padding-y 0; + + .left-pane { + -fx-padding: 0 $text-gap 0 math.div(cfg.$padding-x, 2); + } + } + + &:right-node-visible { + -fx-padding: cfg.$padding-y 0 cfg.$padding-y cfg.$padding-x; + + .right-pane { + -fx-padding: 0 math.div(cfg.$padding-x, 2) 0 $text-gap; + } + } + + &:left-node-visible:right-node-visible { + -fx-padding: cfg.$padding-y 0 cfg.$padding-y 0; + } + + &:success { + #{cfg.$font-icon-selector} { + -fx-icon-color: -color-success-fg; + -fx-fill: -color-success-fg; + } + } + + &:danger { + #{cfg.$font-icon-selector} { + -fx-icon-color: -color-danger-fg; + -fx-fill: -color-danger-fg; + } + } +} \ No newline at end of file diff --git a/styles/src/components/_data.scss b/styles/src/components/_data.scss new file mode 100755 index 0000000..00cfd87 --- /dev/null +++ b/styles/src/components/_data.scss @@ -0,0 +1,443 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/icons"; + +$cell-size-normal: 2.8em !default; +$cell-size-dense: 2em !default; +$cell-padding-x: 0.5em !default; + +// .tree-cell doesn't support -fx-cell-size +// its height should be set via vertical paddings +$tree-cell-padding-x: $cell-padding-x !default; +$tree-cell-padding-y: $cell-padding-x !default; +$tree-cell-indent: 1em !default; + +@mixin _base() { + + -fx-border-color: -color-border-default; + -fx-border-width: cfg.$border-width; + -fx-border-radius: 0; + + >.virtual-flow { + >.corner { + -fx-background-color: -color-border-subtle; + -fx-opacity: cfg.$opacity-disabled; + } + + // apply opacity to all but control borders + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + } + } +} + +// row selection (cellSelectionEnabled = false) +.list-view:focused>.virtual-flow>.clipped-container>.sheet>.list-cell:filled:selected, +.tree-view:focused>.virtual-flow>.clipped-container>.sheet>.tree-cell:filled:selected, +.table-view:focused>.virtual-flow>.clipped-container>.sheet>.table-row-cell:filled:selected, +.tree-table-view:focused>.virtual-flow>.clipped-container>.sheet>.tree-table-row-cell:filled:selected { + -fx-background-color: -color-border-default, -color-accent-subtle; +} + +// individual cell selection (cellSelectionEnabled = true) +.table-view:focused>.virtual-flow>.clipped-container>.sheet>.table-row-cell .table-cell:selected, +.tree-table-view:focused>.virtual-flow>.clipped-container>.sheet>.tree-table-row-cell .tree-table-cell:selected { + -fx-background-color: -color-accent-subtle; + // a margin to show bottom .table-row-cell border, + // it should be 1px height, but for some reason it's not enough + -fx-background-insets: 0 0 2 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// Customised CSS for controls placed directly within cells // +/////////////////////////////////////////////////////////////////////////////// + +// nested controls supposed to have nor background nor borders +.cell { + + // NOTE: + // The controls inside .tree-cell _with graphic_ will be wrapped into additional + // container that don't use hgrow and adjusts its width after showing popup. + // It looks rather ugly, but there's nothing could be fixed with CSS. + // That's also why we don't use child combinator here. + // #javafx-bug + + .text-input { + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-background-radius: 0; + -fx-padding: 0; + } + + .check-box { + -fx-padding: 0 cfg.$graphic-gap 0 0; + } + + .choice-box { + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-background-radius: 0; + -fx-padding: 0 cfg.$padding-x 0 0; + -fx-alignment: CENTER_LEFT; + -fx-content-display: LEFT; + } + + .combo-box { + -fx-background-color: transparent; + -fx-alignment: CENTER_LEFT; + -fx-content-display: LEFT; + -fx-background-radius: 0; + + // must be more spefific than ".list-view .list-cell" selector (see below) + .cell.list-cell { + -fx-background-color: transparent; + -fx-padding: 0; + -fx-background-insets: 0; + -fx-background-radius: 0; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// ListView // +/////////////////////////////////////////////////////////////////////////////// + +.list-view { + @include _base(); + + .list-cell { + -fx-background-color: -color-bg-default; + -fx-text-fill: -color-fg-default; + -fx-padding: 0 $cell-padding-x 0 $cell-padding-x; + -fx-cell-size: $cell-size-normal; + + // there's no ":first" or ":last" cell pseudo classes, + // so we can't avoid double border at the bottom + -fx-border-width: 0 0 1 0; + -fx-border-color: transparent; + } + + &.bordered { + .list-cell { + -fx-border-color: -color-border-default; + } + } + + &.dense { + .list-cell { + -fx-cell-size: $cell-size-dense; + } + } + + &.striped { + .list-cell:odd { + -fx-background-color: -color-bg-inset; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// TableView // +/////////////////////////////////////////////////////////////////////////////// + +@mixin _generic-table { + + @include _base(); + + &.bordered { + >.column-header-background { + .column-header { + -fx-background-color: -color-border-default, -color-bg-inset; + -fx-background-insets: 0, 0 1 0 0; + } + } + } + + // the column header row is made up of a number of .column-header, one for each TableColumn + >.column-header-background { + + -fx-background-color: -color-border-default, -color-bg-inset; + -fx-background-insets: 0, 0 0 1 0; + + // the only way to draw bottom header border is to use .table-column + // .column-header won't work nonetheless both classes applied to the same node + .table-column { + -fx-border-color: -color-border-default; + -fx-border-width: 0 0 1 0; + } + + // columns headers can be nested, so there's no child combinator here + .column-header { + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-size: 2.2em; + -fx-padding: 0; + -fx-font-weight: bold; + + // any label within column header, including title and sort order label + .label { + -fx-text-fill: -color-fg-default; + -fx-alignment: CENTER; + } + + // sort container + GridPane { + -fx-padding: 0 4px 0 0; + } + + // column sort arrows + .arrow { + -fx-background-color: -color-fg-muted; + -fx-padding: 3px 4px 3px 4px; + -fx-shape: "M 0 0 h 7 l -3.5 4 z"; + } + + // dots are used to indicate up to 3 multiple sort columns + .sort-order-dots-container { + -fx-padding: 2px 0 2px 0; + + >.sort-order-dot { + -fx-background-color: -color-fg-muted; + -fx-padding: 0.115em; + -fx-background-radius: 0.115em; + } + } + + // digits are used to indicate more than 3 multiple sort columns + .sort-order { + -fx-padding: 0 0 0 2px; + } + } + + // .filler area extends from the right-most column to the edge of the table view + >.filler { + -fx-background-color: transparent; + -fx-border-color: -color-border-default; + -fx-border-width: 0 0 1 0; + } + + // table menu button + >.show-hide-columns-button { + -fx-border-color: -color-border-default; + -fx-border-width: 0 0 1 0; + -fx-cursor: hand; + + // NOTE: + // If you want to increase right margin you should take into account + // that it's harder than it looks. E.g. paddings, transparent insets or borders + // aren't working. Just be sure you have enough time to tackle this problem. + + >.show-hide-column-image { + -fx-background-color: -color-fg-muted; + @include icons.get("more-vert", true); + -fx-padding: 0.4em 0.115em 0.4em 0.115em; + } + } + } + + // the .column-resize-line is shown when the user is attempting to resize a column + .column-resize-line { + -fx-background-color: -color-accent-emphasis; + -fx-padding: 0 1 0 1; + } + + // when a column is being dragged to be placed in a different position, there is a region + // that follows along the column header area to indicate where the column will be dropped + .column-drag-header { + // -color-accent-muted must be RGBA color for this to work, because + // applying opacity to the whole pane makes label text unreadable + -fx-background-color: -color-accent-muted; + } + + // semi-transparent overlay to indicate the column that is currently being moved + .column-overlay { + -fx-background-color: -color-accent-muted; + } + + // this is shown when the table has no rows and/or no columns + .placeholder>.label { + -fx-background-color: -color-bg-default; + -fx-font-size: cfg.$font-title-4; + } +} + +.table-view { + + @include _generic-table(); + + &.bordered { + .table-row-cell>.table-cell { + -fx-border-color: transparent -color-border-default transparent transparent; + + &:empty { + -fx-border-color: transparent; + } + } + } + + &.dense { + .table-row-cell { + -fx-cell-size: $cell-size-dense; + } + } + + &.striped { + .table-row-cell:odd { + -fx-background-color: -color-border-default, -color-bg-inset; + } + } + + // each row in the table is a .table-row-cell, + // inside a .table-row-cell is any number of .table-cell + .table-row-cell { + -fx-background-color: -color-border-default, -color-bg-default; + -fx-background-insets: 0, 0 0 1 0; + -fx-padding: 0; + -fx-cell-size: $cell-size-normal; + + // hide empty rows + &:empty { + -fx-background-color: transparent; + -fx-background-insets: 0; + + >.table-cell { + -fx-border-color:transparent; + } + } + + >.table-cell { + -fx-padding: 0 $cell-padding-x 0 $cell-padding-x; + -fx-text-fill: -color-fg-default; + -fx-alignment: CENTER_LEFT; + } + } +} + +// when in constrained resize mode, the right-most visible cell should not have a right-border, +// as it is not possible to get this cleanly out of view without introducing horizontal scrollbars +.table-view:constrained-resize>.virtual-flow>.clipped-container>.sheet>.table-row-cell>.table-cell:last-visible, +.tree-table-view:constrained-resize>.virtual-flow>.clipped-container>.sheet>.tree-table-row-cell>.tree-table-cell:last-visible { + -fx-border-color: transparent; +} + +// reset inherited font weight for context menu +.table-view .column-header .context-menu, +.tree-table-view .column-header .context-menu, +.table-view>.column-header-background>.show-hide-columns-button .context-menu, +.tree-table-view>.column-header-background>.show-hide-columns-button .context-menu { + -fx-font-weight: null; +} + +// table cells +.table-view .table-row-cell>.table-cell.check-box-table-cell, +.table-view .table-row-cell>.table-cell.font-icon-table-cell, +.tree-table-view .tree-table-row-cell>.tree-table-cell.check-box-tree-table-cell { + -fx-alignment: CENTER; + -fx-padding: 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// TreeView // +/////////////////////////////////////////////////////////////////////////////// + +.tree-view { + @include _base(); +} + +.tree-cell { + -fx-background-color: -color-bg-default; + -fx-text-fill: -color-fg-default; + -fx-padding: $tree-cell-padding-y 0 $tree-cell-padding-y 0; + -fx-indent: $tree-cell-indent; + + // NOTE: + // Instead of simply applying vertical alignment programmatically the TreeView + // expects you will do the same thing by adjusting .tree-disclosure-node + // paddings manually ¯\_(ツ)_/¯. The below values are adjusted for the theme + // default font size (14px). If you change the font size, you're supposed to + // re-adjust paddings as well. Also learn about TreeCellSkin#maxDisclosureWidthMap. + // #javafx-bug + >.tree-disclosure-node { + -fx-padding: 4px $tree-cell-padding-x 4px $tree-cell-padding-x; + -fx-background-color: transparent; + } +} + +.tree-cell>.tree-disclosure-node>.arrow, +.tree-table-row-cell>.tree-disclosure-node>.arrow { + @include icons.get("arrow-right", false); + -fx-background-color: -color-fg-default; + -fx-padding: 0.333333em 0.229em 0.333333em 0.229em; +} + +.tree-cell:expanded>.tree-disclosure-node>.arrow, +.tree-table-row-cell:expanded>.tree-disclosure-node>.arrow { + @include icons.get("arrow-drop-down", false); +} + +/////////////////////////////////////////////////////////////////////////////// +// TreeTableView // +/////////////////////////////////////////////////////////////////////////////// + +// NOTE: +// TreeTableView doesn't play well with editable cells. Whatever column +// you use as first, if it's not ordinary TreeTableCell, there will always +// be some issue with tree disclosure node: alignment, size etc. +// There's nothing that can be fixed with CSS. +.tree-table-view { + + @include _generic-table(); + + &.bordered { + .tree-table-row-cell>.tree-table-cell { + -fx-border-color: transparent -color-border-default transparent transparent; + + &:empty { + -fx-border-color: transparent; + } + } + } + + &.dense { + .tree-table-row-cell { + -fx-cell-size: $cell-size-dense; + + >.tree-disclosure-node { + -fx-padding: 0.6em $tree-cell-padding-x 0 $tree-cell-padding-x; + } + } + } + + &.striped { + .tree-table-row-cell:odd { + -fx-background-color: -color-border-default, -color-bg-inset; + } + } + + .tree-table-row-cell { + -fx-background-color: -color-border-default, -color-bg-default; + -fx-background-insets: 0, 0 0 1 0; + -fx-padding: 0; + -fx-cell-size: $cell-size-normal; + -fx-indent: 1em; + + // hide empty rows + &:empty { + -fx-background-color: transparent; + -fx-background-insets: 0; + } + + // read above about disclosure node alignment + >.tree-disclosure-node { + -fx-padding: 1em $tree-cell-padding-x 0 $tree-cell-padding-x; + -fx-background-color: transparent; + } + + >.tree-table-cell { + -fx-padding: 0 $cell-padding-x 0 $cell-padding-x; + -fx-text-fill: -color-fg-default; + -fx-alignment: CENTER_LEFT; + } + } +} \ No newline at end of file diff --git a/styles/src/components/_date-picker.scss b/styles/src/components/_date-picker.scss new file mode 100755 index 0000000..f2f93ed --- /dev/null +++ b/styles/src/components/_date-picker.scss @@ -0,0 +1,214 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/effects"; +@use "../settings/icons"; + +$content-padding-x: 8px !default; +$content-padding-y: 8px !default; + +$month-year-pane-color-bg: -color-bg-default !default; +$month-year-pane-color-fg: -color-fg-default !default; +$month-year-pane-font-size: 1.1em !default; + +$cell-padding-x: 4px !default; +$cell-padding-y: 8px !default; +$day-name-font-size: 0.9em !default; + +// secondary chronology +$chronology-fg: -color-success-fg !default; +$chronology-label-margin: 0.5em !default; +$chronology-cell-size: 2.75em !default; +$chronology-cell-padding: 0.083333em $cell-padding-x 0.083333em 0.333333em !default; + +.combo-box-base.date-picker { + >.arrow-button { + -fx-cursor: hand; + + >.arrow { + @include icons.get("calendar", true); + -fx-background-color: -color-fg-default; + -fx-padding: 0.416667em; // icon size + } + } +} + +.date-picker-popup { + -fx-background-color: -color-border-default, -color-bg-default; + -fx-background-insets: 0, 1; + -fx-background-radius: 0; + -fx-alignment: CENTER; + -fx-spacing: 0; + -fx-padding: cfg.$border-width; + + >.month-year-pane { + -fx-padding: $content-padding-y $content-padding-x $content-padding-y $content-padding-x; + -fx-background-color: $month-year-pane-color-bg; + -fx-background-insets: 0; + + // this one is actually HBox, but because of the class name it uses Spinner styles + >.spinner { + -fx-spacing: 4px; + -fx-alignment: CENTER; + -fx-fill-height: false; + -fx-background-color: transparent; + -fx-border-color: transparent; + -fx-font-size: $month-year-pane-font-size; + + >.button { + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-background-radius: 0; + -fx-cursor: hand; + + >.left-arrow { + @include icons.get("chevron-left", false); + -fx-background-color: $month-year-pane-color-fg; + } + + >.right-arrow { + @include icons.get("chevron-right", false); + -fx-background-color: $month-year-pane-color-fg; + } + } + + >.label { + -fx-alignment: CENTER; + -fx-text-fill: $month-year-pane-color-fg; + } + } + + >.secondary-label { + -fx-alignment: BASELINE_CENTER; + -fx-padding: $chronology-label-margin 0 0 0; + -fx-text-fill: $month-year-pane-color-fg; + } + } + + >.calendar-grid { + -fx-background-color: -color-bg-default; + -fx-padding: $content-padding-x; + + >.date-cell { + -fx-background-color: transparent; + -fx-padding: 0; + -fx-alignment: BASELINE_CENTER; + -fx-opacity: 1.0; + -fx-text-fill: -color-fg-default; + } + + >.week-number-cell { + -fx-padding: $cell-padding-y $cell-padding-x $cell-padding-y $cell-padding-x; + -fx-background-color: -color-bg-default; + -fx-text-fill: -color-accent-fg; + -fx-font-size: $day-name-font-size; + } + + >.day-cell { + -fx-padding: $cell-padding-y $cell-padding-x $cell-padding-y $cell-padding-x; + -fx-background-color: -color-bg-default; + + >.secondary-text { + -fx-fill: $chronology-fg; + } + + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + } + } + + .day-name-cell { + -fx-padding: $cell-padding-y $cell-padding-x $cell-padding-y $cell-padding-x; + -fx-font-size: $day-name-font-size; + } + + >.hijrah-day-cell { + -fx-alignment: TOP_LEFT; + -fx-padding: $chronology-cell-padding; + -fx-cell-size: $chronology-cell-size; + } + + >.today { + -fx-background-color: -color-accent-subtle; + -fx-text-fill: -color-accent-fg; + -fx-font-weight: bold; + } + } +} + +.inline-date-picker { + -fx-effect: none; + + >.month-year-pane { + -fx-alignment: CENTER; + -fx-spacing: 10px; + + >.button { + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-background-radius: 0; + -fx-cursor: hand; + } + + >.back-button { + >.left-arrow { + @include icons.get("chevron-left", false); + -fx-background-color: $month-year-pane-color-fg; + } + } + + >.forward-button { + >.right-arrow { + @include icons.get("chevron-right", false); + -fx-background-color: $month-year-pane-color-fg; + } + } + + >.label { + -fx-text-fill: $month-year-pane-color-fg; + -fx-font-size: $month-year-pane-font-size; + } + } + + &:disabled { + >.calendar-grid { + -fx-opacity: cfg.$opacity-disabled; + + // prevent opacity from being applied twice + >.day-cell { + &:disabled { + -fx-opacity: 1.0; + } + } + } + } +} + +.date-picker-popup>.calendar-grid>.selected, +.date-picker-popup>.calendar-grid>.selected>.secondary-text, +.date-picker-popup>.calendar-grid>.previous-month.selected, +.date-picker-popup>.calendar-grid>.next-month.selected { + -fx-background-color: -color-accent-emphasis; + -fx-text-fill: -color-fg-emphasis; + -fx-fill: -color-fg-emphasis; + -fx-font-weight: normal; +} + +.date-picker-popup>.calendar-grid>.day-cell:hover { + -fx-background-color: -color-bg-subtle; +} + +.date-picker-popup>.calendar-grid>.selected:hover { + -fx-background-color: -color-accent-emphasis; +} + +.date-picker-popup>.calendar-grid>.previous-month, +.date-picker-popup>.calendar-grid>.next-month, +.date-picker-popup>.calendar-grid>.previous-month.today, +.date-picker-popup>.calendar-grid>.next-month.today, +.date-picker-popup>.calendar-grid>.previous-month>.secondary-text, +.date-picker-popup>.calendar-grid>.next-month>.secondary-text { + -fx-text-fill: -color-fg-muted; + -fx-fill: -color-fg-muted; + -fx-font-weight: normal; +} \ No newline at end of file diff --git a/styles/src/components/_dialog.scss b/styles/src/components/_dialog.scss new file mode 100755 index 0000000..6858f48 --- /dev/null +++ b/styles/src/components/_dialog.scss @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; + +$padding-x: 1em !default; +$padding-y: 1em !default; + +$image-info: url("data:image/png;base64,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") !default; +$image-warning: url("data:image/png;base64,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") !default; +$image-error: url("data:image/png;base64,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") !default; +$image-confirm: url("data:image/png;base64,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") !default; + +.dialog-pane { + -fx-background-color: -color-bg-default; + -fx-padding: 0; + -fx-max-width: 600px; + + >.expandable-content { + -fx-padding: $padding-y $padding-x $padding-y $padding-x; + } + + >.button-bar>.container { + -fx-padding: calc($padding-y * 2) $padding-x $padding-y $padding-x; + + >.details-button { + -fx-padding: 0; + -fx-alignment: BASELINE_LEFT; + -fx-focus-traversable: false; + -fx-text-fill: -color-fg-default; + + &:hover { + -fx-underline: true; + } + } + } + + >.content { + -fx-padding: $padding-y $padding-x 0 $padding-x; + + &.label { + -fx-alignment: TOP_LEFT; + } + } + + &:header { + >.header-panel { + -fx-padding: $padding-y $padding-x $padding-y $padding-x; + -fx-background-color: -color-border-default, -color-bg-inset; + -fx-background-insets: 0, 0 0 cfg.$border-width 0; + + >.label { + -fx-wrap-text: true; + } + + >.graphic-container { + // this prevents the text in the header running directly into the graphic + -fx-padding: 0 0 0 $padding-x; + } + } + } + + &:no-header { + + >.content { + -fx-padding: $padding-y $padding-x 0 0; + } + + >*>.graphic-container { + -fx-padding: $padding-y $padding-x 0 $padding-x; + } + } + + &.information>.header-panel { + -fx-background-color: -color-accent-fg, -color-bg-subtle; + + >.label { + -fx-text-fill: -color-fg-default; + } + } + + &.warning>.header-panel { + -fx-background-color: -color-warning-fg, -color-bg-subtle; + + >.label { + -fx-text-fill: -color-fg-default; + } + } + + &.error>.header-panel { + -fx-background-color: -color-danger-fg, -color-bg-subtle; + + >.label { + -fx-text-fill: -color-fg-default; + } + } +} + +.alert.information.dialog-pane { + -fx-graphic: $image-info; +} + +.alert.warning.dialog-pane { + -fx-graphic: $image-warning; +} + +.alert.error.dialog-pane { + -fx-graphic: $image-error; +} + +.alert.confirmation.dialog-pane, +.text-input-dialog.dialog-pane, +.choice-dialog.dialog-pane { + -fx-graphic: $image-confirm; +} \ No newline at end of file diff --git a/styles/src/components/_html-editor.scss b/styles/src/components/_html-editor.scss new file mode 100755 index 0000000..098dfe5 --- /dev/null +++ b/styles/src/components/_html-editor.scss @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/utils"; +@use "sass:math"; + +$color-rect-size: 8px !default; + +.html-editor { + -fx-background-color: -color-border-default, -color-bg-default; + -fx-background-insets: 0, cfg.$border-width; + -fx-padding: calc(cfg.$border-width + 1px); + + &:contains-focus { + -fx-background-color: -color-accent-emphasis, -color-bg-default; + } + + .tool-bar { + -fx-padding: 4px; + } + + .button, + .toggle-button { + -fx-background-insets: 0; + } + + .toggle-button { + -color-button-bg-selected: utils.saturate(-color-button-bg, cfg.$darkMode, cfg.$color-delta-active); + -color-button-border-focused: transparent; + } +} + +.color-picker { + &.html-editor-foreground { + -fx-color-rect-x: 0; + -fx-color-rect-y: -#{math.div($color-rect-size, 2)}; + -fx-color-rect-width: $color-rect-size; + -fx-color-rect-height: $color-rect-size; + -fx-color-label-visible: false; + } + + &.html-editor-background { + -fx-color-rect-x: 0; + -fx-color-rect-y: -#{math.div($color-rect-size, 2)}; + -fx-color-rect-width: $color-rect-size; + -fx-color-rect-height: $color-rect-size; + -fx-color-label-visible: false; + } + + &.html-editor-foreground>.color-picker-label>.picker-color>.picker-color-rect, + &.html-editor-background>.color-picker-label>.picker-color>.picker-color-rect { + -fx-stroke: none; + } +} + +// Sadly JavaFX devs have a mania to declare everyting private and final. +// The below code isn't working, while there are no runtime errors and URLs are correct +// it's still not loaded for unknown reason. +// There are to many images here and HMTLEditor itself is obsolete type of control, +// so I don't want to use data-url. It's either be fixed at OpenJFX or not. +// Anyone who treats this as a problem can easily fix it by using addtitional CSS file. +// Just copy CSS rules from below and images from the OpenJFX repo and then use relative +// URLs. #javafx-bug +$image-path: "/com/sun/javafx/scene/control/skin/modena" !default; + +.color-picker.html-editor-foreground { + -fx-graphic: url("#{$image-path}/HTMLEditor-Text-Color.png"); +} + +.color-picker.html-editor-background { + -fx-graphic: url("#{$image-path}/HTMLEditor-Background-Color.png"); +} + +.html-editor-cut { + -fx-graphic: url("#{$image-path}/HTMLEditor-Cut.png"); +} + +.html-editor-copy { + -fx-graphic: url("#{$image-path}/HTMLEditor-Copy.png"); +} + +.html-editor-paste { + -fx-graphic: url("#{$image-path}/HTMLEditor-Paste.png"); +} + +.html-editor-align-left { + -fx-graphic: url("#{$image-path}/HTMLEditor-Left.png"); +} + +.html-editor-align-center { + -fx-graphic: url("#{$image-path}/HTMLEditor-Center.png"); +} + +.html-editor-align-right { + -fx-graphic: url("#{$image-path}/HTMLEditor-Right.png"); +} + +.html-editor-align-justify { + -fx-graphic: url("#{$image-path}/HTMLEditor-Justify.png"); +} + +.html-editor-outdent { + -fx-graphic: url("#{$image-path}/HTMLEditor-Outdent.png"); +} + +.html-editor-outdent:dir(rtl) { + -fx-graphic: url("#{$image-path}/HTMLEditor-Outdent-rtl.png"); +} + +.html-editor-indent { + -fx-graphic: url("#{$image-path}/HTMLEditor-Indent.png"); +} + +.html-editor-indent:dir(rtl) { + -fx-graphic: url("#{$image-path}/HTMLEditor-Indent-rtl.png"); +} + +.html-editor-bullets { + -fx-graphic: url("#{$image-path}/HTMLEditor-Bullets.png"); +} + +.html-editor-bullets:dir(rtl) { + -fx-graphic: url("#{$image-path}/HTMLEditor-Bullets-rtl.png"); +} + +.html-editor-numbers { + -fx-graphic: url("#{$image-path}/HTMLEditor-Numbered.png"); +} + +.html-editor-numbers:dir(rtl) { + -fx-graphic: url("#{$image-path}/HTMLEditor-Numbered-rtl.png"); +} + +.html-editor-bold { + -fx-graphic: url("#{$image-path}/HTMLEditor-Bold.png"); +} + +.html-editor-italic { + -fx-graphic: url("#{$image-path}/HTMLEditor-Italic.png"); +} + +.html-editor-underline { + -fx-graphic: url("#{$image-path}/HTMLEditor-Underline.png"); +} + +.html-editor-strike { + -fx-graphic: url("#{$image-path}/HTMLEditor-Strikethrough.png"); +} + +.html-editor-hr { + -fx-graphic: url("#{$image-path}/HTMLEditor-Break.png"); +} \ No newline at end of file diff --git a/styles/src/components/_hyperlink.scss b/styles/src/components/_hyperlink.scss new file mode 100755 index 0000000..f84211d --- /dev/null +++ b/styles/src/components/_hyperlink.scss @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config"as cfg; + +.hyperlink { + -fx-cursor: hand; + -fx-underline: true; + -fx-text-fill: -color-accent-fg; + + &:visited { + -fx-text-fill: -color-fg-default; + } + + &:armed { + -fx-text-fill: -color-fg-default; + -fx-underline: false; + } + + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + } + + &:show-mnemonics>.mnemonic-underline { + -fx-stroke: -fx-text-fill; + } +} \ No newline at end of file diff --git a/styles/src/components/_index.scss b/styles/src/components/_index.scss new file mode 100755 index 0000000..ded6d1f --- /dev/null +++ b/styles/src/components/_index.scss @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT + +@use "accordion"; +@use "breadcrumbs"; +@use "button"; +@use "chart"; +@use "checkbox"; +@use "color-picker"; +@use "combo-box"; +@use "custom-text-field"; +@use "data"; +@use "date-picker"; +@use "dialog"; +@use "html-editor"; +@use "hyperlink"; +@use "label"; +@use "menu"; +@use "menu-button"; +@use "pagination"; +@use "popover"; +@use "progress"; +@use "radio"; +@use "scrolling"; +@use "separator"; +@use "slider"; +@use "spinner"; +@use "split-pane"; +@use "tab-pane"; +@use "text-input"; +@use "titled-pane"; +@use "toggle-button"; +@use "toggle-switch"; +@use "toolbar"; +@use "tooltip"; \ No newline at end of file diff --git a/styles/src/components/_label.scss b/styles/src/components/_label.scss new file mode 100755 index 0000000..a7ff83f --- /dev/null +++ b/styles/src/components/_label.scss @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; + +.label { + -fx-text-fill: -color-fg-default; + + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + } + + &:show-mnemonics>.mnemonic-underline { + -fx-stroke: -color-fg-default; + } +} \ No newline at end of file diff --git a/styles/src/components/_menu-button.scss b/styles/src/components/_menu-button.scss new file mode 100644 index 0000000..74a1551 --- /dev/null +++ b/styles/src/components/_menu-button.scss @@ -0,0 +1,147 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/icons"; +@use "button"; + +$arrow-button-width: 0.5em !default; +$separator-width: 0.75px !default; + +.menu-button, +.split-menu-button { + @include button.base(); + + -fx-padding: 0; + -fx-alignment: CENTER_LEFT; + + >.label { + -fx-padding: cfg.$padding-y cfg.$padding-x cfg.$padding-y cfg.$padding-x; + -fx-text-fill: -color-button-fg; + } + + >.arrow-button { + -fx-padding: cfg.$padding-y cfg.$padding-x cfg.$padding-y 0; + + >.arrow { + @include icons.get("chevron-right", false); + -fx-background-color: -color-button-fg; + -fx-min-width: $arrow-button-width; + } + } + + // "vertically" means popup side (either top or bottom), + // so, it's actually default state + &:openvertically { + >.arrow-button { + >.arrow { + @include icons.get("expand-more", false); + } + } + } + + &:show-mnemonics { + >.label { + >.mnemonic-underline { + -fx-stroke: -color-button-fg; + } + } + } + + &.button-icon { + -fx-padding: 0; + } + + &:hover { + -fx-background-color: -color-button-border-hover, -color-button-bg-hover; + + >.label { + -fx-text-fill: -color-button-fg-hover; + } + + >.arrow-button>.arrow { + -fx-background-color: -color-button-fg-hover; + } + + #{cfg.$font-icon-selector} { + -fx-icon-color: -color-button-fg-hover; + } + } + + &:focused { + -fx-background-color: -color-button-border-focused, -color-button-bg-focused; + + >.label { + -fx-text-fill: -color-button-fg-focused; + } + + >.arrow-button>.arrow { + -fx-background-color: -color-button-fg-focused; + } + + #{cfg.$font-icon-selector} { + -fx-icon-color: -color-button-fg-focused; + } + } + + &:armed, + &:focused:armed { + -fx-background-color: -color-button-border-pressed, -color-button-bg-pressed; + -fx-text-fill: -color-button-fg-pressed; + + >.label { + -fx-text-fill: -color-button-fg-pressed; + } + + >.arrow-button>.arrow { + -fx-background-color: -color-button-fg-pressed; + } + + #{cfg.$font-icon-selector} { + -fx-icon-color: -color-button-fg-pressed; + } + } + + &.flat { + @include button.flat(); + + &:armed, + &:focused:armed { + >.label { + -fx-underline: true; + } + } + } + + &.accent { + @include button.accent(); + } + + &.success { + @include button.success(); + } + + &.danger { + @include button.danger(); + } +} + +.split-menu-button { + + >.label { + -fx-padding: cfg.$padding-y calc(cfg.$padding-x / 2) cfg.$padding-y cfg.$padding-x; + } + + &.button-outlined:hover { + >.arrow-button { + -color-button-fg: -color-fg-emphasis; + } + } + + >.arrow-button { + -fx-padding: cfg.$padding-y cfg.$padding-x cfg.$padding-y cfg.$padding-x; + -fx-background-radius: 0 cfg.$border-radius cfg.$border-radius 0; + -fx-border-color: -color-button-fg; + -fx-border-width: 0 0 0 $separator-width; + -fx-border-insets: calc(cfg.$border-width + 6px) 0 calc(cfg.$border-width + 6px) 0; + } +} \ No newline at end of file diff --git a/styles/src/components/_menu.scss b/styles/src/components/_menu.scss new file mode 100755 index 0000000..c17fe54 --- /dev/null +++ b/styles/src/components/_menu.scss @@ -0,0 +1,194 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/effects"; +@use "../settings/icons"; +@use "../settings/utils"; + +/////////////////////////////////////////////////////////////////////////////// +// MenuBar // +/////////////////////////////////////////////////////////////////////////////// + +$color-menubar-bg: -color-bg-subtle !default; +$color-menubar-bg-hover: utils.saturate($color-menubar-bg, cfg.$darkMode, cfg.$color-delta-hover) !default; +$color-menuitem-bg: -color-bg-default !default; +$color-menuitem-bg-hover: utils.saturate($color-menuitem-bg, cfg.$darkMode, cfg.$color-delta-hover) !default; + +$separator-padding: map-get(cfg.$separators, "small") !default; + +.menu-bar { + + -fx-background-color: -color-border-muted, $color-menubar-bg; + -fx-background-insets: 0 0 0 0, 0 0 1 0; + -fx-background-radius: 0; + -fx-padding: 0; + + >.container { + >.menu-button { + -fx-background-color: transparent; + -fx-background-insets: 0 0 cfg.$border-width 0; + -fx-background-radius: 0; + -fx-padding: cfg.$menu-padding-y cfg.$menu-padding-x cfg.$menu-padding-y cfg.$menu-padding-x; + + // reset padding of menu buttons when in menu bar + >.label { + -fx-padding: 0; + -fx-text-fill: -color-fg-default; + } + + // hide the down arrow for a menu placed in a menubar + >.arrow-button { + -fx-padding: 0; + + >.arrow { + -fx-padding: 0; + -fx-background-color: transparent; + -fx-shape: null; + } + } + + &:hover, + &:focused, + &:showing { + -fx-background-color: $color-menubar-bg-hover, $color-menubar-bg-hover; + } + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// Menu // +/////////////////////////////////////////////////////////////////////////////// + +.menu { + + -fx-background-color: transparent; + + >.right-container { + >.arrow { + @include icons.get("chevron-right", false); + -fx-background-color: -color-fg-muted; + } + } +} + +// vertical (scroll) arrows appear if menu height exceeds container size +.menu-up-arrow { + @include icons.get("arrow-drop-up", true); + -fx-background-color: -color-fg-muted; + -fx-padding: 3px 4px 3px 4px; +} + +.menu-down-arrow { + @include icons.get("arrow-drop-down", true); + -fx-background-color: -color-fg-muted; + -fx-padding: 3px 4px 3px 4px; +} + +/////////////////////////////////////////////////////////////////////////////// +// MenuItem // +/////////////////////////////////////////////////////////////////////////////// + +.menu-item { + -fx-background-color: $color-menuitem-bg; + -fx-padding: cfg.$menu-padding-y cfg.$menu-padding-x cfg.$menu-padding-y cfg.$menu-padding-x; + + >.graphic-container { + -fx-padding: 0 cfg.$graphic-gap 0 0; + } + + // affects both menu and hotkey labels text + >.label { + -fx-padding: 0 1em 0 0; + -fx-text-fill: -color-fg-default; + } + + // left container is for checkbox and radio icons + >.left-container { + -fx-padding: 0 1em 0 0; + } + + // right container is for submenu indication, + // note that hotkey is only displayed when submenu isn't present + >.right-container { + -fx-padding: 0 0 0 0.5em; + } + + &:focused { + -fx-background-color: $color-menuitem-bg-hover, $color-menuitem-bg-hover; + } + + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + } +} + +.radio-menu-item:checked>.left-container>.radio, +.check-menu-item:checked>.left-container>.check { + @include icons.get("check", true); + -fx-background-color: -color-fg-muted; + -fx-min-height: cfg.$checkbox-mark-size; + -fx-min-width: cfg.$checkbox-mark-size; + -fx-max-height: cfg.$checkbox-mark-size; + -fx-max-width: cfg.$checkbox-mark-size; +} + +.custom-menu-item.heading { + -fx-padding: cfg.$menu-padding-y cfg.$menu-padding-x cfg.$menu-padding-y cfg.$menu-padding-x; + + &:hover, + &:focused, + &:pressed { + -fx-background-color: transparent; + } + + >.label { + >.text { + -fx-font-weight: bold; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// PopupMenu // +/////////////////////////////////////////////////////////////////////////////// + +.context-menu { + -fx-background-color: -color-border-muted, $color-menuitem-bg; + -fx-background-insets: 0, 1; + -fx-padding: cfg.$popup-padding-y cfg.$popup-padding-x cfg.$popup-padding-y cfg.$popup-padding-x; + -fx-background-radius: cfg.$border-radius; + @include effects.shadow(-color-bg-inset, cfg.$popup-shadow); + + // no idea what's that thing and how to trigger its appearance + >.scroll-arrow { + -fx-padding: 0.5em; + -fx-background-color: transparent; + + &:hover { + -fx-background-color: $color-menuitem-bg-hover; + -fx-text-fill: -color-fg-default; + } + } + + // use border instead of insets to get thinner line. + .separator:horizontal { + -fx-padding: $separator-padding 0 $separator-padding 0; + + .line { + -fx-border-color: -color-border-muted transparent transparent transparent; + -fx-border-insets: cfg.$border-width 0.5em 0 0.5em; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +// Mnemonics // +/////////////////////////////////////////////////////////////////////////////// + +.context-menu:show-mnemonics>.mnemonic-underline, +.menu:show-mnemonics>.mnemonic-underline, +.menu-bar:show-mnemonics>.mnemonic-underline, +.menu-item>.label:show-mnemonics>.mnemonic-underline { + -fx-stroke: -color-fg-default; +} diff --git a/styles/src/components/_pagination.scss b/styles/src/components/_pagination.scss new file mode 100755 index 0000000..eaae417 --- /dev/null +++ b/styles/src/components/_pagination.scss @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/icons"; + +.pagination { + -fx-padding: 0; + -fx-arrow-button-gap: 4; + -fx-arrows-visible: true; + -fx-tooltip-visible: false; + -fx-page-information-visible: true; + -fx-page-information-alignment: bottom; + + >.page { + -fx-background-color: transparent; + } + + >.pagination-control { + -fx-background-color: transparent; + -fx-font-size: 1em; + + >.control-box { + -fx-padding: 2em 0 0 0; + -fx-spacing: 2; + -fx-alignment: CENTER; + + .number-button { + -fx-padding: 0; + } + + >.left-arrow-button { + >.left-arrow { + @include icons.get("arrow-left", false); + -fx-background-color: -color-fg-default; + } + } + + >.right-arrow-button { + >.right-arrow { + @include icons.get("arrow-right", false); + -fx-background-color: -color-fg-default; + } + } + } + + >.page-information { + -fx-padding: 0.5em 0 0 0; + } + } + + // Pagination.STYLE_CLASS_BULLET + &.bullet { + >.pagination-control { + + >.control-box { + -fx-spacing: 0; + + >.left-arrow-button { + -fx-background-radius: 10em; + -fx-padding: 0 0.25em 0 0.083em; // center arrow inside the circle + } + + >.right-arrow-button { + -fx-background-radius: 10em; + -fx-padding: 0 0.083em 0 0.25em; // center arrow inside the circle + } + + >.bullet-button { + -fx-background-radius: 0, 10em, 10em; + -fx-background-color: transparent, -color-border-default, -color-bg-inset; + -fx-background-insets: 0, 5, 6; + + &:selected { + -fx-background-color: transparent, -color-accent-emphasis; + } + } + } + } + } +} \ No newline at end of file diff --git a/styles/src/components/_popover.scss b/styles/src/components/_popover.scss new file mode 100644 index 0000000..718254f --- /dev/null +++ b/styles/src/components/_popover.scss @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/effects"; + +$padding-x: 1em !default; +$padding-y: 1em !default; + +.popover { + -fx-background-color: -color-bg-default; + + >.border { + -fx-stroke: -color-border-default; + -fx-stroke-width: cfg.$border-width; + @include effects.shadow(-color-bg-inset, cfg.$popup-shadow); + } + + >.content { + -fx-padding: $padding-y $padding-x $padding-y $padding-x; + + >.title { + -fx-padding: 0 0 1em 0; + + >.text { + -fx-text-fill: -color-fg-default; + -fx-font-size: cfg.$font-title-4; + -fx-alignment: CENTER_LEFT; + } + + >.icon { + >.graphics { + >.circle { + -fx-fill: transparent; + } + + >.line { + -fx-stroke: -color-fg-default; + -fx-stroke-width: cfg.$border-width; + } + } + } + } + } +} \ No newline at end of file diff --git a/styles/src/components/_progress.scss b/styles/src/components/_progress.scss new file mode 100755 index 0000000..b729a40 --- /dev/null +++ b/styles/src/components/_progress.scss @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/icons"; + +/////////////////////////////////////////////////////////////////////////////// +// ProgressBar // +/////////////////////////////////////////////////////////////////////////////// + +$size: ( + "small": 2px, + "medium": 0.4em, + "large": 0.8em +) !default; + +.progress-bar { + + -fx-indeterminate-bar-length: 60; + -fx-indeterminate-bar-escape: true; + -fx-indeterminate-bar-flip: true; + -fx-indeterminate-bar-animation-time: 2; + + >.track { + -fx-background-color: -color-bg-subtle; + -fx-background-insets: 0; + -fx-background-radius: cfg.$border-radius; + } + + >.bar { + -fx-background-color: -color-accent-emphasis; + -fx-background-insets: 0; + -fx-background-radius: cfg.$border-radius; + -fx-padding: map-get($size, "medium"); + } + + &.small { + >.bar { + -fx-padding: map-get($size, "small"); + } + } + + &.medium { + >.bar { + -fx-padding: map-get($size, "medium"); + } + } + + &.large { + >.bar { + -fx-padding: map-get($size, "large"); + } + } + + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// ProgressIndicator // +/////////////////////////////////////////////////////////////////////////////// + +.progress-indicator { + + -fx-indeterminate-segment-count: 12; + -fx-spin-enabled: true; + + >.determinate-indicator { + >.indicator { + -fx-background-color: -color-border-default, -color-bg-default; + -fx-background-insets: 0, 1; + } + + >.progress { + -fx-background-color: -color-accent-emphasis; + -fx-padding: 0.6em; // limits tick size + } + + >.tick { + -fx-background-color: -color-fg-emphasis; + -fx-background-insets: 0; + @include icons.get("check"); + } + + >.percentage { + -fx-font-size: cfg.$font-small; + -fx-fill: -color-fg-default; + } + + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + } + } + + &:indeterminate { + >.spinner { + // undo styling from .spinner + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-background-radius: 0; + -fx-border-color: transparent; + -fx-border-width: 0; + -fx-border-radius: 0; + -fx-padding: 0; + } + + .segment { + -fx-background-color: -color-accent-emphasis; + } + + .segment0 { + -fx-shape: "M41.98 14.74 a3.5,3.5 0 1,1 0,1 Z"; + } + + .segment1 { + -fx-shape: "M33.75 6.51 a3.5,3.5 0 1,1 0,1 Z"; + } + + .segment2 { + -fx-shape: "M22.49 3.5 a3.5,3.5 0 1,1 0,1 Z"; + } + + .segment3 { + -fx-shape: "M11.24 6.51 a3.5,3.5 0 1,1 0,1 Z"; + } + + .segment4 { + -fx-shape: "M3.01 14.74 a3.5,3.5 0 1,1 0,1 Z"; + } + + .segment5 { + -fx-shape: "M0.0 26.0 a3.5,3.5 0 1,1 0,1 Z"; + } + + .segment6 { + -fx-shape: "M3.01 37.25 a3.5,3.5 0 1,1 0,1 Z"; + } + + .segment7 { + -fx-shape: "M11.25 45.48 a3.5,3.5 0 1,1 0,1 Z"; + } + + .segment8 { + -fx-shape: "M22.5 48.5 a3.5,3.5 0 1,1 0,1 Z"; + } + + .segment9 { + -fx-shape: "M33.75 45.48 a3.5,3.5 0 1,1 0,1 Z"; + } + + .segment10 { + -fx-shape: "M41.98 37.25 a3.5,3.5 0 1,1 0,1 Z"; + } + + .segment11 { + -fx-shape: "M45.0 26.0 a3.5,3.5 0 1,1 0,1 Z"; + } + } +} \ No newline at end of file diff --git a/styles/src/components/_radio.scss b/styles/src/components/_radio.scss new file mode 100755 index 0000000..da44f0a --- /dev/null +++ b/styles/src/components/_radio.scss @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; + +.radio-button { + + // applied to label + -fx-background-color: -color-bg-default; + -fx-text-fill: -color-fg-default; + -fx-label-padding: cfg.$checkbox-label-padding cfg.$checkbox-label-padding cfg.$checkbox-label-padding cfg.$graphic-gap; + + >.radio { + -fx-background-color: -color-fg-default, -color-bg-default; + -fx-background-insets: 0, cfg.$border-width; + -fx-background-radius: 1em; // large value to make sure this remains circular + -fx-padding: cfg.$checkbox-mark-padding-y; + -fx-alignment: CENTER; + + >.dot { + -fx-background-color: transparent; + -fx-background-radius: 1em; // large value to make sure this remains circular + -fx-min-height: cfg.$checkbox-mark-size; + -fx-max-height: cfg.$checkbox-mark-size; + -fx-min-width: cfg.$checkbox-mark-size; + -fx-max-width: cfg.$checkbox-mark-size; + } + } + + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + + >.radio { + -fx-opacity: cfg.$opacity-disabled; + } + } + + &:selected { + >.radio { + -fx-background-color: -color-accent-emphasis, -color-bg-default; + + >.dot { + -fx-background-color: -color-accent-emphasis; + } + } + } + + &:show-mnemonics>.mnemonic-underline { + -fx-stroke: -color-fg-default; + } +} \ No newline at end of file diff --git a/styles/src/components/_scrolling.scss b/styles/src/components/_scrolling.scss new file mode 100755 index 0000000..c44533e --- /dev/null +++ b/styles/src/components/_scrolling.scss @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; + +/////////////////////////////////////////////////////////////////////////////// +// ScrolBar // +/////////////////////////////////////////////////////////////////////////////// + +$scrollbar-thickness: 8px !default; +$thumb-radius: cfg.$border-radius !default; + +.scroll-bar { + + -fx-background-color: cfg.$scrollbar-color-track; + -fx-opacity: cfg.$scrollbar-opacity-inactive; + + >.thumb { + -fx-background-color: cfg.$scrollbar-color-thumb; + -fx-background-radius: $thumb-radius; + } + + >.track { + -fx-background-color: transparent; + -fx-border-radius: 0; + } + + // hide archaic (arguably) increment and decrement buttons + >.increment-button { + visibility: hidden; + -fx-managed: false; + + >.increment-arrow { + -fx-shape: " "; + -fx-padding: 0; + } + } + + >.decrement-button { + visibility: hidden; + -fx-managed: false; + + >.decrement-arrow { + -fx-shape: " "; + -fx-padding: 0; + } + } + + &:horizontal { + -fx-pref-height: $scrollbar-thickness; + } + + &:vertical { + -fx-pref-width: $scrollbar-thickness; + } + + &:hover, + &:pressed, + &:focused { + -fx-opacity: 1; + } +} + +/////////////////////////////////////////////////////////////////////////////// +// ScrollPane // +/////////////////////////////////////////////////////////////////////////////// + +// NOTE: edge-to-edge style class was removed, because it's default now. +// Any control that needs scroll pane with borders should draw them by yourself. +.scroll-pane { + + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-background-radius: 0; + -fx-padding: 0; + + >.viewport { + -fx-background-color: transparent; + } + + >.corner { + -fx-background-color: cfg.$scrollbar-color-track; + -fx-opacity: cfg.$scrollbar-opacity-inactive; + } + + &:disabled { + >.scroll-bar { + -fx-opacity: cfg.$scrollbar-opacity-disabled; + } + } +} \ No newline at end of file diff --git a/styles/src/components/_separator.scss b/styles/src/components/_separator.scss new file mode 100755 index 0000000..3615684 --- /dev/null +++ b/styles/src/components/_separator.scss @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; + +$padding: map-get(cfg.$separators, "medium") !default; +$line-width: cfg.$border-width !default; +$line-color: -color-border-muted !default; + +.separator { + + &:horizontal { + -fx-padding: $padding 0 $padding 0; + + // using border instead of insets to get thinner line + >.line { + -fx-border-color: $line-color transparent transparent transparent; + -fx-border-insets: $line-width 0 0 0; + } + } + + &:vertical { + -fx-padding: 0 $padding 0 $padding; + + >.line { + -fx-border-color: transparent transparent transparent $line-color; + -fx-border-insets: 0 0 0 $line-width; + } + } + + @each $size, $padding in cfg.$separators { + &.#{$size}:horizontal { + -fx-padding: $padding 0 $padding 0; + } + + &.#{$size}:vertical { + -fx-padding: 0 $padding 0 $padding; + } + } +} \ No newline at end of file diff --git a/styles/src/components/_slider.scss b/styles/src/components/_slider.scss new file mode 100755 index 0000000..076e999 --- /dev/null +++ b/styles/src/components/_slider.scss @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "sass:math"; + +$thumb-size: 8px !default; +$thumb-border-width: 2px !default; +$track-size: $thumb-size !default; // visual track height (or width) +$track-margin: 6px !default; // increases clickable track area +$tick-major-size: 5px !default; +$tick-minor-size: 3px !default; + +$_track-padding: math.div($track-size + $track-margin, 2); + +.slider { + + >.thumb { + -fx-background-color: -color-accent-emphasis, -color-bg-default; + -fx-background-insets: 0, 2px; + -fx-background-radius: 50; + -fx-padding: $thumb-size; + } + + >.track { + // transparent background increases clickable track area without increasing visual track height, + // it's also used to center track with thumb + -fx-background-color: transparent, -color-accent-emphasis; + -fx-background-radius: cfg.$border-radius; + } + + // center thumb over track horizontally + &:horizontal { + >.track { + -fx-padding: $_track-padding 0 $_track-padding 0; + -fx-background-insets: 0, $track-margin 0 $track-margin 0; + } + } + + // center thumb over track vertically + &:vertical { + >.track { + -fx-padding: 0 $_track-padding 0 $_track-padding; + -fx-background-insets: 0, 0 $track-margin 0 $track-margin; + } + } + + // there's slightly noticable difference between axis length and track length, + // wontfix this via CSS, because it's probably JavaFX calc problem + >.axis { + -fx-tick-label-fill: -color-fg-muted; + -fx-tick-length: $tick-major-size; + -fx-minor-tick-length: $tick-minor-size; + + >.axis-tick-mark, + >.axis-minor-tick-mark { + -fx-stroke: -color-fg-muted; + } + } + + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + } +} \ No newline at end of file diff --git a/styles/src/components/_spinner.scss b/styles/src/components/_spinner.scss new file mode 100755 index 0000000..d972653 --- /dev/null +++ b/styles/src/components/_spinner.scss @@ -0,0 +1,186 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/icons"; +@use "../settings/utils"; + +$button-bg: -color-bg-inset !default; +$button-fg: -color-fg-default !default; +$button-hover: utils.saturate($button-bg, cfg.$darkMode, cfg.$color-delta-hover) !default; +$icon-padding-x: 0.25em !default; + +.spinner { + -fx-background-color: -color-bg-default; + -fx-border-color: -color-border-default; + -fx-border-radius: cfg.$border-radius; + -fx-border-width: cfg.$border-width; + + >.text-field { + -fx-background-radius: cfg.$border-radius 0 0 cfg.$border-radius; + -fx-background-insets: 0; + // align spinner (uses border) and text input height (uses background insets) + -fx-padding: calc(cfg.$padding-y - cfg.$border-width) + calc(cfg.$padding-x - cfg.$border-width) + calc(cfg.$padding-y - cfg.$border-width) + calc(cfg.$padding-x - cfg.$border-width); + } + + >.increment-arrow-button { + -fx-background-color: $button-bg; + -fx-background-insets: 0; + -fx-background-radius: 0 cfg.$border-radius 0 0; + -fx-padding: 10px; + + &:hover { + -fx-background-color: $button-hover; + } + + >.increment-arrow { + -fx-background-color: $button-fg; + -fx-background-insets: 0; + -fx-padding: 0 $icon-padding-x 0 $icon-padding-x; + @include icons.get("arrow-drop-up", false); + } + } + + >.decrement-arrow-button { + -fx-background-color: $button-bg; + -fx-background-insets: -1 0 0 0; + -fx-background-radius: 0 0 cfg.$border-radius 0; + -fx-padding: 10px; + + &:hover { + -fx-background-color: $button-hover; + } + + >.decrement-arrow { + -fx-background-color: $button-fg; + -fx-background-insets: 0; + -fx-padding: 0 $icon-padding-x 0 $icon-padding-x; + @include icons.get("arrow-drop-down", false); + } + } + + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + } + + &:focused, + &:contains-focus { + &:focused { + -fx-border-color: -color-accent-emphasis; + } + } + + &.arrows-on-left-vertical { + >.text-field { + -fx-background-radius: 0 cfg.$border-radius cfg.$border-radius 0; + -fx-alignment: CENTER_RIGHT; + } + + >.increment-arrow-button { + -fx-background-radius: cfg.$border-radius 0 0 0; + } + + >.decrement-arrow-button { + -fx-background-radius: 0 0 0 cfg.$border-radius; + } + } + + &.arrows-on-right-horizontal { + >.increment-arrow-button { + -fx-background-radius: 0 cfg.$border-radius cfg.$border-radius 0; + -fx-background-insets: 0; + + >.increment-arrow { + @include icons.get("plus", false); + } + } + + >.decrement-arrow-button { + -fx-background-radius: 0; + -fx-background-insets: 0; + + >.decrement-arrow { + @include icons.get("minus", false); + } + } + } + + &.arrows-on-left-horizontal { + >.text-field { + -fx-background-radius: 0 cfg.$border-radius cfg.$border-radius 0; + -fx-alignment: CENTER_RIGHT; + } + + >.increment-arrow-button { + -fx-background-radius: 0; + -fx-background-insets: 0; + + >.increment-arrow { + @include icons.get("plus", false); + } + } + + >.decrement-arrow-button { + -fx-background-radius: cfg.$border-radius 0 0 cfg.$border-radius; + -fx-background-insets: 0; + + >.decrement-arrow { + @include icons.get("minus", false); + } + } + } + + &.split-arrows-horizontal { + >.text-field { + -fx-background-radius: 0; + -fx-alignment: CENTER; + } + + >.increment-arrow-button { + -fx-background-radius: 0 cfg.$border-radius cfg.$border-radius 0; + -fx-background-insets: 0 -1 0 0; + + >.increment-arrow { + @include icons.get("plus", false); + } + } + + >.decrement-arrow-button { + -fx-background-radius: cfg.$border-radius 0 0 cfg.$border-radius; + -fx-background-insets: 0; + + >.decrement-arrow { + @include icons.get("minus", false); + } + } + } + + &.split-arrows-vertical { + >.text-field { + -fx-background-radius: 0; + -fx-alignment: CENTER; + } + + >.increment-arrow-button { + -fx-background-radius: cfg.$border-radius cfg.$border-radius 0 0; + -fx-background-insets: 0; + + >.increment-arrow { + @include icons.get("plus", false); + -fx-padding: $icon-padding-x 0 $icon-padding-x 0; + } + } + + >.decrement-arrow-button { + -fx-background-radius: 0 0 cfg.$border-radius cfg.$border-radius; + -fx-background-insets: 0 0 -1 0; + + >.decrement-arrow { + @include icons.get("minus", false); + -fx-padding: $icon-padding-x 0 $icon-padding-x 0; + } + } + } +} \ No newline at end of file diff --git a/styles/src/components/_split-pane.scss b/styles/src/components/_split-pane.scss new file mode 100755 index 0000000..37f5c02 --- /dev/null +++ b/styles/src/components/_split-pane.scss @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; + +$divider-thickness: 2px !default; +$grabber-length: 10px !default; + +.split-pane { + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-padding: 0; + + >.split-pane-divider { + -fx-background-color: cfg.$scrollbar-color-track; + -fx-padding: 0 $divider-thickness 0 $divider-thickness; + -fx-opacity: cfg.$scrollbar-opacity-inactive; + + // Just for example, this is how we can increase grab area without increasing divider width. + // Sadly, it's only appropriate when split pane items are allowed to have horizontal padding. + //-fx-border-color: color.$background; + //-fx-border-width: 0 5 0 5; + + >.horizontal-grabber { + -fx-background-color: cfg.$scrollbar-color-thumb; + -fx-padding: $grabber-length $divider-thickness $grabber-length $divider-thickness; + } + + >.vertical-grabber { + -fx-background-color: cfg.$scrollbar-color-thumb; + -fx-padding: $divider-thickness $grabber-length $divider-thickness $grabber-length; + } + + &:pressed { + -fx-background-color: -color-accent-emphasis; + + >.horizontal-grabber, + >.vertical-grabber { + -fx-background-color: -color-accent-emphasis; + } + } + + &:hover { + -fx-opacity: 1; + } + + &:disabled { + -fx-opacity: cfg.$scrollbar-opacity-disabled; + } + } +} \ No newline at end of file diff --git a/styles/src/components/_tab-pane.scss b/styles/src/components/_tab-pane.scss new file mode 100755 index 0000000..b3f0827 --- /dev/null +++ b/styles/src/components/_tab-pane.scss @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/effects"; +@use "../settings/icons"; + +$tab-padding-x: cfg.$padding-x !default; +$tab-padding-y: 0.6em !default; +$border-width: 2px !default; + +.tab-pane { + + >.tab-header-area { + -fx-background-insets: 0; + -fx-background-color: -color-bg-default; + -fx-alignment: CENTER; + + >.tab-header-background { + -fx-background-color: transparent; + } + + >.headers-region > .tab { + -fx-padding: $tab-padding-y $tab-padding-x $tab-padding-y $tab-padding-x; + + &:top { + -fx-background-insets: 0 0 0 0, 0 0 $border-width 0; + -fx-background-color: -color-border-default, -color-bg-default; + } + + &:bottom { + -fx-background-insets: 0 0 0 0, 0 0 $border-width 0; + -fx-background-color: -color-border-default, -color-bg-default; + + >.control-buttons-tab > .container > .tab-down-button { + -fx-padding: -0.25em 0.25em 0.25em 0.25em; + } + } + + >.tab-container { + >.tab-label { + -fx-alignment: CENTER; + -fx-text-fill: -color-fg-default; + -fx-padding: 0 5px 0 0; // close button padding + + >* { + -fx-fill: -color-fg-default; + -fx-icon-color: -color-fg-default; + } + } + + >.tab-close-button { + -fx-background-color: -color-fg-default; + -fx-shape: "M 0,0 H1 L 4,3 7,0 H8 V1 L 5,4 8,7 V8 H7 L 4,5 1,8 H0 V7 L 3,4 0,1 Z"; + -fx-scale-shape: false; + + &:hover { + @include effects.highlight(-color-fg-default, 1); + } + } + } + + &:hover { + -fx-background-color: -color-border-default, -color-bg-inset; + } + + &:top:selected, + &:bottom:selected { + -fx-background-color: -color-accent-emphasis, -color-bg-default; + + >.tab-container { + >.tab-label { + -fx-fill: -color-accent-fg; + -fx-text-fill: -color-accent-fg; + + >* { + -fx-fill: -color-accent-fg; + -fx-icon-color: -color-accent-fg; + } + } + + >.tab-close-button { + -fx-background-color: -color-accent-fg; + } + } + } + + // order matters, as JavaFX CSS doesn't support not() selector, + // 'disabled' have to be applied after 'hover' and 'selected' + &:disabled { + -fx-background-color: -color-border-default, -color-bg-default; + + >.tab-container { + -fx-opacity: cfg.$opacity-disabled; + } + } + + // vertical tabs + &:left, + &:right { + -fx-background-insets: 0; + -fx-background-color: transparent; + + &:hover { + -fx-background-color: -color-bg-default; + + >.tab-container { + >.tab-label { + -fx-text-fill: -color-fg-default; + } + + >.tab-close-button { + -fx-background-color: -color-fg-default; + } + } + } + + &:selected { + -fx-background-color: -color-bg-inset; + + >.tab-container { + >.tab-label { + -fx-text-fill: -color-fg-default; + -fx-underline: true; + } + + >.tab-close-button { + -fx-background-color: -color-fg-default; + } + } + } + + // order matters, because JavaFX CSS doesn't support not() selector, + // 'disabled' have to be applied after 'hover' and 'selected' + &:disabled { + -fx-background-color: transparent; + } + } + } + + >.control-buttons-tab > .container { + -fx-padding: 0.25em 0 0 0; + + >.tab-down-button { + -fx-padding: 0.25em 1em 1em 0.25em; + + >.arrow { + @include icons.get("arrow-drop-down", false); + -fx-background-color: -color-fg-default; + } + } + } + } + + // TabPane.STYLE_CLASS_FLOATING + &.floating { + // NOTE: Don't use .floating with vertical tabs + // they are incompatible at the moment + >.tab-header-area { + -fx-background-insets: 0 0 0 0, 0 0 $border-width 0; + -fx-background-color: -color-border-default, -color-bg-default; + } + } +} \ No newline at end of file diff --git a/styles/src/components/_text-input.scss b/styles/src/components/_text-input.scss new file mode 100755 index 0000000..deb6d2d --- /dev/null +++ b/styles/src/components/_text-input.scss @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; + +.text-input { + -fx-background-color: -color-border-default, -color-bg-default; + -fx-background-insets: 0, cfg.$border-width; + -fx-background-radius: cfg.$border-radius; + -fx-text-fill: -color-fg-default; + + -fx-highlight-fill: -color-accent-subtle; + -fx-highlight-text-fill: -color-fg-default; + -fx-prompt-text-fill: -color-fg-subtle; + + -fx-padding: cfg.$padding-y cfg.$padding-x cfg.$padding-y cfg.$padding-x; + -fx-cursor: text; + + &:focused { + -fx-background-color: -color-accent-emphasis, -color-bg-default; + -fx-prompt-text-fill: transparent; + } + + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + + // prevent opacity being applied twice + &>.scroll-pane { + -fx-opacity: 1.0; + } + } + + &:success { + -fx-background-color: -color-success-emphasis, -color-bg-default; + -fx-text-fill: -color-success-fg; + } + + &:danger { + -fx-background-color: -color-danger-emphasis, -color-bg-default; + -fx-text-fill: -color-danger-fg; + } + + // input group + &.left-pill { + -fx-background-radius: cfg.$border-radius 0 0 cfg.$border-radius; + -fx-background-insets: 0, cfg.$border-width 0 cfg.$border-width cfg.$border-width; + + &:focused { + -fx-background-insets: 0, cfg.$border-width; + } + } + + &.center-pill { + -fx-background-radius: 0; + -fx-background-insets: 0, cfg.$border-width 0 cfg.$border-width 0; + + &:focused { + -fx-background-insets: 0, cfg.$border-width; + } + } + + &.right-pill { + -fx-background-radius: 0 cfg.$border-radius cfg.$border-radius 0; + -fx-background-insets: 0, cfg.$border-width cfg.$border-width cfg.$border-width 0; + + &:focused { + -fx-background-insets: 0, cfg.$border-width; + } + } +} + +.text-area { + // scroll pane offset to avoid overlapping input borders + -fx-padding: 2px; + -fx-cursor: default; + + .content { + -fx-cursor: text; + -fx-padding: cfg.$padding-y cfg.$padding-x cfg.$padding-y cfg.$padding-x; + } +} + +.password-field { + -fx-text-fill: -color-fg-muted; +} \ No newline at end of file diff --git a/styles/src/components/_titled-pane.scss b/styles/src/components/_titled-pane.scss new file mode 100755 index 0000000..c78183e --- /dev/null +++ b/styles/src/components/_titled-pane.scss @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config"as cfg; +@use "../settings/effects"; +@use "../settings/icons"; + +$padding-x: 20px !default; +$padding-y: 10px !default; + +$margin-arrow: 10px !default; +$margin-content: 20px !default; + +$elevation-color: -color-border-subtle !default; +$elevation-interactive: map-get(cfg.$elevation, 2) !default; + +.titled-pane { + -fx-background-color: -color-bg-default; + -fx-text-fill: -color-fg-default; + -fx-effect: none; + + @each $level, + $radius in cfg.$elevation { + &.elevated-#{$level} { + @include effects.elevate($elevation-color, $radius); + } + } + + >.title { + -fx-background-color: -color-border-default, -color-bg-default; + -fx-padding: $padding-y $padding-x $padding-y $padding-x; + + >.text { + -fx-font-size: cfg.$font-title-4; + } + + >.arrow-button { + -fx-background-color: none; + -fx-background-insets: 0; + -fx-background-radius: 0; + -fx-padding: 0 $margin-arrow 0 0; // distance between icon and text + + >.arrow { + @include icons.get("expand-more", false); + -fx-background-color: -color-fg-default; + -fx-padding: 4px 5px 4px 5px; + } + } + } + + >.content { + -fx-border-color: -color-border-default; + -fx-border-width: 0 cfg.$border-width cfg.$border-width cfg.$border-width; + -fx-border-radius: 0 0 cfg.$border-radius cfg.$border-radius; + -fx-background-radius: 0 0 cfg.$border-radius cfg.$border-radius; + + -fx-background-color: -color-bg-default; + -fx-padding: $margin-content $padding-x $padding-y $padding-x; + -fx-alignment: TOP_LEFT; + } + + // if TitledPane is disabled, its elevation should also be removed, + // othserwise background color will be different due -fxopacity and + // -fx-effect applied at the same time + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + } + + // When titled pane is animated and being collapsed you may notice that bottom + // pane border appears slightly before than animation has completed. Sadly, we can't + // draw a border around the whole titled pane (best option), because it will lead to + // accordion height calc problem. Instead we have to draw the borders around the '.title' + // and '.content' and then remove one of those adjacent borders. + &:expanded { + >.title { + -fx-background-radius: cfg.$border-radius cfg.$border-radius 0 0; + -fx-background-insets: 0, cfg.$border-width cfg.$border-width 0 cfg.$border-width; + } + } + + &:collapsed { + >.title { + -fx-background-insets: 0, cfg.$border-width; + -fx-background-radius: cfg.$border-radius; + } + } + + &.interactive:hover { + @include effects.elevate($elevation-color, $elevation-interactive); + } + + &:show-mnemonics>.mnemonic-underline { + -fx-stroke: -color-fg-default; + } +} \ No newline at end of file diff --git a/styles/src/components/_toggle-button.scss b/styles/src/components/_toggle-button.scss new file mode 100644 index 0000000..25525aa --- /dev/null +++ b/styles/src/components/_toggle-button.scss @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config"as cfg; +@use "button"; + +.toggle-button { + @include button.base(); + + -color-button-bg-selected: -color-accent-emphasis; + -color-button-fg-selected: -color-fg-emphasis; + -color-button-border-focused: -color-border-default; + + -fx-padding: cfg.$padding-y cfg.$padding-x cfg.$padding-y cfg.$padding-x; + + &:selected, + &:selected:focused { + -fx-background-color: -color-button-bg-selected; + -fx-text-fill: -color-button-fg-selected; + -fx-background-insets: 0; + + #{cfg.$font-icon-selector} { + -fx-fill: -color-button-fg-selected; + -fx-icon-color: -color-button-fg-selected; + } + } + + &:show-mnemonics:selected { + >.mnemonic-underline { + -fx-stroke: -color-button-fg-selected; + } + } + + &:selected.left-pill:focused { + -fx-background-insets: 0, cfg.$border-width; + } + + &:selected.center-pill:focused { + -fx-background-insets: 0, cfg.$border-width; + } + + &:selected.right-pill:focused { + -fx-background-insets: 0, cfg.$border-width; + } +} \ No newline at end of file diff --git a/styles/src/components/_toggle-switch.scss b/styles/src/components/_toggle-switch.scss new file mode 100644 index 0000000..e4352a1 --- /dev/null +++ b/styles/src/components/_toggle-switch.scss @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; + +.toggle-switch { + -fx-thumb-move-animation-time: 200; + + >.label-container { + >.label { + -fx-font-size: 1em; + -fx-text-fill: -color-fg-default; + -fx-padding: cfg.$checkbox-label-padding cfg.$graphic-gap cfg.$checkbox-label-padding 0; + } + } + + >.thumb { + -fx-background-color:-color-border-default, -color-fg-emphasis; + -fx-background-insets: 0, cfg.$border-width; + -fx-background-radius: 10em; // make sure this remains circular + -fx-padding: 0.7em; + -fx-alignment: CENTER; + -fx-content-display: LEFT; + -fx-opacity: 0.8; + } + + >.thumb-area { + -fx-background-radius: 1em; + -fx-background-color: -color-border-default, -color-bg-inset; + -fx-background-insets: 0, cfg.$border-width; + -fx-padding: 0.8em 1.5em 0.8em 1.5em; + } + + &:selected { + >.thumb { + -fx-opacity: 1; + } + + >.thumb-area { + -fx-background-color: -color-accent-emphasis; + -fx-background-insets: 0; + } + } + + &:disabled { + -fx-opacity: cfg.$opacity-disabled; + } +} \ No newline at end of file diff --git a/styles/src/components/_toolbar.scss b/styles/src/components/_toolbar.scss new file mode 100755 index 0000000..f9b76be --- /dev/null +++ b/styles/src/components/_toolbar.scss @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/icons"; +@use "../settings/utils"; + +$color-bg: -color-bg-subtle !default; +$color-bg-pressed: utils.saturate($color-bg, cfg.$darkMode, cfg.$color-delta-active) !default; + +$padding-x: cfg.$padding-x !default; +$padding-y: 4px !default; +$spacing: 4px !default; +$border-width: cfg.$border-width !default; + +.tool-bar { + -fx-background-color: -color-border-muted, $color-bg; + -fx-background-insets: 0, 0 0 $border-width 0; + -fx-padding: $padding-y $padding-x $padding-y $padding-x; + -fx-spacing: $spacing; + -fx-alignment: CENTER_LEFT; + + >.container { + + >.button, + >.menu-button, + >.split-menu-button { + -color-button-bg: $color-bg; + -fx-background-insets: 0; + } + + .toggle-button { + -color-button-bg: $color-bg; + -color-button-bg-selected: $color-bg-pressed; + -color-button-fg-selected: -color-fg-default; + -fx-background-insets: 0; + } + + >.separator { + -fx-orientation: vertical; + } + } + + >.tool-bar-overflow-button { + -fx-padding: 0 $padding-x 0 $spacing; + + >.arrow { + @include icons.get("arrow-double-right", false); + -fx-background-color: -color-fg-default; + } + } + + &:vertical { + -fx-background-insets: 0, 0 $border-width 0 0; + -fx-padding: $padding-x $padding-y $padding-x $padding-y; + -fx-alignment: TOP_LEFT; + + >.container { + >.separator { + -fx-orientation: horizontal; + } + } + + >.tool-bar-overflow-button { + -fx-padding: $spacing 0 $padding-x 0; + } + + // this rule existed in modena.css, but JavaFX doesn't apply it automatically, + // you supposed to add it manually. + &.right { + -fx-background-insets: 0, 0 0 0 $border-width; + } + } + + // this rule existed in modena.css, but JavaFX doesn't apply it automatically, + // you supposed to add it manually. + &.bottom { + -fx-background-insets: 0, $border-width 0 0 0; + } +} \ No newline at end of file diff --git a/styles/src/components/_tooltip.scss b/styles/src/components/_tooltip.scss new file mode 100755 index 0000000..c56b6e3 --- /dev/null +++ b/styles/src/components/_tooltip.scss @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/effects"; + +$color-bg: -color-neutral-emphasis-plus !default; +$color-fg: -color-fg-emphasis !default; +$color-shadow: -color-bg-inset !default; +$opacity: 0.85 !default; + +$padding-x: cfg.$padding-x !default; +$padding-y: cfg.$padding-y !default; + +.tooltip { + -fx-background-color: $color-bg; + -fx-background-insets: 0; + -fx-text-fill: $color-fg; + -fx-background-radius: cfg.$border-radius; + -fx-padding: $padding-y $padding-x $padding-y $padding-x; + -fx-opacity: $opacity; + @include effects.shadow(-color-bg-inset, 8); +} \ No newline at end of file diff --git a/styles/src/general/_index.scss b/styles/src/general/_index.scss new file mode 100644 index 0000000..bc82653 --- /dev/null +++ b/styles/src/general/_index.scss @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: MIT + +@forward "root"; +@forward "text"; \ No newline at end of file diff --git a/styles/src/general/_root.scss b/styles/src/general/_root.scss new file mode 100755 index 0000000..cddb7da --- /dev/null +++ b/styles/src/general/_root.scss @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config" as cfg; +@use "../settings/palette" as palette; + +.root { + + -color-fg-default: palette.$fg-default; + -color-fg-muted: palette.$fg-muted; + -color-fg-subtle: palette.$fg-subtle; + -color-fg-emphasis: palette.$fg-onEmphasis; + + -color-bg-default: palette.$canvas-default; + -color-bg-subtle: palette.$canvas-subtle; + -color-bg-inset: palette.$canvas-inset; + + -color-border-default: palette.$border-default; + -color-border-muted: palette.$border-muted; + -color-border-subtle: palette.$border-subtle; + + -color-neutral-emphasis-plus: palette.$neutral-emphasisPlus; + -color-neutral-emphasis: palette.$neutral-emphasis; + -color-neutral-muted: palette.$neutral-muted; + -color-neutral-subtle: palette.$neutral-subtle; + + -color-accent-fg: palette.$accent-fg; + -color-accent-emphasis: palette.$accent-emphasis; + -color-accent-muted: palette.$accent-muted; + -color-accent-subtle: palette.$accent-subtle; + + -color-warning-fg: palette.$warning-fg; + -color-warning-emphasis: palette.$warning-emphasis; + -color-warning-muted: palette.$warning-muted; + -color-warning-subtle: palette.$warning-subtle; + + -color-success-fg: palette.$success-fg; + -color-success-emphasis: palette.$success-emphasis; + -color-success-muted: palette.$success-muted; + -color-success-subtle: palette.$success-subtle; + + -color-danger-fg: palette.$danger-fg; + -color-danger-emphasis: palette.$danger-emphasis; + -color-danger-muted: palette.$danger-muted; + -color-danger-subtle: palette.$danger-subtle; + + -color-chart-1: palette.$chart-1; + -color-chart-2: palette.$chart-2; + -color-chart-3: palette.$chart-3; + -color-chart-4: palette.$chart-4; + -color-chart-5: palette.$chart-5; + -color-chart-6: palette.$chart-6; + -color-chart-7: palette.$chart-7; + -color-chart-8: palette.$chart-8; + + -color-chart-1-alpha70: palette.$chart-1-alpha70; + -color-chart-2-alpha70: palette.$chart-2-alpha70; + -color-chart-3-alpha70: palette.$chart-3-alpha70; + -color-chart-4-alpha70: palette.$chart-4-alpha70; + -color-chart-5-alpha70: palette.$chart-5-alpha70; + -color-chart-6-alpha70: palette.$chart-6-alpha70; + -color-chart-7-alpha70: palette.$chart-7-alpha70; + -color-chart-8-alpha70: palette.$chart-8-alpha70; + + -color-chart-1-alpha20: palette.$chart-1-alpha20; + -color-chart-2-alpha20: palette.$chart-2-alpha20; + -color-chart-3-alpha20: palette.$chart-3-alpha20; + -color-chart-4-alpha20: palette.$chart-4-alpha20; + -color-chart-5-alpha20: palette.$chart-5-alpha20; + -color-chart-6-alpha20: palette.$chart-6-alpha20; + -color-chart-7-alpha20: palette.$chart-7-alpha20; + -color-chart-8-alpha20: palette.$chart-8-alpha20; + + // default props inherited by all nodes + -fx-background-color: -color-bg-default; + -fx-font-family: "Inter"; + -fx-font-size: cfg.$font-default; + + // these are needed for Popup + -fx-background-radius: inherit; + -fx-background-insets: inherit; + -fx-padding: inherit; + + // make popups transparent + &.popup { + -fx-background-color: transparent; + } +} + +// font icons +.ikonli-font-icon { + -fx-icon-color: -color-fg-default; + -fx-icon-size: cfg.$icon-size; +} + +// Hide mnemonic stroke by default. It can only appear when user holds +// Meta button, which adds ":show-mnemonics" pseudo-class to each control +// that set mnemonicParsing = true. +.mnemonic-underline { + -fx-stroke: transparent; +} \ No newline at end of file diff --git a/styles/src/general/_text.scss b/styles/src/general/_text.scss new file mode 100755 index 0000000..ba44a21 --- /dev/null +++ b/styles/src/general/_text.scss @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: MIT + +@use "../settings/config"as cfg; + +// text nodes +.text { + // enable LCD text rendering + -fx-font-smoothing-type: lcd; + + // adjust text alignment within the bounds of text nodes, + // so that the text is always vertically centered within the bounds + -fx-bounds-type: logical_vertical_center; +} + +// default text color +Text { + -fx-fill: -color-fg-default; +} + +// font size +.title-1 { + -fx-font-size: cfg.$font-title-1; + -fx-font-weight: bolder; +} +.title-2 { + -fx-font-size: cfg.$font-title-2; + -fx-font-weight: bolder; +} +.title-3 { + -fx-font-size: cfg.$font-title-3; + -fx-font-weight: bolder; +} +.title-4 { + -fx-font-size: cfg.$font-title-4; + -fx-font-weight: normal; +} +.text-caption { + -fx-font-size: 1em; + -fx-font-weight: bold; +} +.text-small { + -fx-font-size: cfg.$font-small; +} + +// text color +.text.accent { + -fx-fill: -color-accent-fg; +} +.label.accent { + -fx-text-fill: -color-accent-fg; +} +.text.success { + -fx-fill: -color-success-fg; +} +.label.success { + -fx-text-fill: -color-success-fg; +} +.text.warning { + -fx-fill: -color-warning-fg; +} +.label.warning { + -fx-text-fill: -color-warning-fg; +} +.text.danger { + -fx-fill: -color-danger-fg; +} +.label.danger { + -fx-text-fill: -color-danger-fg; +} + +// font weight +// JavaFX CSS parser recognizes all values, but JavaFX engine +// only supports normal and bold. +.text-bold { + -fx-font-weight: bold; +} +.text-bolder { + -fx-font-weight: bolder; +} +.text-normal { + -fx-font-weight: normal; +} +.text-lighter { + -fx-font-weight: lighter; +} + +// font style +.text-italic { + -fx-font-style: italic; +} +.text-oblique { + -fx-font-style: oblique; +} +// only applied to javafx.scene.Text +.text-underlined { + -fx-underline: true; +} +.text-strikethrough { + -fx-strikethrough: true; +} diff --git a/styles/src/primer-dark.scss b/styles/src/primer-dark.scss new file mode 100755 index 0000000..c1204bf --- /dev/null +++ b/styles/src/primer-dark.scss @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: MIT + +@forward "settings/palette" with ( + + $fg-default: #c9d1d9, + $fg-muted: #8b949e, + $fg-subtle: #6e7681, + $fg-onEmphasis: #ffffff, + + $canvas-default: #0d1117, + $canvas-overlay: #161b22, + $canvas-inset: #010409, + $canvas-subtle: #161b22, + + $border-default: #30363d, + $border-muted: #21262d, + $border-subtle: rgba(240, 246, 252, 0.1), + + $neutral-emphasisPlus: #6e7681, + $neutral-emphasis: #6e7681, + $neutral-muted: rgba(110, 118, 129, 0.4), + $neutral-subtle: rgba(110, 118, 129, 0.1), + + $accent-fg: #58a6ff, + $accent-emphasis: #1f6feb, + $accent-muted: rgba(56, 139, 253, 0.4), + $accent-subtle: rgba(56, 139, 253, 0.15), + + $success-fg: #3fb950, + $success-emphasis: #238636, + $success-muted: rgba(46, 160, 67, 0.4), + $success-subtle: rgba(46, 160, 67, 0.15), + + $warning-fg: #d29922, + $warning-emphasis: #9e6a03, + $warning-muted: rgba(187, 128, 9, 0.4), + $warning-subtle: rgba(187, 128, 9, 0.15), + + $danger-fg: #f85149, + $danger-emphasis: #da3633, + $danger-muted: rgba(248, 81, 73, 0.4), + $danger-subtle: rgba(248, 81, 73, 0.15) +); + +@forward "settings/config" with ( + $darkMode: true, + $color-delta-hover: 15%, + $color-delta-active: 20% +); + +@forward "components/titled-pane" as titled-pane-* with ( + $elevation-color: -color-bg-inset +); + +@forward "components/tooltip" as tooltip-* with ( + $color-bg: -color-bg-inset, + $color-fg: -color-fg-default +); + +@use "general"; +@use "components"; diff --git a/styles/src/primer-light.scss b/styles/src/primer-light.scss new file mode 100755 index 0000000..2fecc3b --- /dev/null +++ b/styles/src/primer-light.scss @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: MIT + +// Any module variable can be customized at compile time. +// Note that SASS is only loading any module just once so customization order does matter. +// E.g. if A module uses B and B uses C then we should override C variables first, then B, +// then A. Otherwise there will be an exception that we are attempting to change a variable +// in a module that has been already loaded. +// +// Color customization. +// @forward "settings/palette" with ( +// ... +// ); +// +// Shared property customization. +// @forward "settings/config" with ( +// ... +// ); +// +// Individual component property customization. +// @forward "components/split-pane" with ( +// ... +// ); + +@use "general"; +@use "components"; \ No newline at end of file diff --git a/styles/src/settings/_config.scss b/styles/src/settings/_config.scss new file mode 100644 index 0000000..9649826 --- /dev/null +++ b/styles/src/settings/_config.scss @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT + +$darkMode: false !default; +$color-delta-hover: 5% !default; +$color-delta-active: 10% !default; + +$font-default: 14px !default; // ~= 11pt +$font-family-serif: serif !default; +$font-family-sans-serif: sans-serif !default; +$font-family-monospace: monospace !default; +$font-title-1: 2em !default; +$font-title-2: 1.75em !default; +$font-title-3: 1.5em !default; +$font-title-4: 1.25em !default; +$font-small: 0.8em !default; + +$padding-x: 12px !default; +$padding-y: 8px !default; +$graphic-gap: 6px !default; + +// Most components use background insets to draw its borders due to +// performance reasons. On border radius > 2px corners may look rather ugly. +// They're thicker than border width and sometimes a bit blurry. +$border-width: 1px !default; +$border-radius: 4px !default; + +$opacity-disabled: 0.4 !default; + +// javafx-controls doesn't have iconic fonts support, +// this is just a variable that is used across the theme to style font icons +$font-icon-selector: ".font-icon, .ikonli-font-icon"; +$font-icon-selector-immediate: ">.font-icon, >.ikonli-font-icon"; + +// Ikonli doesn't support 'em' +$icon-size: 18px !default; + +// elevation (level : radius) +$elevation: (1: 2px, 2: 8px, 3: 16px, 4: 20px) !default; + +// check box, radio button +$checkbox-mark-size: 0.75em !default; +$checkbox-mark-padding-y: 3px !default; +$checkbox-mark-padding-x: 4px !default; +$checkbox-label-padding: 2px !default; + +// menu +$popup-padding-x: 2px !default; +$popup-padding-y: 2px !default; +$popup-shadow: 2px !default; +$menu-padding-x: $padding-x !default; +$menu-padding-y: $padding-y !default; + +// separators +$separators: ("small": 0.25em, "medium": 0.75em, "large": 1.5em) !default; + +// scroll bars +$scrollbar-color-track: -color-border-subtle !default; +$scrollbar-color-thumb: -color-fg-muted !default; +$scrollbar-opacity-inactive: 0.5 !default; +$scrollbar-opacity-disabled: 0.25 !default; \ No newline at end of file diff --git a/styles/src/settings/_effects.scss b/styles/src/settings/_effects.scss new file mode 100644 index 0000000..3359a48 --- /dev/null +++ b/styles/src/settings/_effects.scss @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT + +// Adds shadow effect to popup menus. +@mixin shadow($color, $radius) { + -fx-effect: unquote("dropshadow(gaussian, #{$color}, #{$radius}, 0.75, 0, 0)"); +} + +// Adds elevation effect to boxes. +@mixin elevate($color, $radius) { + -fx-effect: unquote("dropshadow(three-pass-box, #{$color}, #{$radius}, 0.5, 2, 2)"); +} + +// Adds hover (or active) effect to icons. +@mixin highlight($color, $radius) { + -fx-effect: unquote("dropshadow(two-pass-box, #{$color}, #{$radius}, 0.125em, 0, 0)"); +} \ No newline at end of file diff --git a/styles/src/settings/_icons.scss b/styles/src/settings/_icons.scss new file mode 100644 index 0000000..0f6e2fd --- /dev/null +++ b/styles/src/settings/_icons.scss @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT + +$material-icons: ( + "arrow-double-right": "M5.06 5 4 6.06 7.94 10 4 13.94 5.06 15l5-5z M11 5 9.94 6.06 13.88 10l-3.94 3.94L11 15l5-5z", + "arrow-drop-down": "M7 10l5 5 5-5z", + "arrow-drop-up": "M7 14l5-5 5 5z", + "arrow-left": "M14 7l-5 5 5 5V7z", + "arrow-right": "M10 17l5-5-5-5v10z", + "calendar": "M20 3h-1V1h-2v2H7V1H5v2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 18H4V10h16v11zm0-13H4V5h16v3z", + "check": "M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z", + "chevron-left": "M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z", + "chevron-right": "M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z", + "expand-less": "M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z", + "expand-more": "M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z", + "minus": "M 17,13 H 7 v -2 h 10 z", + "more-vert": "M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z", + "plus": "M 18,12.857142 H 12.857142 V 18 H 11.142858 V 12.857142 H 6 v -1.714284 h 5.142858 V 6 h 1.714284 v 5.142858 H 18 Z", +); + +@mixin get($id, $scale: true) { + $shape: map-get($material-icons, $id); + @if $shape== null { @error "Unknown icon ID = #{$id}."; } + + -fx-shape: $shape; + -fx-scale-shape: $scale; +} \ No newline at end of file diff --git a/styles/src/settings/_palette.scss b/styles/src/settings/_palette.scss new file mode 100644 index 0000000..f3f89d8 --- /dev/null +++ b/styles/src/settings/_palette.scss @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT + +@use "sass:color"; + +// Muted color is used to emulate semi-transparent background +// (see data.scss, RGBA color). + +$fg-default: #24292f !default; +$fg-muted: #57606a !default; +$fg-subtle: #6e7781 !default; +$fg-onEmphasis: #ffffff !default; + +$canvas-default: #ffffff !default; +$canvas-overlay: #ffffff !default; +$canvas-inset: #f6f8fa !default; +$canvas-subtle: #f6f8fa !default; + +$border-default: #d0d7de !default; +$border-muted: hsla(210, 18%, 87%, 1) !default; +$border-subtle: rgba(27, 31, 36, 0.15) !default; + +$neutral-emphasisPlus: #24292f !default; +$neutral-emphasis: #6e7781 !default; +$neutral-muted: rgba(175, 184, 193, 0.2) !default; +$neutral-subtle: rgba(234, 238, 242, 0.5) !default; + +$accent-fg: #0969da !default; +$accent-emphasis: #0969da !default; +$accent-muted: rgba(84, 174, 255, 0.4) !default; +$accent-subtle: #ddf4ff !default; + +$success-fg: #1a7f37 !default; +$success-emphasis: #2da44e !default; +$success-muted: rgba(74, 194, 107, 0.4) !default; +$success-subtle: #dafbe1 !default; + +$warning-fg: #9a6700 !default; +$warning-emphasis: #bf8700 !default; +$warning-muted: rgba(212, 167, 44, 0.4) !default; +$warning-subtle: #fff8c5 !default; + +$danger-fg: #cf222e !default; +$danger-emphasis: #cf222e !default; +$danger-muted: rgba(255, 129, 130, 0.4) !default; +$danger-subtle: #FFEBE9 !default; + +$chart-1: #f3622d !default; +$chart-2: #fba71b !default; +$chart-3: #57b757 !default; +$chart-4: #41a9c9 !default; +$chart-5: #4258c9 !default; +$chart-6: #9a42c8 !default; +$chart-7: #c84164 !default; +$chart-8: #888888 !default; + +$chart-1-alpha70: color.change($chart-1, $alpha: 0.7) !default; +$chart-2-alpha70: color.change($chart-2, $alpha: 0.7) !default; +$chart-3-alpha70: color.change($chart-3, $alpha: 0.7) !default; +$chart-4-alpha70: color.change($chart-4, $alpha: 0.7) !default; +$chart-5-alpha70: color.change($chart-5, $alpha: 0.7) !default; +$chart-6-alpha70: color.change($chart-6, $alpha: 0.7) !default; +$chart-7-alpha70: color.change($chart-7, $alpha: 0.7) !default; +$chart-8-alpha70: color.change($chart-8, $alpha: 0.7) !default; + +$chart-1-alpha20: color.change($chart-1, $alpha: 0.2) !default; +$chart-2-alpha20: color.change($chart-2, $alpha: 0.2) !default; +$chart-3-alpha20: color.change($chart-3, $alpha: 0.2) !default; +$chart-4-alpha20: color.change($chart-4, $alpha: 0.2) !default; +$chart-5-alpha20: color.change($chart-5, $alpha: 0.2) !default; +$chart-6-alpha20: color.change($chart-6, $alpha: 0.2) !default; +$chart-7-alpha20: color.change($chart-7, $alpha: 0.2) !default; +$chart-8-alpha20: color.change($chart-8, $alpha: 0.2) !default; \ No newline at end of file diff --git a/styles/src/settings/_utils.scss b/styles/src/settings/_utils.scss new file mode 100644 index 0000000..ce8761b --- /dev/null +++ b/styles/src/settings/_utils.scss @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: MIT + +@use "sass:math"; + +// Darkens or lightens specified color depending on the color scheme. +@function saturate($color, $darkMode, $amount) { + @if $darkMode == true { @return darken($color, $darkMode, $amount); } + @return darken($color, $darkMode, $amount); +} + +@function darken($color, $darkMode, $amount) { + @if $darkMode == true { @return unquote("derive(#{$color}, #{$amount})"); } + @return unquote("derive(#{$color}, -#{$amount})"); +} + +@function lighten($color, $darkMode, $amount) { + @if $darkMode == true { @return unquote("derive(#{$color}, -#{$amount})"); } + @return unquote("derive(#{$color}, #{$amount})"); +} + +// Removes the unit of a length. +@function strip($value) { + @if type-of($value) !="number" { + @error "Invalid `#{type-of($value)}` type. Choose a number type instead."; + } + + @else if type-of($value)=="number"and not math.is-unitless($value) { + @return math.div($value, ($value * 0 + 1)); + } + + @return $value; +} + +// Converts px to em. +@function em($pixels, $font-size: 14px) { + @if (unitless($pixels)) { $pixels: $pixels * 1px; } + @if (unitless($font-size)) { $font-size: $font-size * 1px; } + + @return math.div($pixels, $font-size) * 1em; +}

y^cqH`&{XDU*oHlEHu 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 literal 0 HcmV?d00001 diff --git a/sampler/src/main/resources/assets/fonts/Inter/InterUI-Medium.otf b/sampler/src/main/resources/assets/fonts/Inter/InterUI-Medium.otf new file mode 100755 index 0000000000000000000000000000000000000000..c5075cad99d07d10380b311107415fa37eb492d9 GIT binary patch literal 223740 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�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 z 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